好程序员大数据培训分享 Hadoop 的 shuffle 过程 ,对大数据感兴趣想要学习或者是想要加入到大数据行业的小伙伴们就随小编一起来看一下吧。
Hadoop 的 shuffle 过程就是从 map 端输出到 reduce 端输入之间的过程,这一段应该是 Hadoop 中最核心的部分,因为涉及到 Hadoop 中最珍贵的网络资源,所以 shuffle 过程中会有很多可以调节的参数,也有很多策略可以研究。这里没有对 shuffle 做深入的分析,也没有读源代码,只是根据资料和使用的一些理解。
map 端:
map 过程的输出是写入本地磁盘而不是 HDFS ,但是一开始数据并不是直接写入磁盘而是缓冲在内存中,缓存的好处就是减少磁盘 I/O 的开销,提高合并和排序的速度。默认的内存缓冲大小是 100M( 可以配置 ) ,所以在书写 map 函数的时候要尽量减少内存的使用,为 shuffle 过程预留更多的内存,因为该过程是最耗时的过程。
当缓冲的内存大小使用超过一定的阈值( 默认 80%) ,一个后台的线程就会启动把缓冲区中的数据写入 (spill) 到磁盘中,往内存中写入的线程继续写入知道缓冲区满,缓冲区满后线程阻塞直至缓冲区被清空。
在数据spill 到磁盘的过程中会有一些额外的处理,调用 partition 函数、 combine 函数 ( 如果设置 ) 、对数据进行排序 ( 按 key 排序 ) 。如果发生多次磁盘的溢出写,会在磁盘上形成几个溢出写文件,在 map 过程结束时,要将这些文件进行合并生成一个大的分区的排序的文件 ( 比较绕 ) 。
另外在写磁盘的时候才用压缩的方式将map 的输出结果进行压缩是减少网络开销很有效的方法。
reduce 端:
reduce 端可能从 n 多 map 的结果中获取数据,而这些 map 的执行速度不尽相同,当其中一个 map 运行结束时, reduce 就会从 jobtractor 中获取该信息。 map 运行结束后 tasktractor 会得到消息,进而将消息汇报给 jobtractor , reduce 定时从 jobtractor 获取该信息, reduce 端默认有 5 个线程从 map 端拖拉数据。
同样从map 端拖来的数据 (pull) 先写到 reduce 端的缓存中,同样缓存占用到达一定阈值后会将数据写到磁盘中,同样会进行 partition 、 combine 、排序等过程。如果形成多个磁盘文件还会进行合并最后一次合并的结果作为 reduce 的输入而不是写入到磁盘中。
reduce 的结果将会写入到 HDFS ,如果执行任务的节点也是 HDFS 的一个节点,本地会保存一个副本。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913864/viewspace-2732470/ ,如需转载,请注明出处,否则将追究法律责任。