使用Hadoop Streaming和Python减少Map中的产品

时间:2012-11-29 02:30:49

标签: python hadoop mapreduce

我正在学习Python和Hadoop。我使用pythong + hadoop流完成了官方网站提供的设置和基本示例。我考虑过实现2个文件的连接。我完成了equi-join,检查两个输入文件中是否出现相同的密钥,然后按顺序输出密钥以及文件1和文件2中的值。等式连接按预期工作。

现在,我希望进行不等式连接,这涉及在应用不等式条件之前找到Cross Product。我正在使用相同的映射器(我需要更改它)并且我更改了reducer以使其包含嵌套循环(因为file1中的每个键值对都必须与file2中的所有键值对匹配)。这不起作用,因为您只能浏览一次流。现在,我想到了在reducer中存储'some'值并将它们进行比较的选项,但我不知道'怎么'很多。朴素的方法是将整个file2内容存储在一个数组(或类似的结构)中,但这是愚蠢的,违背了分布式处理的想法。最后,我的问题是

  1. 如何在reducer中存储值,以便我可以在两个文件之间交叉产品?

  2. 在equi-join中,Hadoop似乎将所有具有相同键的键值对发送到同一个reducer,这非常好,适用于该情况。但是,我如何改变这种行为(如果需要),以便所需的键值对分组成为正确的减速器?

  3. 示例文件:     http://pastebin.com/ufYydiPu

    Python Map / Reduce脚本:     http://pastebin.com/kEJwd2u1

    我正在使用的Hadoop命令:

    bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file /home/hduser/mapper.py -mapper mapper.py -file /home/hduser/ireducer.py -reducer reducer.py -input /user/hduser/inputfiles/* -output /user/hduser/join-output
    

    非常感谢任何帮助/提示。

1 个答案:

答案 0 :(得分:3)

处理可避免嵌套循环非常有用的多种组合的一种方法是使用itertools模块。特别是使用发电机处理笛卡尔积的itertools.product函数。这有利于内存使用和效率,如果您必须在一个map reduce工作中连接多个数据集,它可以显着简化代码。

关于映射器产生的数据与要在reducer中组合的数据集之间的对应关系,如果每个键的数据集不是太大,您可以简单地从映射器中得到如下组合:

{key, [origin_1, values]}
{key, [origin_2, values]}

因此,您将能够将reducer中具有相同原点的值分组为词典,这些词典将是使用itertools.product应用笛卡尔积的数据集。