HBaseの検索インデックスにデータを入力するMapReduceジョブがあります。このMapReduceジョブは、完全なデータセットに対して毎日実行されます。前回インデックスが計算された後に到着した新しいデータに対してMapReduceを実行し、HBaseの検索インデックスを適切に更新する方法はありますか?
質問する
113 次
1 に答える
0
元のデータがHBaseに保存されている場合は、行が時間でソートされるようにキーを設計できます。次に、昨日スキャンした最後の行+1として定義された開始行を使用してテーブルをスキャンできます。また、キーをその日から開始することもできます。行はキーで並べ替えられているため、目的の日の最初の行から開始して翌日に停止することが簡単にできます。
次のように行を作成する場合:
long currentTimeMS = System.currentTimeMillis();
long currentDay = currentTimeMS / (1000 * 60 * 60 * 60 * 24);
Put put = new Put(Bytes.add(Bytes.toBytes(currentDay), "some other key stuff".getBytes()));
// add columns...
hbaseTable.put(put);
次の方法で1日分のデータをスキャンできます。
long currentDay = currentTimeMS / (1000 * 60 * 60 * 60 * 24);
long yesterday = currentDay - 1;
Scan dayScan = new Scan();
dayScan.setStartRow(Bytes.toBytes(yesterday));
dayScan.setStopRow(Bytes.toBytes(currentDay));
// create map reduce job with dayScan
Joda Timeのように、時間の計算を簡単にし、コードを読みやすくするライブラリがいくつかあります。
同様の結果を得るためにscan.setTimeRange()を試すこともできます。ただし、実際には列バージョンの更新時間で動作するため、ソース行を挿入し、更新しないことを前提としています。また、行キーで並べ替えたためにデータが近くにない可能性があるため、速度が低下する可能性があります。全体として、これは推奨される方法ではないようです。しかし、迅速で汚いプロトタイピングでは、それは機能します。
HDFSから直接データをスキャンしている場合は、毎日別のディレクトリにデータを保存するだけで、同様のことができます。その後、昨日のディレクトリのみをスキャンでき、他には何もスキャンできません。
于 2013-03-29T01:19:10.630 に答える