MapReduce 能否用于从一个巨大的文件中有效地求和整数?
Can MapReduce be used to efficiently sum up integers from a huge file?
[文件太大,无法读入 RAM。]
这是我的公式:
- 映射器将获取每个整数
x
并发出 ('anything', x)
.
- 在排序阶段,所有键值对将按键分组:
('anything', [x1, x2, x3, ...])
.
- reducer 会将每个键的所有整数相加并发出总和。
但是因为我对所有键值对都有相同的键,这不是很低效吗,因为会有 1 个 reducer 将所有整数相加?
使用 MapReduce 解决这个问题的正确方法是什么?
要在一台机器上计算这个,你不需要一次将文件完全放在 RAM 中,但如果文件足够大,需要很长时间才能通过一台机器流式传输它,那么你会发现通过使用与 reducer 相同的组合器,对 MapReduce 算法进行了重大优化。
组合器充当缩减器,但 运行 在将结果发送到缩减器之前针对每个映射器。在这种情况下,您的单个 reducer 将只收到每个映射器的一条记录 - 该映射器的总和。映射器通常处理 128MB 的数据(一个巨大文件的每个 HDFS 块的大小),您将需要一个非常大的文件来让典型的单个减速器负担重重。
有关组合器的更多信息,请访问 Apache Hadoop 网站。
[文件太大,无法读入 RAM。]
这是我的公式:
- 映射器将获取每个整数
x
并发出('anything', x)
. - 在排序阶段,所有键值对将按键分组:
('anything', [x1, x2, x3, ...])
. - reducer 会将每个键的所有整数相加并发出总和。
但是因为我对所有键值对都有相同的键,这不是很低效吗,因为会有 1 个 reducer 将所有整数相加?
使用 MapReduce 解决这个问题的正确方法是什么?
要在一台机器上计算这个,你不需要一次将文件完全放在 RAM 中,但如果文件足够大,需要很长时间才能通过一台机器流式传输它,那么你会发现通过使用与 reducer 相同的组合器,对 MapReduce 算法进行了重大优化。
组合器充当缩减器,但 运行 在将结果发送到缩减器之前针对每个映射器。在这种情况下,您的单个 reducer 将只收到每个映射器的一条记录 - 该映射器的总和。映射器通常处理 128MB 的数据(一个巨大文件的每个 HDFS 块的大小),您将需要一个非常大的文件来让典型的单个减速器负担重重。
有关组合器的更多信息,请访问 Apache Hadoop 网站。