我认为我对MapReduce编程模型有一般的了解,但即使在阅读了原始论文和其他一些资料之后,我也不清楚许多细节,特别是关于中间结果的分区.
到目前为止,我将快速总结一下我对MapReduce的理解:我们有一个非常大的输入数据集,它由MR-Framework自动分成M个不同的部分.对于每个部分,框架调度一个映射任务,该任务由我的集群中的一个可用处理器/机器执行.M个映射任务中的每一个输出一组键值对,其本地存储在执行该映射任务的同一机器上.每台机器将其磁盘划分为R个分区,并根据分区之间的中间密钥分配其计算的中间密钥值对.然后,框架为每个不同的中间密钥启动一个reduce任务,该任务再次由任何可用的机器执行.
现在我的问题是:
从概念上讲,很清楚地图的输入和输出以及减少功能/任务是什么.但我认为我还没有在技术层面上理解MapReduce.有人可以帮我理解吗?
Chr*_*ite 11
理解中间密钥的扩散和变化也很重要,因为它是经过散列和模数化(如果使用默认的HashPartitioner)来确定哪个reduce分区应该处理该密钥.假设您有偶数个reducer任务(10),并且输出键总是哈希到偶数 - 那么在这种情况下,这些哈希数字的模数和10将始终是偶数,这意味着奇数编号的减速器将从不处理任何数据.
克里斯所说的附录,
基本上,Hadoop中的分区类(例如Default HashPartitioner)
必须实现这个功能,
int getPartition(K key, V value, int numReduceTasks)
Run Code Online (Sandbox Code Playgroud)
此函数负责返回分区号,并从numReduceTasks变量中获取您在启动作业时修复的reducer数,如HashPartitioner中所示.
根据上述函数返回的整数,Hadoop选择应运行特定键的reduce任务的节点.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
25161 次 |
| 最近记录: |