最近我的团队在CDH上使用hbase-indexer将hbase表列索引到solr。当我们部署hbase-indexer服务器(称为键值存储索引器)并开始测试时。我们发现hbase表和solr索引之间的行大小不同的情况:
我们使用Phoenix计算hbase表行:
0: jdbc:phoenix:slave1,slave2,slave3:2181> SELECT /*+ NO_INDEX */ COUNT(1) FROM C_PICRECORD;
+------------------------------------------+
| COUNT(1) |
+------------------------------------------+
| 4084355 |
+------------------------------------------+
我们使用Solr Web UI来计算solr索引大小:
numFound : 4060479
我们无法从hbase-indexer日志和solr日志中找到任何错误日志。但是hbase表和solr索引之间的行大小确实不同!有没有人遇到这种情况?我不知道该怎么做
答案 0 :(得分:4)
我的理解:
Hbase rowcount - Solr rowcount(numfound)=缺少记录
4084355 - 4060479 = 23876(在Hbase中存在且在Solr中丢失)
Key-Value Store Indexer服务使用Lily HBase NRT Indexer索引要添加到HBase表的记录流。
NRT适用于增量数据而非整数数据。
根据我的经验,这些可能是原因:
1)NRT最初工作,如果突然NRT不起作用(由于某些健康问题),那么数字可能存在差异。
2)如果在将记录插入HBASE时关闭WAL,则NRT适用于WAL(预写日志)(可能......出于性能原因),NRT无效。
可能的解决方案: 1)删除Solr文档并将数据从Hbase新加载到Solr。 您可以在整个数据上运行Hbase批处理索引器(批处理索引器不能处理增量数据,它适用于整个数据集)
2)作为数据流管道的一部分,写一个map-reduce程序将数据插入到solr中(我们在其中一个实现中做了什么)
答案 1 :(得分:0)
好的,我们最近解决了这个问题。
由于hbase-indexer导致solr numfound与hbase表行数不同的原因是错误的 删除某些行而不是插入它们。我们根据hbase-indexer指标发现了这种情况: https://github.com/NGDATA/hbase-indexer/wiki/Metrics
我们使用jconsole来观看jmx指标数据并找到:
indexer删除count = hbase表行数 - solr numfound
最后我们调试了hbase-indexer源代码并发现一些代码会导致这个问题,也许是关于hbase-indexer的问题,请参阅:https://github.com/NGDATA/hbase-indexer/issues/78