我們有一個工作可以在一個節點上運行,最多需要40米才能完成,而我們希望將M/R降到2米以下,但我們不確定該流程的哪些部分會進入map()
以及reduce()
。map是否適合調用web服務和轉換xml數據?
當前進程:
對於關鍵字的列表,呼籲每個鍵的網絡服務,並得到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模式
這是我如何與地圖/減少,只是想確保我在正確的道路上仿照它...
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);
}
}
問題
- 在
reduce()
中執行 轉換時調用map()
中的Web服務是否是一種好的做法;map()
做這兩項操作的好處? - 我不檢查
reduce()
中的重複項,因爲keys.txt 不包含重複鍵;那是安全的嗎? - 如何控制輸出文件的格式?
TextOutputFormat
看起來有趣;我希望它這樣寫的...
100|foo bar|$456,098 101|bar foo|$20,980
Web服務不是真正的限制因素嗎? – Kayaman
假設只有一個,是的,但它位於多個實例部署在多個節點上的代理之後。 – raffian