python - 使用 Hadoop Streaming 和 Python 在 Map Reduce 中进行叉积

标签 python hadoop mapreduce

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

现在,我希望进行不等式连接,这涉及在应用不等式条件之前找到叉积。我正在使用相同的映射器(我需要更改它吗)并且我更改了缩减器以便它包含一个嵌套循环(因为 file1 中的每个键值对都必须与 file2 中的所有键值对匹配)。这是行不通的,因为您只能通过一次流。现在,我想到了在 reducer 中存储“一些”值并比较它们的选项,但我不知道“有多少”。天真的方法是将整个 file2 内容存储在数组(或类似结构)中,但那是愚蠢的,并且违背了分布式处理的想法。最后,我的问题是

  1. 如何在 reducer 中存储值,以便我可以在两个文件之间进行叉积?

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

示例文件: 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

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

最佳答案

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

关于mapper产生的数据和reducer中要组合的数据集的对应关系,如果每个key的数据集不是太大,可以简单的从mapper中yield这样的组合:

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

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

关于python - 使用 Hadoop Streaming 和 Python 在 Map Reduce 中进行叉积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617901/

相关文章:

hadoop - 无法在配置单元中创建外部表以指向 hbase 一个

java - Hadoop Mapper参数说明

python - 在 Python 中使用递归计算 exp(x)

python - 使用 ImageIO 从 ZipFile 处理文件

python - SymPy 的符号集成速度慢

hadoop - 跨映射器共享内存数据中的公共(public)查找 : Hadoop

java - Appengine Mapreduce 受限类 ManagementFactory

python - python-markdown 在不受信任的输入上安全吗?

hadoop - 为什么hadoop不允许使用VIM编辑文件?

hadoop - 如何在具有多个 reducer 的 map reduce 中获得合并值