首页 > 试题广场 >

请描述一下Hadoop的shuffle过程

[问答题]
请描述一下Hadoop的shuffle过程
Hadoop的shuffle过程分为Map端和Reduce端。

Map端:Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。

在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。partition的目是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。

最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。

Reduce端:reduceTask 根据自己的分区号,去各个 mapTask 机器上取相应的结果分区文件,reduceTask 会取到同一个分区的来自不同 mapTask 的结果文件,reduceTask 会将这些文件再进行合并(归并排序)至此,Reduce的shuffle过程就结束了。
发表于 2019-07-16 14:36:52 回复(6)
Hadoop的shuffle过程:
    Hadoop的shuffle分为map端和reduce端的shuffle。map端的shuffle:
     map对输入的数据进行处理之后生成的输出数据首先存储在环形缓存区中,当容量达到了设定的阈值后,向磁盘溢出即spill,在向磁盘溢出之前,先对输出数据按key进行分区,分区数量与reduce个数对应,分区之后再对将数据key进行排序,如果有conbiner,会对分区内的数据进行聚合,每个map任务会产生多个spill文件,在map任务结束之前,通过多路归并算法将这些spill文件归并成一个文件;
    reduce端shuffle:
    reduce端会定期向resourcemanager获取map的输出位置,复制map输出数据中对应的partition到本地。在复制map输出的同时就进行合并即将从各个map的输出进行排序并合并,最后将整合的文件交给reduce处理。
发表于 2019-08-06 18:50:05 回复(0)
Hadoopshuffle过程:
Hadoopshuffle过程就是从map端输出到reduce端输入之间的过程。是Hadoop中最核心的部分。
Map端:map过程的输出是写入本地磁盘而不是HDFS,但是一开始数据并不是直接写入磁盘而是缓冲在内存中,缓存的好处就是减少磁盘I/O的开销,提高合并和排序的速度。在编写map函数的时候要尽量减少内存的使用,为shuffle过程预留更多的内存,因为该过程是最耗时的过程。
Ruduce端:当Reducer的输入文件确定后,整个Shuffle操作才最终结束。之后就是Reducer的执行了,最后Reducer会把结果存到HDFS上。
发表于 2019-07-14 22:35:36 回复(0)
suffle分为map端的和reduce端
map端的suffle:
map端会处理输入数据并产生中间结果写入到磁盘,每个map的输出会先写到内存缓存区中,当写入的数据达到指定的阀值之后,系统启动一个线程将缓冲区中的数据写入到磁盘,这个过程叫spill,每个map任务可能产生多个spill文件,在map任务完成之前用多路合并算法将多个文件合并成一个,map端的suffle就结束了
reduce端的suffle
copy阶段:将map阶段产生的文件copy到reduce端【只拷贝与自己对应的partition中的数据】,大小超过阀值写入到磁盘否则存在内存当中
merge阶段:在copy数据的同时,reduce启动了两条线程用来合并文件,防止内存使用过多或者磁盘中文件过多
sort阶段:map在写文件之前已经进行了局部排序,reduce函数时通过key来聚集数据,为了使相同的key聚集到一起采用了排序的策略,map端已经进行了局部排序,因此reduce只需要对取到数据进行一次归并排序即可
reduce阶段:reduce函数将计算结果写到hdfs上
发表于 2021-03-16 16:59:51 回复(0)

hadoop的shuffle阶段分为map端的shuffle、reduce端的shuffle

map端的shuffle阶段

  1. spill:将map方法输出的结果写入环形缓冲区,当写入到环形缓冲区的数据到达阈值(80%)就会将这部分数据溢写到磁盘上,在写入磁盘之前会对数据进行分区,并按照key进行排序(快排),分区内部有序

  2. merge:spill阶段会形成若干个小文件,将小文件合并并且分区按照key排序(归并排序),形成一个大的文件

reduce端的shuffle阶段:

  1. copy:reduceTask会在不同的map端最终文件copy拉取属于自己分区的数据

  2. merge:将不同map端拉取过来的数据进行排序

  3. 分组:将数据按照key进行分组,相同key不同value形成一个迭代器

发表于 2020-09-16 09:03:16 回复(0)
1.map得到的结果放在内存中,当到达一定值就会溢写;每个maptask对应一个内存缓冲区,默认100,存储map的输出结果。80%时就会溢写,留有20%用于继续处理map的输出结果。
当缓冲区块满的时候,将缓冲区的数据以一个临时文件的方式存放在磁盘。
溢写有单独线程完成,不影响往缓冲区写map结果的线程。
2、partition,分区。同一分区的数据会被放在同一个reduce中处理,用于解决负载均衡和数据倾斜的问题。可以自定义,也有默认的分区规则(对key取hash值,然后对reduce的个数进行模拟运算 hashVal%reduceNum)。
3、sort:默认排序方式-ASCII码值排序,即字典序。(10排在9的前面),可自定义。
4、spill to disk:溢写到磁盘
5、merge on disk:把溢写的文件按照hash值(及key值相同)合并:combiner,目的:提高下一步网络数据copy的效率,可以自定义。

进入reduce的机器中操作:
6、根据分区把各个map数据copy到reduce中
7、将得到的数据merge合并,key相同合并
8、把执行结果合并
发表于 2019-09-24 22:00:50 回复(0)
1.map端:
    map方法处理完后,将数据写入环形缓冲区,根据分区器将数据打上分区号,当环形缓冲区达80%时,会进行溢写磁盘,在溢写过程中,会先按照分区和key进行排序(快排),排序后写入磁盘,形成小文件,当小文件达到十个,就会进行合并,采用归并排序,形成一个大文件
2.reduce端:
    reduce会默认开启5个线程去map端拉取属于自己分区的那部分数据到内存,内存不够会溢写磁盘,数据拉取完后会进行归并排序合并成一个大文件.

优化:
map端:
1).可以增加环形缓冲区的大小,默认为100m,80%溢写,可适当调为200M,95%溢写,减少溢写次数
2).可以增大小文件合并的数据,可增大为15-20个,减少合并次数
3).在不影响业务的情况下可以在map端预聚合,减少网络传输的数据
4).输入小文件处理,可归档为一个大文件,是使用combinerInputformat,小文件不可避免,可以开启jvm重用
5).输入文件可以采用lzo压缩,输出可以采用snapy,lzo压缩,减少网络传输量
reduce端:
1).可以增加拉取数据的线程数,减少拉取数据的时间
2).可以增加reduce的内存大小,减少溢写磁盘
3).根据需要可以对输出文件进行压缩
发表于 2019-09-20 10:01:16 回复(0)