map reduce是否适合调用Web服务和转换xml数据?

时间:2013-07-17 04:34:07

标签: java parallel-processing mapreduce

我们有一个在单个节点上运行的工作需要40万才能完成,而M / R我们希望将其降低到不到2米,但我们不确定该流程的哪些部分进入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建模的方法,只是想确保我在正确的道路上......

映射
密钥从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);
        }
    }

减速
对于每个key / 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()中调用Web服务是一种好习惯 变换reduce();从事这两项行动的任何好处 map()
  • 我不会在reduce()中检查重复项,因为keys.txt 不包含重复的键;这样安全吗?
  • 如何控制输出文件的格式? TextOutputFormat看起来很有趣;我希望它能像这样读......
100|foo bar|$456,098
101|bar foo|$20,980

1 个答案:

答案 0 :(得分:1)

你应该做转换地图方面,原因有两个:

  • 从xml转换为管道分隔符将减少您序列化并传输到reducer中的数据量。
  • 您将运行多个地图作业,但只有一个减少作业,因此您希望转换地图侧以利用该并行性。
  • 由于所有工作都是映射端,因此您只需使用提供的IdentityReducer,而不必编写自己的代码。

如果你想要一个输出文件,你会想要使用一个减速器; map-reduce为每个reducer生成一个输出文件。

如果您确定没有重复的密钥,那么是的,忽略重复减少方面应该是安全的。

我相信TextOutputFormat默认会将您的(键,值)对作为制表符分隔的字符串写入文件,因此不是您想要的格式。有关如何更改内容,请参阅here

您的网络服务将成为一个限制因素。假设您希望您的40分钟工作在2分钟内完成,您可能需要从中读取40个左右的地图工作。它可以处理40个并发读者吗?

你的另一个限制因素是减少方面。假设你想要一个按键排序的单个输出文件,你将不得不使用一个reducer,它必须对你的所有输入进行排序,这可能需要一点点。

一旦你的代码工作,你将不得不运行一些实验,看看哪些设置给你一个合理的运行时间。祝你好运。