2016-05-17 69 views
1

最近,我的團隊使用CDH上的hbase-indexer將hbase表列索引到solr。當我們部署hbase-indexer服務器(稱爲Key-Value Store Indexer)並開始測試時。我們發現,該行HBase的表和Solr指數的大小的情況是不同的:hbase-indexer solr numFound不同於hbase錶行的大小

我們用鳳凰來算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

什麼是solr中的唯一ID ...?它與hbase不同...? –

+0

solr schema.xml中的唯一標識與hbase rowkey – CrazyPig

回答

3

我的理解:

HBase的行數 - Solr的行數(numfound)=丟失記錄

4084355 - 4060479 = 23876(這是在有HBase的和Solr中丟失)

Key-Value存儲索引器服務使用Lily HBase NRT索引器來索引添加到HBase表的記錄流。

NRT適用於增量數據而不是整個數據。

出於我的經驗,這些都是可能的原因:

1)NRT初步制定的,如果突然NRT不工作(由於一些健康問題),那麼有數字的差異的可能性。 2)如果在將記錄插入到HBASE(可能..出於性能原因)時關閉WAL,則NRT在WAL上工作(提前寫入日誌),NRT將不起作用。

可能的解決方案: 1)刪除Solr文件並將數據從Hbase新加載到Solr。 你可以在整個數據(批次索引增量數據不會工作,它適用於整個數據集)

2)運行作爲數據流管道的一部分HBase的批量索引,寫的map-reduce程序插入數據(在我們的實現中我們已經做了什麼)

+0

相同,也許你是對的。在你的解決方案1)中,形象化這個場景:hbase數據每天都會增加,我們需要hbase-indxer來不間斷地存儲索引。如果我們運行批量索引器來批量處理整個數據,那麼在mapreduce作業期間,可能會出現增量數據,這種數據會被hbase-indexer觀察到嗎?這可能會導致solr索引大小diff與hbase錶行的大小再次?如果屬實,這是非常可怕的! – CrazyPig

+1

嗨,RamPrasad G,最近我們發現solr的numfound與hbase行數不同的原因。只有當我們的hbase表已經創建鳳凰二級索引時纔會發生。如果沒有索引表跟隨數據表,則在導入完數據後,solr中的numfound與hbase錶行數相同。我發現這種情況使用jconsole觀看hbase-indexer指標[https://github.com/NGDATA/hbase-indexer/wiki/Metrics](https://github.com/NGDATA/hbase-indexer/wiki/Metrics)但我們不知道爲何會發生...... – CrazyPig

0

好的,我們最近解決了這個問題。

由於hbase-indexer導致solr numfound與hbase錶行數不同的原因導致刪除某行而不是插入它們的錯誤 。我們發現根據HBase的索引器度量這種情況: https://github.com/NGDATA/hbase-indexer/wiki/Metrics

我們使用JConsole的觀看JMX指標數據,結果發現:

索引中刪除數= HBase的錶行數 - Solr的numfound

最後我們調試進入hbase-indexer的源代碼,發現一些代碼會導致這個問題,也許這是一個關於hbase-indexer的問題,請參閱:https://github.com/NGDATA/hbase-indexer/issues/78