假设我有两个键值数据集——数据集A和B,我们称它们为数据集A和B。我想用 B 组的数据更新 A 组中的所有数据,其中两者在键上匹配。
因为我要处理如此大量的数据,所以我使用 Hadoop 进行 MapReduce。我担心的是,为了在 A 和 B 之间进行密钥匹配,我需要将所有 A 集(大量数据)加载到每个映射器实例的内存中。这看起来效率相当低。
是否有推荐的方法可以做到这一点,而不需要每次都重复在 A 中加载的工作?
一些伪代码来澄清我目前正在做什么:
Load in Data Set A # This seems like the expensive step to always be doing
Foreach key/value in Data Set B:
If key is in Data Set A:
Update Data Seta A
根据文档,MapReduce框架包括以下步骤 http://hadoop.apache.org/docs/r1.0.3/mapred_tutorial.html#Payload:
- Map
- 排序/分区
- 合并(可选)
- Reduce
您已经描述了执行连接的一种方法:将所有集合 A 加载到每个映射器的内存中。你是对的,这是低效的。
相反,请观察到,如果两个集合都按键排序和分区,则大型连接可以分为任意多个较小的连接。 MapReduce 在上面的步骤(2)中按键对每个 Mapper 的输出进行排序。然后按键对排序后的 Map 输出进行分区,以便为每个Reducer 创建一个分区。对于每个唯一键,Reducer 将接收来自 Set A 和 Set B 的所有值。
要完成连接,Reducer 只需要输出键和集合 B 中的更新值(如果存在);否则,输出 Set A 中的键和原始值。要区分 Set A 和 Set B 中的值,请尝试在 Mapper 的输出值上设置一个标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)