全部产品
云市场

索引重建

更新时间:2019-01-23 11:33:09

HBase for Solr索引重建

EMR实例准备

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

  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-hb1.x.jar
    jar包md5值为:800162f9d7508ee6f87e238d78ddd7ba
    使用的是HBase2.x版本实例时,使用如下:
    wget http://public-hbase.oss-cn-hangzhou.aliyuncs.com/installpackage/hbase-indexer-mr-2.0-job-for-hb2.x.jar
    jar包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,添加如下:
    1. <property>
    2. <name>dfs.nameservices</name>
    3. <value>hbase-cluster</value>
    4. </property>
    5. <property>
    6. <name>dfs.client.failover.proxy.provider.hbase-cluster</name>
    7. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    8. </property>
    9. <property>
    10. <name>dfs.ha.automatic-failover.enabled.hbase-cluster</name>
    11. <value>true</value>
    12. </property>
    13. <property>
    14. <name>dfs.ha.namenodes.hbase-cluster</name>
    15. <value>nn1,nn2</value>
    16. </property>
    17. <property>
    18. <name>dfs.namenode.rpc-address.hbase-cluster.nn1</name>
    19. <value>master1-1:8020</value>
    20. </property>
    21. <property>
    22. <name>dfs.namenode.rpc-address.hbase-cluster.nn2</name>
    23. <value>master2-1:8020</value>
    24. </property>
    咨询“云HBase答疑” master1-1、master2-1的hostname是什么,替换上述那么master1-1、master2-1。
  3. 添加custom_conf/hbase-site.xml文件,文件中添加属性如下:
    1. <?xml version="1.0"?>
    2. <configuration>
    3. <property>
    4. <name>hbase.zookeeper.quorum</name>
    5. <value>zk1,zk2,zk3</value>
    6. </property>
    7. </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目录。

运行作业

最后,运行如下命令启动重建索引作业:

  1. hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
  2. --zk-host zk1,zk2,zk3/solr \
  3. --collection collection001 \
  4. --reducers 0 \
  5. --hbase-indexer-zk=zk1,zk2,zk3 \
  6. --hbase-table-name testtable \
  7. --hbase-indexer-name testtable_index01

如果需要传入更多HBase 过滤参数,完整如下:

  1. hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
  2. --zk-host zk1,zk2,zk3/solr \
  3. --collection collection001 \
  4. --reducers 0 \
  5. --hbase-indexer-zk=zk1,zk2,zk3 \
  6. --hbase-table-name test:index001 \
  7. --hbase-indexer-name myindex002 \
  8. --hbase-start-row startRow \
  9. --hbase-end-row endRow \
  10. --hbase-timestamp-format yyyy-MM-dd'T'HH:mm:ss.SSSZ \
  11. --hbase-start-time startTime \
  12. --hbase-end-time endTime \
  13. --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值。

案例如下:

  1. hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
  2. --zk-host zk1,zk2,zk3/solr \
  3. --collection collection001 \
  4. --reducers 0 \
  5. --hbase-indexer-zk=zk1,zk2,zk3 \
  6. --hbase-table-name test:index001 \
  7. --hbase-indexer-name myindex002 \
  8. -D "mapred.child.java.opts=-Xmx2048m" \
  9. --hbase-start-row 00000000000000000000000000 \
  10. --hbase-end-row 00000000000000000000000390 \
  11. --verbose
  12. hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
  13. --zk-host zk1,zk2,zk3/solr \
  14. --collection collection001 \
  15. --reducers 0 \
  16. --hbase-indexer-zk=zk1,zk2,zk3 \
  17. --hbase-table-name test:index001 \
  18. --hbase-indexer-name myindex002 \
  19. --hbase-start-time 1530780396659 \
  20. --hbase-end-time 1531119958636 \
  21. --verbose
  22. hadoop --config custom_conf jar hbase-indexer-mr-2.0-job.jar \
  23. --zk-host zk1,zk2,zk3/solr \
  24. --collection collection001 \
  25. --reducers 0 \
  26. --hbase-indexer-zk=zk1,zk2,zk3 \
  27. --hbase-table-name test:index001 \
  28. --hbase-indexer-name myindex002 \
  29. --hbase-timestamp-format "yyyy-MM-dd'T'HH:mm:ss.SSSZ" \
  30. --hbase-start-time 2018-07-05T16:46:36.659+0800 \
  31. --hbase-end-time 2018-07-09T15:05:58.636+0800 \
  32. --verbose
  33. 或者
  34. --hbase-timestamp-format "yyyy-MM-dd'T'HH:mm:ss" \
  35. --hbase-start-time 2018-07-05T16:46:36 \
  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

  1. <property>
  2. <name>hbase.client.scanner.timeout.period</name>
  3. <value>12000</value>
  4. </property>

如果碰到mapreduce task超时最终导致作业失败时,首先检查一下是否hbase原表有个别region太大,导致一个作业运行过长导致,可以手动split对应那个region。其次,可以mapred-site.xml添加如下配置适当增加超时参数。
如异常:AttemptID:attempt_1534767970337_0010_m_000032_0 Timed out after 1800 secs

  1. <property>
  2. <name>mapreduce.task.timeout</name>
  3. <value>1800000</value>
  4. </property>