今、私はResultScanner
このように行カウントオーバーを実装しています
for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
number++;
}
数百万回計算に達するデータが大きい場合 Mapreduceは使いたくないリアルタイムで計算したい
行数をすばやくカウントする方法。
HBase で RowCounterを使用する RowCounter は、テーブルのすべての行をカウントする mapreduce ジョブです。これは、メタデータの不整合の懸念がある場合に、HBase がテーブルのすべてのブロックを読み取れるようにするサニティ チェックとして使用するのに適したユーティリティです。mapreduce はすべて 1 つのプロセスで実行されますが、悪用する MapReduce クラスターが配置されている場合は、より高速に実行されます。
$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter <tablename>
Usage: RowCounter [options]
<tablename> [
--starttime=[start]
--endtime=[end]
[--range=[startKey],[endKey]]
[<column1> <column2>...]
]
行数をカウントするには、hbase の count メソッドを使用できます。しかし、はい、大きなテーブルの行のカウントは遅くなる可能性があります.count 'tablename' [interval]
戻り値は行数です。
この操作には長い時間がかかる場合があります ('$HADOOP_HOME/bin/hadoop jar hbase.jar rowcount' を実行してカウント mapreduce ジョブを実行します)。現在のカウントは、デフォルトで 1000 行ごとに表示されます。カウント間隔はオプションで指定できます。スキャン キャッシングは、デフォルトでカウント スキャンで有効になっています。デフォルトのキャッシュ サイズは 10 行です。行のサイズが小さい場合は、このパラメーターを増やすことができます。
例:
hbase> count 't1'
hbase> count 't1', INTERVAL => 100000
hbase> count 't1', CACHE => 1000
hbase> count 't1', INTERVAL => 10, CACHE => 1000
テーブル参照に対しても同じコマンドを実行できます。テーブル 't1' への参照があるとします。対応するコマンドは次のようになります。
hbase> t.count
hbase> t.count INTERVAL => 100000
hbase> t.count CACHE => 1000
hbase> t.count INTERVAL => 10, CACHE => 1000
HBaseに含まれているHBase行数マップ/削減ジョブを使用する
HBASE で行をカウントするためのシンプルで効果的かつ効率的な方法:
行を挿入するたびに、この API がトリガーされ、その特定のセルがインクリメントされます。
Htable.incrementColumnValue(Bytes.toBytes("count"), Bytes.toBytes("details"), Bytes.toBytes("count"), 1);
そのテーブルに存在する行数を確認するには。その特定の行「カウント」に対して「取得」または「スキャン」API を使用するだけです。
このメソッドを使用すると、1 ミリ秒未満で行数を取得できます。
HBase 0.92 以降で利用可能なコプロセッサーを使用できます。CoprocessorとAggregateProtocolおよび例を参照してください
スキャナーを使用している場合は、スキャナーでできるだけ少ない数の修飾子を返すようにしてください。実際、返される修飾子は、利用可能な最小 (バイトサイズ) である必要があります。これにより、スキャンが大幅に高速化されます。
残念ながら、これはこれまでの規模 (数百万から数十億?) までしか拡張できません。さらに進めるには、これをリアルタイムで行うことができますが、最初に mapreduce ジョブを実行してすべての行をカウントする必要があります。
Mapreduce の出力を HBase のセルに格納します。行を追加するたびに、カウンターを 1 増やします。行を削除するたびに、カウンターを減らします。
リアルタイムで行数にアクセスする必要がある場合は、HBase でそのフィールドを読み取ります。
それ以外の方法でスケーリングする方法で行をカウントする高速な方法はありません。あなたはとても速く数えることができます。
Hbase ホーム ディレクトリに移動し、次のコマンドを実行します。
./bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '名前空間:テーブル名'
これにより mapreduce ジョブが起動され、出力には hbase テーブルに存在するレコードの数が表示されます。
hbase api メソッドを試すことができます。
org.apache.hadoop.hbase.client.coprocessor.AggregationClient