博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数据中mapreduce的核心,shuffle的理解,以及在shuffle中的优化问题
阅读量:4690 次
发布时间:2019-06-09

本文共 1714 字,大约阅读时间需要 5 分钟。

 

关于shuffle的过程图。

  

一:概述shuffle

  Shuffle是mapreduce的核心,链接map与reduce的中间过程。

  Mapp负责过滤分发,而reduce则是归并整理,从mapp输出到reduce的输入的这个过程称为shuffle过程。

 

二:map端的shuffle 

1.map结果的输出

  map的处理结果首先存放在一个环形的缓冲区。

  这个缓冲区的内存是100M,是map存放结果的地方。如果数据量较大,超过了一定的量(默认80M),将会发生溢写过程。

  在mapred-site.xml中设置内存的大小

    <property>

      <name>mapreduce.task.io.sort.mb</name>

      <value>100</value>

    </property>

  在mapred-site.xml中设置内存溢写的阈值  

    <property>

      <name>mapreduce.task.io.sort.spill.percent</name>

      <value>0.8</value>

    </property>

   

2.溢写过程  

  溢写是系统在后台单独开一个线程去操办。

  溢写过程包括:分区partion,排序sort,溢写spill to disk,合并merge。

  

 

3.分区

  分区分的是80%的内存。

  因为reduce可能有不同的任务,所以会对80M的内存进行分区,将map的输出结果放入的对应的reduce分区中。

  

4.排序

  默认是按照key排序。

  当分区完成之后,对每一个分区的数据进行排序。

5.溢写

  排序之后,将内存的数据写入硬盘。留出内存方便map的新的输出结果。

6.合并

  如果是第一次写入硬盘则不需要考虑合并问题,但是在大数据的情况下,前面已经存在大量的spill文件的时候,这时候需要将它们进行合并。

  将各个分区合并之后,对每一个分区的数据再进行一次排序

   使用归并的方式进行合并,归并算法。

  实现compara,进行比较。

  形成一个文件。

 

三:reduce端的shuffle

1.步骤

  对于reduce端的shuffle,大致分为复制,合并。

2.复制

  当reduce开启任务后,不断的在各个节点复制需要的数据。

3.合并(内含排序)

  复制数据的时候,把可以存放进内存的就把数据存放在内存中,当达到一定的时候,启动merge,将数据写进硬盘。

  如果map数据大于内存需要存放的限制,直接写入硬盘,当达到一定的数量后将其合并为一个文件。

  这时候,reduce开启任务需要的数据在内存中和在硬盘中,最终形成一个全局文件。

4.分组

  《hadoop,1》

  《hadoop,1》

  《yarn,1》

  《hadoop,1》

  《hdfs,1》

  《yarn,1》

  将相同的key放在一起,使用comparable完成比较。

  结果为:

    《hadoop,list(1,1,1)》

    《yarn,list(1,1)》

    《hdfs,list(1)》

 

四:关于Comparator的理解

  不管是排序还是分组,都需要自定义排序器comparable

  Comparator类继承WritableComparator

  

  而WritableComparator完成接口RawComparator

   

  在RawComparator中:

   

  

 

五:shuffle处的优化

1.combine的优化

  

2.下面列举需要修改的程序

  

  

 

3.输出结果

  

  

4.关于压缩方面的优化

  

  注意点:

  

  会出现的问题:

  

 

 六:属于分区的一个思路

  例如,大小写的分区

  一共分为两个区,0代表大写,1代表小写

  

转载于:https://www.cnblogs.com/RHadoop-Hive/p/7414066.html

你可能感兴趣的文章
php生成器使用总结
查看>>
T-SQL中的indexof函数
查看>>
javascript基础之数组(Array)对象
查看>>
mysql DML DDL DCL
查看>>
RAMPS1.4 3d打印控制板接线与测试1
查看>>
python with语句中的变量有作用域吗?
查看>>
24@Servlet_day03
查看>>
初级ant的学习
查看>>
redis数据结构--String
查看>>
POJ 3279 Fliptile (二进制枚举)
查看>>
memcached 细究(三)
查看>>
future
查看>>
关于main函数传参数的问题
查看>>
getTickCount()函数 VS GetTickCount()函数
查看>>
嵌入式jetty
查看>>
2017~回顾分享
查看>>
使用svn——项目的目录布局
查看>>
RSA System.Security.Cryptography.CryptographicException
查看>>
webservice整合spring cxf
查看>>
[解题报告] 100 - The 3n + 1 problem
查看>>