【问题标题】:Is map reduce suitable for invoking web services and transforming xml data?map reduce 是否适合调用 web 服务和转换 xml 数据?
【发布时间】:2013-07-17 04:34:06
【问题描述】:

我们有一个在单个节点上运行的作业最多需要 40m 才能完成,而通过 M/R,我们希望将其缩短到 2m 以下,但我们不确定流程的哪些部分进入@ 987654321@和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 对其进行建模的方法,只是想确保我走在正确的道路上......

映射器
钥匙从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()?
  • 我不检查 reduce() 中的重复项,因为 keys.txt 不包含重复键;那安全吗?
  • 如何控制输出文件的格式? TextOutputFormat 看起来很有趣;我希望它看起来像这样......
100|foo bar|$456,098
101|bar foo|$20,980

【问题讨论】:

  • 网络服务难道不是这里真正的限制因素吗?
  • 假设只有一个,是的,但它位于代理后面,多个实例部署在多个节点上。

标签: java parallel-processing mapreduce


【解决方案1】:

出于以下几个原因,您应该在地图方面进行转换:

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

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

如果您确定没有重复的键,那么可以,忽略重复的 reduce-side 应该是安全的。

我相信 TextOutputFormat 默认情况下会将您的 (key, value) 对作为制表符分隔的字符串写入文件,因此不是您想要的格式。请参阅 here 了解如何更改。

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

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

一旦您的代码工作正常,您就必须进行一些实验,看看哪些设置可以为您提供合理的运行时间。祝你好运。

【讨论】:

  • 输出不必排序。所以map()是并行执行的,但是reduce(),在这种情况下,是不是因为我需要一个输出文件?如何配置 M/R 以使用单个减速器?
  • 通过reducer的输出总是被排序的。如果您需要单个输出文件,则必须设置一个减速器类(甚至只是 IdentityReducer),它默认为单个减速器实例。可以在作业配置的驱动程序类中覆盖该数字。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2013-06-21
  • 1970-01-01
  • 2013-04-18
  • 2018-08-17
相关资源
最近更新 更多