0

完了するまでに最大 40m かかる単一ノードで実行されるジョブがあり、M/R を使用してそれを 2m 未満に抑えたいと考えていますが、プロセスのどの部分map()reduce().

現在のプロセス:
キーのリストについては、キーごとに Web サービスを呼び出し、xml 応答を取得します。xml をパイプ区切り形式に変換します。最後に単一のファイルを出力します...

def keys = 100..9999
def output = new StringBuffer()
keys.each(){ key -> 
   def xmlResponse = callRemoteService( key)
   def transformed = convertToPipeDelimited( xmlResponse)
   output.append( transformed)
}
file.write( output)

Map/Reduce モデル Map/Reduce
でモデル 化した方法は次のとおりです。正しい道を進んでいることを確認したいだけです...

Mapper
キーは keys.txt から取得されます。キーごとにリモート サービスを呼び出し、キーと xml のペアを保存します...

public static class XMLMapper extends Mapper<Text, Text, Text, Text> {
        private Text xml = new Text();
        public void map(Text key, Text value, Context context){          
           String xmlResponse = callRemoteService( key)
           xml.set( xmlResponse)
           context.write(key, xml);
        }
    }

レデューサー
キーと xml のペアごとに、xml をパイプ区切り形式に変換し、結果を書き出します...

public static class XMLToPipeDelimitedReducer extends Reducer<Text,Text,Text,Text> {
        private Text result = new Text();
        public void reduce(Text key, Iterable<Text> values, Context context ) { 
            String xml = values.iterator().next();
            String transformed = convertToPipeDelimited( xml);   
            result.set( transformed);
            context.write( key, result);
        }
    }

質問

  • map()で変換を行っている間reduce()にWeb サービスを呼び出すのは良い習慣ですか? で両方の操作を行う利点はあり map()ますか?
  • reduce()keys.txt には重複するキーが含まれていないため、重複をチェックしません。それは安全ですか?
  • 出力ファイルのフォーマットを制御するにはどうすればよいですか? TextOutputFormat面白そうです。このまま読みたい…
100|foo bar|$456,098
101|bar foo|$20,980
4

1 に答える 1

1

いくつかの理由から、マップ側で変換を行う必要があります。

  • xml からパイプ区切りに変更すると、シリアル化してレデューサーに送信するデータの量が減ります。
  • 複数のマップ ジョブを実行しますが、リデュース ジョブは 1 つです。そのため、マップ側を変換してその並列処理を利用したいと考えています。
  • すべての作業はマップ側で行われるため、提供された IdentityReducer を使用するだけで済み、そのための独自のコードを記述する必要はありません。

単一の出力ファイルが必要な場合は、単一のレデューサーを使用する必要があります。map-reduce は、レデューサーごとに 1 つの出力ファイルを生成します。

重複するキーがないと確信している場合は、はい、重複を無視しても安全です。

TextOutputFormat は、デフォルトで (キー、値) ペアをタブ区切りの文字列としてファイルに書き込むため、必要な形式ではないと思います。これを変更する方法については、こちらを参照してください。

ここでは、Web サービスが制限要因の 1 つになります。40 分のジョブを 2 分で実行したいと仮定すると、おそらく 40 ほどのマップ ジョブがそこから読み取る必要があります。40 人の同時リーダーを処理できますか?

あなたの他の制限要因は、削減側になります。キーでソートされた単一の出力ファイルが必要であると仮定すると、単一のレデューサーを使用する必要があり、すべての入力をソートする必要があり、少し時間がかかる場合があります。

コードが機能するようになったら、いくつかの実験を実行して、適切な実行時間が得られる設定を確認する必要があります。幸運を。

于 2013-07-17T15:11:19.047 に答える