我对从 Mapper 获得的输出有点困惑。
例如,当我使用以下输入文本运行一个简单的字数统计程序时:
hello world
Hadoop programming
mapreduce wordcount
lets see if this works
12345678
hello world
mapreduce wordcount
这是我得到的输出:
12345678 1
Hadoop 1
hello 1
hello 1
if 1
lets 1
mapreduce 1
mapreduce 1
programming 1
see 1
this 1
wordcount 1
wordcount 1
works 1
world 1
world 1
如您所见,映射器的输出已经排序。我没有跑Reducer
根本不。
但我在另一个项目中发现映射器的输出未排序。
所以我对此非常清楚..
我的问题是:
- 映射器的输出总是排序的吗?
- 排序阶段是否已集成到映射器阶段中,以便映射阶段的输出已在中间数据中排序?
- 有没有办法收集数据
sort and shuffle
在进入Reducer之前阶段并持久化它?减速器带有一个键和一个可迭代列表。有什么办法可以保留这些数据吗?
映射器的输出总是排序的吗?
不,如果你不使用reducer,它不会被排序。如果您使用减速器,则在将映射器的输出写入磁盘之前会有一个预排序过程。数据在Reduce 阶段进行排序。这里发生的情况(只是猜测)是您没有指定一个Reducer类,在新的API中,该类被转换为使用IdentityReducer(请参阅这个答案 https://stackoverflow.com/a/9749215/2516301并评论)。 Identity Reducer 仅输出其输入。要验证这一点,请查看默认的Reducer计数器(应该有一些reduce任务,reduce输入记录和组,reduce输出记录......)
排序阶段是否已集成到映射器阶段中,以便映射阶段的输出已在中间数据中排序?
正如我在上一个问题中所解释的,如果不使用减速器,映射器不会对数据进行排序。如果您确实使用化简器,则数据从映射阶段开始排序,然后在化简阶段进行合并排序。
有没有办法从排序和洗牌阶段收集数据并在进入Reducer之前将其保留。减速器带有一个键和一个可迭代列表。有什么办法可以保留这些数据吗?
同样,洗牌和排序是Reduce 阶段的一部分。 IdentityReducer 会做你想做的事。如果你想为每个reducer输出一个键值对,并且这些值是可迭代的串联,只需将可迭代存储在内存中(例如在StringBuffer中),然后将该串联输出为一个值。如果您希望映射输出直接进入程序的输出,而不经过reduce阶段,那么在驱动程序类中将reduce任务的数量设置为零,如下所示:
job.setNumReduceTasks(0);
但这不会对你的输出进行排序。它将跳过映射器的预排序过程并将输出直接写入HDFS。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)