完了するまでに最大 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