2012-01-22 94 views
10

我需要編寫一個MapReduce作業,它獲取給定日期範圍(比如最後一個月)的所有行。如果My Row Key以Date開頭,那本來就是一個Cakewalk。但我頻繁的Hbase查詢是關鍵的初始值。如何有效地掃描HBase行

My Row key is exactly A | B | C | 20120121 | D。 A/B/C和日期(以YearMonthDay格式)結合使用的唯一行ID。

我的Hbase表格可能有高達幾百萬行。我的Mapper是否應該讀取所​​有表格,並且如果每個行都落在給定的日期範圍內,可以對每行進行過濾或者掃描/過濾器可以幫助處理這種情況?

有人可能會建議(或代碼片段)以有效的方式處理這種情況?

感謝 -Panks

+0

爲什麼不把表格的內容複製到新的,重新排列鍵並廢棄舊錶格? – Mario

+0

@Mario如果桌子上有萬億個按鍵,該怎麼辦?他需要經常這樣做嗎? – markg

回答

5

您可以使用RowFilterRegexStringComparator。你需要想出一個RegEx來適當地過濾你的日期。 This page有一個示例,其中包括爲MapReduce掃描器設置過濾器。

+1

如果Rowkey方便,Get的性能最佳。如果返回的結果對於一行太大,則使用get和batchSize掃描是更好/更安全的選項。 –

0

我剛開始使用HBase的,bloom filters可能的幫助。

+1

除非他知道確切的關鍵,否則布隆過濾器不會在這裏幫助。 –

+0

謝謝克里斯 - 布隆過濾器存儲的數據摘要,而不是實際的數據,以有效地利用內存 - 所以模式匹配不應該是可能的。 –

0

您可以修改發送到映射器的掃描以包含過濾器。如果你的約會也是創紀錄的時間戳,很容易:

Scan scan = new Scan(); 
scan.setTimeRange(minTime, maxTime); 
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
    OutputKey.class, OutputValue.class, job); 

如果你的行鍵的日期是不同的,你必須過濾器添加到您的掃描。該過濾器可以在列或行鍵上操作。我認爲只用行鍵會很麻煩。如果將日期放在一列中,則可以製作一個FilterList,其中所有條件必須爲真,並使用CompareOp.GREATERCompareOp.LESS。然後使用scan.setFilter(filterList)將您的過濾器添加到掃描中。

+0

setTimeRange過濾時間戳,而不是行鍵。 –

10

具有RegEx過濾器的RowFilter可以工作,但不會是最優化的解決方案。或者,您可以嘗試使用二級索引。

另一個解決方案是嘗試FuzzyRowFIlter。 FuzzyRowFilter使用一種快進,因此在整個掃描過程中跳過許多行,因此會比RowFilter Scan更快。你可以閱讀更多關於它here

或者BloomFilters也可能會幫助您根據您的模式。如果您的數據很大,您應該對二級索引和Bloom Filters進行比較分析。