巴客
2018-09-10
2211浏览量
云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?spm=a2c4e.11153940.blogrightarea544746.26.673e7308MxY7Lc
当Phoenix表数据量较大时,可以选择异步构建索引方式,利用MR快速同步索引数据,同时降低HBase服务端负载。
由于云HBase没有MR,需要借助外部计算引擎(自建Hadoop集群或者阿里云EMR),详细操作步骤可参考阿里云瑾谦大神的博客:https://yq.aliyun.com/articles/544746?spm=a2c4e.11153940.blogcont574090.11.28895835Lse5dN
这篇文章主要介绍在非HA的EMR环境下执行bulkload向phoenix表中批量入库,构建二级索引稍有不同,但大体上类类似,只不过将bulkload命令替换成二级索引构建命令:
yarn --config ${CONF_DIR} jar ${PHOENIX_HOME}/phoenix-${version}-client.jar org.apache.phoenix.mapreduce.index.IndexTool --data-table "TABLENAME" --index-table "INDEXNAME" --output-path "hdfs://hbase-cluster/path/"
${CONF_DIR}是需要创建的用户配置目录,用户需要把配置有云HBase zookeeper信息的hbase-site.xml和云HBase的hdfs-site.xml配置文件放在该目录下。
hbase-site.xml配置:
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1,zk2,zk3</value>
</property>
</configuration>
--data-table 是phoenix数据表的表名
--index-table是phoenix中已经创建好的索引表名
--output-path是云HBase集群hdfs的目录,要指定hdfs的nameservice,二级索引的数据本质还是利用BulkLoad生成,HFile文件存放在改目录下,然后再move到索引表中。
如果构建二级索引时EMR集群开启了HA,在使用上述步骤过程中,可能会遇到下面的问题:
这个问题原因是由于开启HA的EMR集群HDFS的nameservice名跟云HBase的HDFS的nameservice名相同导致的。
解决这个问题需要联系工作人员把云HBase集群HDFS的nameservice改掉(以hbase-cluster为例),并在EMR集群中把指定hdfs-site.xml配置修改为改动后的云HBase的nameservice名。
云HBase集群HDFS的nameservice修改完成后,可以按照以下步骤操作:
<property>
<name>dfs.nameservices</name>
<value>emr-cluster,hbase-cluster</value>
</property>
// emr-cluster表示EMR集群的nameservice,hbase-cluster表示云HBase的nameservice
然后在hdfs-site.xml配置文件添加如下云HBase的配置:
<property>
<name>dfs.client.failover.proxy.provider.hbase-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.hbase-cluster</name>
<value>true</value>
</property>
<property>
<name>dfs.ha.namenodes.hbase-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.nn1</name>
<value>{emr-header-1-host}:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.nn2</name>
<value>{emr-header-2-host}:8020</value>
</property>
//{emr-header-1-host}和{emr-header-2-host}为云HBase的主备节点的主机或IP,需联系工作人员获取
3.配置云HBase的zookeeper配置项
在第1步新建的配置目录下,增加hbase-site.xml配置
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1,zk2,zk3</value>
</property>
</configuration>
// zk1,zk2,zk3为云HBase的zookeeper配置,可在云HBase管理控制台查看。
4.执行异步构建索引命令实例
yarn --config /etc/ecm/hbase-conf/ jar /opt/alihbase-1.1.4/lib/phoenix-4.11.0-AliHBase-1.1-0.3-client.jar org.apache.phoenix.mapreduce.index.IndexTool --data-table WEB_STAT --index-table WEB_IDX --output-path hdfs://hbase-cluster/tmp/WEB_STAT/1/
/etc/ecm/hbase-conf/为第1步新建配置目录
/opt/alihbase-1.1.4/lib/phoenix-4.11.0-AliHBase-1.1-0.3-client.jar为依赖phoenix client jar包
WEB_STAT为测试原表,WEB_IDX为异步索引表
解决办法:检查EMR集群的子节点是否加入到云HBase的白名单中。
2.如果EMR运行MR任务时Reduce运行过程中备Killed,日志信息出现“container killed on request.Exit code is 143"信息,如下图:
解决办法:原因是HBase表分区过多,EMR集群在配置较低情况下配置不太合理。修改下Yarn配置:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
<description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分享数据库前沿,解构实战干货,推动数据库技术变革