0

HDFS データを既存の HBase テーブルにインポートしようとしています。私が持っているテーブルは、2 つの列ファミリーで作成され、新しいテーブルを作成するときに HBase に付属するすべてのデフォルト設定で作成されました。テーブルはすでに大量のデータでいっぱいで、98 のオンライン リージョンがあります。それが持っている行キーのタイプは、(簡易版) の形式になっています: 2-CHARS_ID + 6-DIGIT-NUMBER + 3 X 32-CHAR-MD5-HASH.

キーの例: IP281113ec46d86301568200d510f47095d6c99db18630b0a23ea873988b0fb12597e05cc6b30c479dfb9e9d627ccfc4c5dd5fef。

インポートしたいデータは HDFS にあり、Map-Reduce プロセスを使用して読み取ります。HDFS ファイルから読み取った各行に対応する Put オブジェクトをマッパーから出力します。既存のデータには、すべて「XX181113」で始まるキーがあります。ジョブは次のように構成されています。

HFileOutputFormat.configureIncrementalLoad(job, hTable)

プロセスを開始すると、98 個のレデューサー (テーブルにあるオンライン リージョンに等しい) で構成されていることがわかりますが、問題は、4 つのレデューサーがそれらの間で分割されたデータの 100% を取得し、残りは何もしなかったことです。その結果、非常に大きなサイズの 4 つのフォルダー出力のみが表示されます。regionsこれらのファイルは、テーブルにインポートできる4 つの新しいファイルに対応していますか? もしそうなら、98 個のレデューサーが作成されるのに、なぜ 4 個しかないのでしょうか? HBase ドキュメントを読む

In order to function efficiently, HFileOutputFormat must be configured such that each output HFile fits within a single region. In order to do this, jobs whose output will be bulk loaded into HBase use Hadoop's TotalOrderPartitioner class to partition the map output into disjoint ranges of the key space, corresponding to the key ranges of the regions in the table.

なぜ私がこの振る舞いをするのかについて、私をさらに混乱させました。

ありがとう!

4

1 に答える 1

0

取得するマップの数は、テーブル内のリージョンの数に依存するのではなく、データがどのようにリージョンに分割されるかによって異なります (各リージョンにはキーの範囲が含まれます)。すべての新しいデータが同じ接頭辞で始まると述べているため、いくつかの地域にしか収まらない可能性があります。新しいデータがより多くのリージョンに分割されるように、テーブルを事前に分割できます

于 2013-11-30T20:19:14.000 に答える