55

今、私はResultScannerこのように行カウントオーバーを実装しています

for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
    number++;
}

数百万回計算に達するデータが大きい場合 Mapreduceは使いたくないリアルタイムで計算したい

行数をすばやくカウントする方法。

4

12 に答える 12

108

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>...]
    ]
于 2013-02-14T10:11:31.000 に答える
37

行数をカウントするには、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
于 2014-08-06T19:16:13.237 に答える
9

HBaseに含まれているHBase行数マップ/削減ジョブを使用する

于 2012-07-07T13:19:22.923 に答える
5

HBASE で行をカウントするためのシンプルで効果的かつ効率的な方法:

  1. 行を挿入するたびに、この API がトリガーされ、その特定のセルがインクリメントされます。

    Htable.incrementColumnValue(Bytes.toBytes("count"), Bytes.toBytes("details"), Bytes.toBytes("count"), 1);
    
  2. そのテーブルに存在する行数を確認するには。その特定の行「カウント」に対して「取得」または「スキャン」API を使用するだけです。

このメソッドを使用すると、1 ミリ秒未満で行数を取得できます。

于 2012-07-16T10:53:20.307 に答える
4

HBase 0.92 以降で利用可能なコプロセッサーを使用できます。CoprocessorAggregateProtocolおよびを参照してください

于 2012-07-07T20:20:44.297 に答える
1

スキャナーを使用している場合は、スキャナーでできるだけ少ない数の修飾子を返すようにしてください。実際、返される修飾子は、利用可能な最小 (バイトサイズ) である必要があります。これにより、スキャンが大幅に高速化されます。

残念ながら、これはこれまでの規模 (数百万から数十億?) までしか拡張できません。さらに進めるには、これをリアルタイムで行うことができますが、最初に mapreduce ジョブを実行してすべての行をカウントする必要があります。

Mapreduce の出力を HBase のセルに格納します。行を追加するたびに、カウンターを 1 増やします。行を削除するたびに、カウンターを減らします。

リアルタイムで行数にアクセスする必要がある場合は、HBase でそのフィールドを読み取ります。

それ以外の方法でスケーリングする方法で行をカウントする高速な方法はありません。あなたはとても速く数えることができます。

于 2012-07-17T21:40:23.977 に答える
1

Hbase ホーム ディレクトリに移動し、次のコマンドを実行します。

./bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '名前空間:テーブル名'

これにより mapreduce ジョブが起動され、出力には hbase テーブルに存在するレコードの数が表示されます。

于 2017-07-06T09:22:00.973 に答える
-1

hbase api メソッドを試すことができます。

org.apache.hadoop.hbase.client.coprocessor.AggregationClient

于 2016-02-03T09:09:16.077 に答える