一, 非 HA EMR 构建二级索引
云 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 到索引表中.
二, HA EMR 构建二级索引
如果构建二级索引时 EMR 集群开启了 HA, 在使用上述步骤过程中, 可能会遇到下面的问题:
这个问题原因是由于开启 HA 的 EMR 集群 HDFS 的 nameservice 名跟云 HBase 的 HDFS 的 nameservice 名相同导致的.
解决这个问题需要联系工作人员把云 HBase 集群 HDFS 的 nameservice 改掉(以 hbase-cluster 为例), 并在 EMR 集群中把指定 hdfs-site.xml 配置修改为改动后的云 HBase 的 nameservice 名.
云 HBase 集群 HDFS 的 nameservice 修改完成后, 可以按照以下步骤操作:
在 EMR 的客户机上新建配置目录, 并将 EMR 集群的 core-site.xml,hdfs-site.xml 以及 yarn-site.xml,mapred-site.xml 拷贝到新建的配置目录.
修改 hdfs-site.xml 将 EMR 集群和云 HBase 集群的 hdfs 配置合并.
原 hdfs-site.xml 已经有 dfs.nameservices 配置项, 需要将云 HBase 的 namesercie 也添加到该配置, 实例如下:
- <property>
- <name>dfs.nameservices</name>
- <value>emr-cluster,hbase-cluster</value>
- </property>
- // emr-cluster 表示 EMR 集群的 namesercie,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, 需联系工作人员获取
配置云 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 管理控制台查看.
执行异步构建索引命令实例
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 为异步索引表
常见问题:
如果运行 bulkload 或二级索引的 mapreduce 程序一直处于卡住状态, 即 map 一直 0%, 最终失败. 异常信息如下:
解决办法: 检查 EMR 集群的子节点是否加入到云 HBase 的白名单中.
来源: https://yq.aliyun.com/articles/637934