mapreduce作业的map阶段的输出总是排序的吗?

ryhaxcpt  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(522)

我对mapper的输出有点困惑。
例如,当我运行一个简单的wordcount程序时,使用以下输入文本:

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

如您所见,mapper的输出已经被排序。我没有跑 Reducer 完全。但我在另一个项目中发现mapper的输出没有排序。所以我很清楚这一点。。
我的问题是:
Map器的输出总是排序的吗?
排序阶段是否已经集成到Map器阶段,以便Map阶段的输出已经在中间数据中排序?
有没有一种方法可以从 sort and shuffle 相和坚持它之前,它去减速器?一个减速机带有一个键和一个iterables列表。有没有办法,我可以保存这些数据?

cu6pst1q

cu6pst1q1#

第1点:Map器的输出总是按关键字排序的。i、 e.如果map方法正在执行此操作: context.write(outKey, outValue); 然后结果将根据 outKey .

oiopk7p5

oiopk7p52#

下面是对你的问题的一些解释

标题###是否始终对Map器的输出进行排序?

已经回复@surjansr

标题##排序阶段是否已与Map器阶段集成,以便Map阶段的输出已在中间数据中排序?

如您所知,在mapreduce作业中,mapper在数据的各个分割上运行,并跨数据持久化的节点运行。Map器的结果在写入下一阶段之前会被临时写入。
在reduce操作的情况下,临时存储的Map器输出被排序,在移动到reduce操作之前根据分区器的需要进行洗牌
在仅Map作业的情况下,与您的情况一样,临时存储的Map器输出将基于键进行排序,并写入最终输出文件夹(如作业参数中所指定)。

标题###是否有一种方法可以从排序和无序排列阶段收集数据,并在数据进入reducer之前将其持久化。一个减速机带有一个键和一个iterables列表。有没有办法,我可以保存这些数据?

不知道你的要求是什么。使用identityreducer只会持久化输出。我不确定这是否回答了你的问题。

oknwwptz

oknwwptz3#

1Map器的输出总是排序的吗?
2.排序阶段是否已集成到Map器阶段,以便Map阶段的输出已在中间数据中排序?
来自apache MapReduceTurial:
(低于 Mapper (节)
与给定输出键相关联的所有中间值随后由框架分组,并传递给缩减器以确定最终输出。
Map器输出被排序,然后按还原器进行分区。分区总数与作业的reduce任务数相同
(低于 Reducer (节)
异径管无
如果不需要减少,将reduce任务数设置为零是合法的。
在这种情况下,map任务的输出直接进入文件系统,进入fileoutputformat.setoutputpath(job,path)设置的输出路径。框架在将Map输出写入文件系统之前不会对其进行排序。
三。有没有一种方法可以从排序和洗牌阶段收集数据,并在数据进入reducer之前将其持久化?一个减速机带有一个键和一个iterables列表。有没有办法,我可以保存这些数据?
我不这么认为。从Apache对减速机的谴责:
减速器有3个初级阶段:
随机播放:
reducer通过网络使用http复制来自每个Map器的排序输出。
排序:框架merge按键对reducer输入进行排序(因为不同的Map器可能输出相同的键)。
洗牌和排序阶段同时发生,即在提取输出时,它们被合并。
减少:
reduce任务的输出通常写入 RecordWriter 通过 TaskInputOutputContext.write(Object, Object) .
减速机的输出未重新排序。
根据文档,洗牌和排序阶段是由框架驱动的
如果要持久化数据,请将reducer数设置为零,这将导致Map输出持久化到hdfs中,但不会对数据进行排序。
看看相关的se问题:
hadoop:0 reducer和identity reducer的区别?
我在hadoop 2.x版本中未找到identityreducer:
新hadoop api中的identityreducer

rryofs0p

rryofs0p4#

我支持vefthym的回答。通常,在将Map器输出本地存储到节点上之前,会对其进行排序。但是,当您在作业配置中将numreducetasks显式设置为0时,Map器o/p将不会被排序并直接写入hdfs。所以我们不能说Map器输出总是排序的!

gajydyqb

gajydyqb5#

Map器的输出总是排序的吗?
不。如果你不使用减速机,它就不会被分类。如果使用缩减器,则在将Map器的输出写入磁盘之前会有一个预排序过程。在reduce阶段对数据进行排序。这里发生的事情(只是猜测)是您没有指定reducer类,在新的api中,reducer类被转换为使用identity reducer(参见下面的答案和注解)。identity reducer只输出它的输入。要验证这一点,请参阅默认的reducer计数器(应该有一些reduce任务、reduce input records&groups、reduce output records…)
排序阶段是否已经集成到Map器阶段,以便Map阶段的输出已经在中间数据中排序?
正如我在上一个问题中所解释的,如果不使用缩减器,mapper不会对数据进行排序。如果确实使用了reducer,那么数据将从map阶段开始排序,然后在reduce阶段进行merge排序。
是否有一种方法可以从排序和洗牌阶段收集数据,并在数据进入reducer之前将其持久化。一个减速机带有一个键和一个iterables列表。有没有办法,我可以保存这些数据?
同样,洗牌和排序是reduce阶段的一部分。身份缩减器会做你想做的事。如果您想为每个reducer输出一个键值对,并且这些值是iterables的串联,只需将iterables存储在内存中(例如在stringbuffer中),然后将这个串联作为一个值输出。如果希望map输出直接转到程序的输出,而不经过reduce阶段,则在driver类中将reduce任务数设置为零,如下所示:

job.setNumReduceTasks(0);

不过,这不会对输出进行排序。它将跳过Map器的预排序过程,并将输出直接写入hdfs。

相关问题