2012-02-13 8 views
0

私はHadoopの初心者です。次の問題があります。私がやろうとしているのは、データベースの断片をマップすることです(マーザにその理由などを問いただしてはいけません)。そして、このデータに対して特定の操作を行い、結果をレデューサーに出力し、その出力を再度使用します。同じシャードフォーマットを使用して同じデータに対して第2のフェーズマップ/リダクションジョブを実行する。 Hadoopは、データベースの断片を送信するための入力方法を提供していません。 LineInputFormatとLineRecordReaderを使用して行単位でしか送信できません。 NLineInputFormatはこの場合も役に立ちません。私は自分のInputFormatを書くためにFileInputFormatとRecordReaderクラスを拡張する必要があります。私はLineRecordReaderを使用することをお勧めしました。基礎となるコードはすでにFileSplitsを扱っており、ファイルの分割に関連するすべての問題があります。 私が今行う必要があるのは、正確にわからないnextKeyValue()メソッドをオーバーライドすることだけです。新しいAPIを使用したHadoopカスタム入力フォーマット

for(int i=0;i<shard_size;i++){ 
      if(lineRecordReader.nextKeyValue()){        lineValue.append(lineRecordReader.getCurrentValue().getBytes(),0,lineRecordReader.getCurrentValue().getLength()); 

}

上記のコードは書きましたが、何とかうまく動作しないものです。あらかじめありがとうございます

答えて

0

私はあなたの入力ファイルに接続文字列といくつかの他の表示をどこに置くことをお勧めします。
Mapperはこの情報を受け取り、データベースに接続してジョブを実行します。私は結果セットをhadoopの書き込み可能なクラスに変換することを提案しません。それはパフォーマンスを妨げるでしょう。
私が取り組むべき問題は、この比較的小さな入力を十分に分割することです。 それぞれに少数のシャード参照を持つ十分な小さなファイルを作成するだけで、小さな分割を作成するために入力フォーマットを微調整することができます。第二の方法はより柔軟になります。

+0

は、のようなものですthis – Ahmedov

0

私がしたことは、このようなものです。私は

public boolean nextKeyValue() throws IOException, 

例外:InterruptedExceptionを一度にn行を読んで、入力としてマッパーにそれらを送信するために私自身のレコードリーダーを書いた{

StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < 5; i++) { 
     if (!lineRecordReader.nextKeyValue()) { 
      return false; 
     } 
     lineKey = lineRecordReader.getCurrentKey(); 
     lineValue = lineRecordReader.getCurrentValue(); 
     sb.append(lineValue.toString()); 
     sb.append(eol); 
    } 
    lineValue.set(sb.toString()); 
    //System.out.println(lineValue.toString()); 

    return true; 

    // throw new UnsupportedOperationException("Not supported yet."); 
} 

行う方法あなたは薄い私がやったこと

+0

ここではすべてが明確ではありませんが、分割を決めるときにinputFormatの小さな部分に分割する必要があるようです。大量のデータブロックがRecordReaderに送られた後は、マッパーにそれを渡すしかありません。 –

+0

@DavidGruzmanは、読者5行(5は任意の数に変更できます)をマッパーに送ります。マッパーは、これらの5行の入力を受け取り、その上で特定の操作を行い、異なるキーと値を持つ複数の出力を生成し、それらをレデューサーに送ります。入力の分割方法は、linRecordReaderオブジェクトによってカプセル化されます。 – Ahmedov

+0

私はこれをもっと明確にするようにしましょう。古典的なWordCountアプリケーションでは、各行がファイルからマッパーに読み込まれます。マッパーだけが出力します(単語、1)、レデューサーはこれらの値を集計します。各マッパーに(1行だけでなく)ファイルを送信し、マッパー内で1行ずつ読み込み、続いて出力(word、one)する方が良いでしょうか。次に、コンバイナを使用して中間値を集計し(繰り返し単語が多数あるため)、結果をレデューサに送信します。あまりにも多くのマッパーインスタンスを必要とせず、私たちはcmb – Ahmedov

関連する問題