EMR rebuild solr index需要访问HBase的hdfs/solr/hbase,则需要保证EMR实例和云HBase实例满足在同一个VPC下。注意,如果没有请事先创建VPC专有网,可能会在EMR实例购买安装是没有可选的VPC。

使用前须知

全文索引功能目前已经全面升级,使用老架构的标准版全文索引服务即将下线,新用户请参见全文索引服务

HBase for Solr索引重建

EMR实例准备

  1. 购买安装EMR实例,与HBase同个可用区的实例,使用相同的 vpc id、vSwitch id。
  2. 联系“云HBase答疑”,开通EMR访问云HBase实例hdfs/solr/hbase权限。
  3. 在HBase实例控制台中设置白名单,将EMR的IP列表设置到进去。
  4. 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答疑”客服。

作业配置

  1. 在EMR机器上,拷贝 cp -r /etc/ecm/hadoop-conf-2.7.2-X.Y.Z ./custom_conf
  2. 修改custom_conf/hdfs-site.xml,添加如下:
    <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>
    咨询“云HBase答疑” master1-1、master2-1的hostname是什么,替换上述那么master1-1、master2-1。
  3. 添加custom_conf/hbase-site.xml文件,文件中添加属性如下:
    <?xml version="1.0"?>
    <configuration>
    <property>
       <name>hbase.zookeeper.quorum</name>
       <value>zk1,zk2,zk3</value>
    </property>
    </configuration>
    其中zk1,zk2,zk3即为云HBase的zookeeper链接地址
  4. 咨询“云HBase答疑”,提出开放 EMR访问某个云HBase实例需求,请求打开EMR的mapreduce访问云HBase权限通过telnet master1-1 8020初步验证是否已经打开。其中master1-1替换为具体长名字的地址,参考zk地址中的master1-001中缀的地址。

  5. 验证配置运行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>