我在读了下面关于hadoop的文章后感到困惑-权威指南第4版(第204页)
在将数据写入磁盘之前,线程首先将数据划分为与最终将发送到的缩减器相对应的分区。
在每个分区中,后台线程执行内存中的按键排序,如果有组合器函数,则在排序的输出上运行。
运行combiner函数可以获得更紧凑的map输出,因此要写入本地磁盘和传输到reducer的数据更少。
我的疑问是:
1) 谁将执行第一个合并器或分区!!
2) 当自定义组合器和自定义分区将在那里,那么如何和什么将是执行步骤层次结构?
3) 我们能不能把压缩数据(avro,sequence..等)输入到定制的组合器中,如果是的话怎么办!!
寻找一个简短而深入的解释!!
提前谢谢。
5条答案
按热度按时间bq3bfh9z1#
我想总结一下整个流程:
Map器读取数据并处理。此输出转到中间输出文件。
一旦mapper完成所有的键,值对。
Map器的输出首先写入内存缓冲区,
当缓冲区即将溢出,然后溢出到本地目录,然后在内存中创建分区[”在每个分区内,后台线程执行内存中的按键排序,中间输出使用默认分区器'hashpartitioner'或自定义分区器被分区到'r'分区]
溢出的数据根据partitioner进行划分,并在每个划分中对结果进行排序和排序
如果有一个自定义组合器,它将在内存中执行,结果将在最后溢出到磁盘。
reducer会接触到Map器并提取相应的分区文件。
在所有Map器任务完成之后,所有中间数据都被复制到所有缩减器。减速器对数据执行另一种排序。
然后,还原器逐个处理各自的键、值对。
如果我的理解有任何差距,请提出建议
hgncfbus2#
1/此部分中已经指定了响应:“在每个分区内,后台线程执行内存中的按键排序,如果有组合器函数,则在排序的输出上运行。”
因此,首先在内存中创建分区,如果有一个自定义组合器,它将在内存中执行,结果将在最后溢出到磁盘。
2/当在驱动程序类上指定自定义组合器和自定义分区时,它们将在那里。
如果没有指定自定义合并器,则不执行合并器。如果没有指定自定义分区器,那么默认执行的分区器是“hashpartitioner”(请参见第221页)。
3/是的,有可能。别忘了合路器的机构和减速机是一样的。缩减器可以使用压缩数据。如果使用者使用压缩数据,则表示输入文件格式已压缩。为此,您可以在driver类上指定以下指令:
m528fe3b3#
你的问题的直接答案是=>combiner
细节:合路器可以被看作是Map阶段的小型减速机。在进一步分发Map器结果之前,它们对Map器结果执行局部缩减。一旦合路器功能被执行,它就被传递给减速机进行进一步的工作。
作为
当我们处理的不仅仅是减速机时,分区器就出现了。因此,分区者决定哪个reucer负责一个特定的密钥。它们基本上获取Map器结果(如果使用combiner,则返回combiner结果)并根据密钥将其发送给负责的reducer。
为了更好地理解,您可以参考下面的图片,这是我从hadoop上的yahoo开发者教程中获取的。图4.6:插入mapreduce数据流的合并器步骤
这是教程。
iyfjxgzm4#
分区在合并器之前运行。a) Map程序将把数据处理成b),然后是一个分区程序(默认或自定义)将根据键的要求对数据进行分区。c) 然后对键进行排序,这些键将由后台线程/进程负责。d) 如果combinor存在:那么后面跟combinor,这将在排序键的输出上运行e),后面跟reducer,reducer将在输入数据上再运行一次sort,后面跟reducer进程。
hpcdzsge5#
这是完整的mr工作流程。你的答案是1.)和2.)。
Map器读取数据并处理。此输出转到中间输出文件。
一旦mapper完成所有的键,值对。中间输出使用默认分区器“hashpartitioner”或自定义分区器分区为“r”分区。
每个分区文件都被排序。
任何可选的组合器代码都在排序的“r”分区上执行。组合器步骤仅在指定时执行。
reducer会接触到Map器并提取相应的分区文件。
在所有Map器任务完成之后,所有中间数据都被复制到所有缩减器。减速器对数据执行另一种排序。
然后,还原器逐个处理各自的键、值对。
答案3:是的,合路器可以处理压缩数据。combiner函数在map阶段的输出上运行,并用作过滤或聚合步骤,以减少传递到reducer的中间键的数量。在大多数情况下,reducer类被设置为combiner类。区别在于这些类的输出。combiner类的输出是传递给reducer的中间数据,而reducer的输出则传递给磁盘上的输出文件。作业的合路器可以这样设置: