2011-01-27 3 views
3

オブジェクト。のHBase MapReduceは、私はちょうど私たちがやっているデータ分析のものの一部についてのHBaseを評価しようとしています

HBaseのは、私たちのイベントデータが含まれています。キーはeventId + timeです。私たちは、日付範囲の間にいくつかのイベントタイプ(4-5)について分析を実行したいと考えています。イベントタイプの総数は約1000

HBaseのテーブルの上のMapReduceジョブを実行している問題は、initTableMapperJob(下記参照)のみ1スキャンの対象を取ることです。パフォーマンス上の理由から、1000のイベントタイプではなく、与えられた日付範囲内の4〜5つのイベントタイプだけをスキャンしたいと考えています。以下の方法を使用すると、スキャン対象が1つしかないため、その選択肢がないと思います。

公共の静的な無効initTableMapperJob(文字列テーブル、 スキャンスキャン、 クラスマッパー、 クラスoutputKeyClass、 クラスoutputValueClass、 org.apache.hadoop.mapreduce.Jobジョブ) はIOExceptionが

はそれが可能ですスロースキャンオブジェクトのリストにmapreduceを実行するには?任意の回避策?あなたがクラスを探している

おかげ

答えて

9

TableMapReduceUtil.initTableMapperJobは、ご使用のジョブにTableInputFormatを使用するように設定しています。これは、お分かりのように、Scanです。

あなたがテーブルの複数のセグメントをスキャンするように聞こえます。そのためには、あなたは、MultiSegmentTableInputFormatのようなものを、独自のInputFormatを作成する必要があります。 TableInputFormatBaseを拡張し、それはテーブルの各開始/停止行セグメントに対して一度super.getSplitsを呼び出すようgetSplitsメソッドをオーバーライドします。 (最も簡単な方法は毎回TableInputFormatBase.scan.setStartRow()になります)。 InputSplitインスタンスを単一のリストに集約します。

次に、カスタムMultiSegmentTableInputFormatを使用するようにジョブを設定します。

+0

http:// stackoverflowを確認できますか?com/questions/11353911/extended-hadoops-tableinputformat-to-a-prefix-for-distributionを配布用に使用していますか? – marcog

0

組織/ apacheの/ Hadoopの/ HBaseの/フィルター/ FilterList.java

各スキャンは、フィルタを取ることができます。フィルタはかなり複雑になる可能性があります。 FilterListを使用すると、複数の単一フィルタを指定してから、すべてのコンポーネントフィルタ間でANDまたはORを実行できます。これを使用して、行に対して任意のブール値のクエリを構築することができます。

+2

このアプローチの問題は、HBaseがフィルタリングする前にディスクから少なくとも値を読み取らなければならないということです。何十億行の場合にパフォーマンスが低下する可能性があります。 – StackUnderflow

+0

StackUnderflowの問題が原因でdownvoteしていた。数十億行の場合、フィルタを実行するのは非常に遅いです。 – Gattster

0

私はDave Lのアプローチを試してみました。それは美しく動作します。

マップジョブを設定するには、あなたはinputFormatClassはデイブL'sのコメントで述べたMultiSegmentTableInputFormatを参照する機能

TableMapReduceUtil.initTableMapperJob(byte[] table, Scan scan, 
    Class<? extends TableMapper> mapper, 
    Class<? extends WritableComparable> outputKeyClass, 
    Class<? extends Writable> outputValueClass, Job job, 
    boolean addDependencyJars, Class<? extends InputFormat> inputFormatClass) 

を使用することができます。

関連する問題