[文件太大,无法读入RAM。]
这是我的配方:
- 映射器将取每个整数CCD_ 1并发射CCD_
- 在排序阶段,所有键值对将按关键字
('anything', [x1, x2, x3, ...])
进行分组 - reducer会将每个键的所有整数相加,并发出总和
但是,既然我对所有的键值对都有相同的键,这不是很低效吗?因为会有一个减少器将所有整数相加?
使用MapReduce解决此问题的正确方法是什么?
要在一台机器上计算这一点,您不需要一次将文件完全放在RAM中,但如果文件足够大,需要很长时间才能通过一台机器进行流式传输,那么您会发现使用与reducer相同的组合器对MapReduce算法进行了重大优化。
组合器充当还原器,但在将结果发送到还原器之前为每个映射器运行。在这种情况下,您的单个reducer将只收到每个映射器一条记录,即该映射器的总和。映射器通常处理128MB的数据(相当于一个巨大文件的每个HDFS块的大小),对于一个典型的单个缩减器来说,您需要一个非常大的文件。
关于组合器的更多信息可以在Apache Hadoop网站上找到。