3

問題

複数の HBase テーブル (A、B、C) があります。A が処理が必要なレコードのキューであると仮定します。平均 2,500 万件のレコードを含めることができます。A にはユーザー ID があります。B には、各ユーザーが実行した Web サイト ヒットがあります。B には数十億の行が含まれる可能性があります。Cには、ユーザーに関するいくつかの二次情報があります。

MapReduce ジョブを使用して、キュー内のレコードに対して予測分析 (何千もの決定木) を実行します。質問の範囲には、実際の分析モデリングは含まれません。

質問

  1. MR ジョブは、テーブル B と C に対してアドホック クエリを実行しています。たとえば、マップ タスク 1 はクエリを実行してユーザー 1 のヒットを取得し、マップ タスク 2 はクエリを実行してユーザー 2 のヒットを取得します。これらのヒットが同じリージョン サーバーで終了した場合、パフォーマンスを妨げますか (競合状態など)? 各マッパーが 1 つのリージョン サーバーにまたがるキーを持つように入力セットを分割する ChainMapper (ChainReducer) のようなパターンはありますか?
  2. 私の最初の考えは、必要なすべての入力 (b と c からの結果) を含むキューを用意することでした。この入力は圧縮されます (モデリングに必要なもののみ)。このアプローチにより、アドホック クエリの実行が回避されます (同時に複数のマップ タスクによってリージョン サーバー間で)。

その他の提案は大歓迎です。

Cloudera CDH 3 (hadoop、hbase) を使用しています。

4

1 に答える 1

1

解決するのは簡単ではありませんが、bloomfilter + reduce join を使用することをお勧めします。

Bloomfilter と B の影響を受ける領域のセットを構築する

Map: A -> BF(A), S = {regions of B}

B テーブル スキャンに影響を受ける領域を使用するカスタム InpufFormat を使用し、テーブル A 全体をスキャンします。

Map: B U S -> (tag 'B', keyB => value)
     A -> (tag 'A', keyA => value)
Reduce: reduce-join

Reduce で分析作業を行います。

于 2012-10-14T19:57:06.450 に答える