2015-04-27 19 views
3

的命令是:爲什麼HBase的計數動作這麼慢

count 'tableName'. 

這是非常緩慢的,以獲得整個表的總行數。

我的情況是:

  • 我有一個主機和兩個奴隸,有16個CPU和16G內存的每個節點。

  • 我的表只有一列家族和兩列:標題和內容。

  • 標題列最多有100B字節,內容可能有5M字節。

  • 現在表格有1550行,每當我計算行號時,大約需要2分鐘。

我很好奇爲什麼hbase在這個操作上這麼慢,我猜它甚至比mysql慢。 Cassandra在這些操作上比Hbase快嗎?

回答

4

首先,您的數據量非常少。如果你有這樣的數量,那麼使用NoSql的IMO將不會爲你提供任何優勢。 你的測試不適合判斷HBase和Cassandra的性能。兩者都有自己的用例和甜蜜點。

hbase上的count命令運行一個單線程java程序來做記錄的行數。不過,我感到驚訝的是,它花了2分鐘來計算1550行。 如果您希望以更快的方式進行計數(對於更大的數據集),那麼您應該運行HBase Row_Counter的MapReduce作業。
運行MapReduce工作通過運行這個:

斌/ HBase的org.apache.hadoop.hbase.mapreduce.RowCounter

+0

非常感謝你Anil,還有一個問題請問,當RowCounter運行Map/Reduce時,是Map/Reduce Api直接查詢HDFS文件還是查詢RegionServers?謝謝傑克 – Jack

+0

不,它不直接讀HDFS。 RowCounter MapReduce作業使用HBase的Java API讀取HBase表的數據。 –

+0

但是爲什麼我在這個類的源代碼中找不到任何HConnection的蹤跡,如果它直接與Hbase交談,並且看看密鑰類型是ImmutableBytesWritable,這是非常好的hadoop風格。但我可以想象,如果它與RegionServer連接,它將佔用Hbase緩存層的優勢。但是如果直接連接HDFS可以減少帶寬開銷。你覺得怎麼樣,非常感謝! – Jack

1

首先,請提醒,利用數據局部性的,你的「奴隸」(更好的稱爲RegionServers)也必須具有DataNode角色,但不這樣做是性能殺手。

適當的性能原因HBase不會保留行的活動計數器。要執行計數,HBase shell客戶端需要檢索所有數據,這意味着如果您的平均行有5M數據,則客戶端將從區域服務器檢索5M * 1550以進行計數,這很重要。

加快步伐,你有兩個選擇:

  • 如果你需要實時反應可以維持行利用HBase的原子計數器的自己活櫃檯:每次插入您的時間,增加櫃檯,每次你刪除你的計數器遞減。它甚至可以在同一張表中,只需使用另一個列族來存儲它。

  • 如果您不需要實時運行分佈式行計數器的map-reduce作業(source code)強制掃描,只需使用可避免讀取大行最小列族&列,每個RegionServer的會讀取本地存儲的數據並且不需要網絡I/O。在這種情況下,如果你還沒有一個新的列(如果你還沒有一個布爾值是最好的選擇),你可能需要在行中添加一個新的列。

+0

非常感謝Ruben,你的回答非常有幫助!我希望StackOverflow可以提供多個答案選擇,因此,我會選擇你的答案以及:) - 傑克 – Jack