用Lily Hbase indexer 工具包同步Hbase的索引到solr出错
错误堆栈
2019-05-21 06:52:07,181 ERROR [IPC Server handler 8 on 42709] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1555666124724_2625_m_000005_1 - exited : java.lang.NullPointerException
at org.apache.zookeeper.server.DataTree.copyStat(DataTree.java:340)
at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1155)
at org.apache.solr.common.cloud.SolrZkClient$7.execute(SolrZkClient.java:352)
at org.apache.solr.common.cloud.SolrZkClient$7.execute(SolrZkClient.java:349)
at org.apache.solr.common.cloud.ZkCmdExecutor.retryOperation(ZkCmdExecutor.java:61)
at org.apache.solr.common.cloud.SolrZkClient.getData(SolrZkClient.java:349)
at org.apache.solr.common.cloud.ClusterState.load(ClusterState.java:257)
at org.apache.solr.common.cloud.ZkStateReader.createClusterStateWatchersAndUpdate(ZkStateReader.java:397)
at org.apache.solr.client.solrj.impl.CloudSolrServer.connect(CloudSolrServer.java:262)
at org.apache.solr.client.solrj.impl.CloudSolrServer.request(CloudSolrServer.java:554)
at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:124)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:68)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:54)
at com.ngdata.hbaseindexer.indexer.DirectSolrInputDocumentWriter.add(DirectSolrInputDocumentWriter.java:104)
at com.ngdata.hbaseindexer.mr.BufferedSolrInputDocumentWriter.flush(BufferedSolrInputDocumentWriter.java:111)
at com.ngdata.hbaseindexer.mr.BufferedSolrInputDocumentWriter.close(BufferedSolrInputDocumentWriter.java:123)
at com.ngdata.hbaseindexer.mr.HBaseIndexerMapper.cleanup(HBaseIndexerMapper.java:350)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:148)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apac
解决思路
从堆栈信息中可知, 是空指针异常
java.lang.NullPointerException
at org.apache.zookeeper.server.DataTree.copyStat(DataTree.java:340)
at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1155)
at
具体是哪呢? 是 Lily Hbase Indexer 工具包里面的方法空指针异常了。
从字面上看是从 zookeeper 上拿 solr 的配置信息的时候没有拿到, 返回结果为空, 所以我去 zookeeper 上找了下这个索引的配置, 发现在。
那就奇怪了, 为什么 zookeeper 上有, 但是拿不到呢?
但是我发现 solr 索引的配置文件在 zookeeper 上有太多,导致 zookeeper 数据节点数据量太大,client 端拿不到数据。
解决办法
问题已经找到, zookeeper 数据节点数据量太大。
所以现在有两个解决办法:
- 修改 zookeeper 配置,增加数据节点数据量限制。
- 删除没用 solr 索引。
因为我们索引并不多, 很多都是备份好几个月前的备份数据,所以我选择了第二种方法, 把备份数据缩短到 7 天, 把历史数据都清空了。
重新同步, 成功!