EMR rebuild solr index需要访问HBase的hdfs/solr/hbase,则需要保证EMR实例和云HBase实例满足在同一个VPC下。注意,如果没有请事先创建VPC专有网,可能会在EMR实例购买安装是没有可选的VPC。
使用前须知
全文索引功能目前已经全面升级,使用老架构的标准版全文索引服务即将下线,新用户请参见全文索引服务。
HBase for Solr索引重建
EMR实例准备
- 购买安装EMR实例,与HBase同个可用区的实例,使用相同的 vpc id、vSwitch id。
- 联系“云HBase答疑”,开通EMR访问云HBase实例hdfs/solr/hbase权限。
- 在HBase实例控制台中设置白名单,将EMR的IP列表设置到进去。
- hbase-indexer-mr-2.0-job.jar到EMR机器上,此包下载地址如下:使用的是HBase1.x版本实例时,使用如下:wget http://public-hbase.oss-cn-hangzhou.aliyuncs.com/installpackage/hbase-indexer-mr-2.0-job-for-hb1x.jarJAR包md5值为:800162f9d7508ee6f87e238d78ddd7ba使用的是HBase2.x版本实例时,使用如下:wget http://public-hbase.oss-cn-hangzhou.aliyuncs.com/installpackage/hbase-indexer-mr-2.0-job-for-hb2x.jarJAR包md5值为:c263a9b1825c6015a7a4848d4659fba7本jar包在EMR-3.14.0 版本测试兼容,其他版本环境若运行有问题,请联系“云HBase答疑”客服。
作业配置
- 在EMR机器上,拷贝 cp -r /etc/ecm/hadoop-conf-2.7.2-X.Y.Z ./custom_conf
- 修改custom_conf/hdfs-site.xml,添加如下:
咨询“云HBase答疑” master1-1、master2-1的hostname是什么,替换上述那么master1-1、master2-1。<property> <name>dfs.nameservices</name> <value>hbase-cluster</value> </property> <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>master1-1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.hbase-cluster.nn2</name> <value>master2-1:8020</value> </property>
- 添加custom_conf/hbase-site.xml文件,文件中添加属性如下:
其中zk1,zk2,zk3即为云HBase的zookeeper链接地址<?xml version="1.0"?> <configuration> <property> <name>hbase.zookeeper.quorum</name> <value>zk1,zk2,zk3</value> </property> </configuration>
-
咨询“云HBase答疑”,提出开放 EMR访问某个云HBase实例需求,请求打开EMR的mapreduce访问云HBase权限通过telnet master1-1 8020初步验证是否已经打开。其中master1-1替换为具体长名字的地址,参考zk地址中的master1-001中缀的地址。
-
验证配置运行hadoop —config custom_conf fs -ls hdfs://hbase-cluster/查看是否可以访问阿里云HBase的 hdfs目录。
运行作业
最后,运行如下命令启动重建索引作业:
hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
--zk-host zk1,zk2,zk3/solr \
--collection collection001 \
--reducers 0 \
--hbase-indexer-zk=zk1,zk2,zk3 \
--hbase-table-name testtable \
--hbase-indexer-name testtable_index01
如果需要传入更多HBase 过滤参数,完整如下:
hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
--zk-host zk1,zk2,zk3/solr \
--collection collection001 \
--reducers 0 \
--hbase-indexer-zk=zk1,zk2,zk3 \
--hbase-table-name test:index001 \
--hbase-indexer-name myindex002 \
--hbase-start-row startRow \
--hbase-end-row endRow \
--hbase-timestamp-format yyyy-MM-dd'T'HH:mm:ss.SSSZ \
--hbase-start-time startTime \
--hbase-end-time endTime \
--verbose
注意:”hbase-start-row”、”hbase-end-row” 使用hbase包中的Bytes.toStringBinary(byte[] startRow)和Bytes.toBytesBinary(String startRow) 进行 string <=> byte[]的转换,建议你写程序得到这个start/end row的string,然后填写到上面命令中。
“hbase-timestamp-format”即为SimpleDataFormat的format string参数,对应解析startTime/endTime的string得到时间。如果不提供”hbase-timestamp-format”, 则程序直接 Long.parse(startTime/endTime) 解析得到timestamp值。
案例如下:
hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
--zk-host zk1,zk2,zk3/solr \
--collection collection001 \
--reducers 0 \
--hbase-indexer-zk=zk1,zk2,zk3 \
--hbase-table-name test:index001 \
--hbase-indexer-name myindex002 \
-D "mapred.child.java.opts=-Xmx2048m" \
--hbase-start-row 00000000000000000000000000 \
--hbase-end-row 00000000000000000000000390 \
--verbose
hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
--zk-host zk1,zk2,zk3/solr \
--collection collection001 \
--reducers 0 \
--hbase-indexer-zk=zk1,zk2,zk3 \
--hbase-table-name test:index001 \
--hbase-indexer-name myindex002 \
--hbase-start-time 1530780396659 \
--hbase-end-time 1531119958636 \
--verbose
hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
--zk-host zk1,zk2,zk3/solr \
--collection collection001 \
--reducers 0 \
--hbase-indexer-zk=zk1,zk2,zk3 \
--hbase-table-name test:index001 \
--hbase-indexer-name myindex002 \
--hbase-timestamp-format "yyyy-MM-dd'T'HH:mm:ss.SSSZ" \
--hbase-start-time 2018-07-05T16:46:36.659+0800 \
--hbase-end-time 2018-07-09T15:05:58.636+0800 \
--verbose
或者
--hbase-timestamp-format "yyyy-MM-dd'T'HH:mm:ss" \
--hbase-start-time 2018-07-05T16:46:36 \
--hbase-end-time 2018-07-09T15:05:58 \
注意,这里启动MR任务运行过程中,不要人为修改索引属性,否则过程执行可能会失败。作业超时处理
由于重建索引会对集群资源负载变大,如果作业太大hbase scan timeout时,可以适当调整timeout参数,如在hbase-site.xml添加如下:org.apache.hadoop.hbase.client.ScannerTimeoutException: 98566ms passed since the last invocation, timeout is currently set to 60000
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>12000</value>
</property>
如果碰到mapreduce task超时最终导致作业失败时,首先检查一下是否hbase原表有个别region太大,导致一个作业运行过长导致,可以手动split对应那个region。其次,可以mapred-site.xml添加如下配置适当增加超时参数。如异常:AttemptID:attempt_1534767970337_0010_m_000032_0 Timed out after 1800 secs
<property>
<name>mapreduce.task.timeout</name>
<value>1800000</value>
</property>