Spark Shuffle原理解析

一:到底什么是Shuffle?

Shuffle中文翻译为“洗牌”,需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。

二:Shuffle可能面临的问题?运行Task的时候才会产生Shuffle(Shuffle已经融化在Spark的算子中了)。

1, 数据量非常大;

2, 数据如何分类,即如何Partition,Hash、Sort、钨丝计算;

3, 负载均衡(数据倾斜);

4, 网络传输效率,需要在压缩和解压缩之间做出权衡,序列化和反序列也是要考虑的问题;

说明:具体的Task进行计算的时候尽一切最大可能使得数据具备Process Locality的特性;退而求次是增加数据分片,减少每个Task处理的数据量。

三:Hash Shuffle

1, key不能是Array;

2, Hash Shuffle不需要排序,此时从理论上讲就节省了Hadoop MapReduce中进行Shuffle需要排序时候的时间浪费,因为实际生产环境有大量的不需要排序的Shuffle类型;

思考:不需要排序的Hash Shuffle是否一定比需要排序的Sorted Shuffle速度更快?不一定!如果数据规模比较小的情形下,Hash Shuffle会比Sorted Shuffle速度快(很多)!但是如果数据量大,此时Sorted Shuffle一般都会比Hash Shuffle快(很多)

3,每个ShuffleMapTask会根据key的哈希值计算出当前的key需要写入的Partition,然后把决定后的结果写入当单独的文件,此时会导致每个Task产生R(指下一个Stage的并行度)个文件,如果当前的Stage中有M个ShuffleMapTask,则会M*R个文件!!!

注意:Shuffle操作绝大多数情况下都要通过网络,如果Mapper和Reducer在同一台机器上,此时只需要读取本地磁盘即可。

Hash Shuffle的两大死穴:第一:Shuffle前会产生海量的小文件于磁盘之上,此时会产生大量耗时低效的IO操作;第二:内存不共用!!!由于内存中需要保存海量的文件操作句柄和临时缓存信息,如果数据处理规模比较庞大的话,内存不可承受,出现OOM等问题!

四:Sorted Shuffle:

为了改善上述的问题(同时打开过多文件导致Writer Handler内存使用过大以及产生过度文件导致大量的随机读写带来的效率极为低下的磁盘IO操作),Spark后来推出了Consalidate机制,来把小文件合并,此时Shuffle时文件产生的数量为cores*R,对于ShuffleMapTask的数量明显多于同时可用的并行Cores的数量的情况下,Shuffle产生的文件会大幅度减少,会极大降低OOM的可能;

为此Spark推出了Shuffle Pluggable开放框架,方便系统升级的时候定制Shuffle功能模块,也方便第三方系统改造人员根据实际的业务场景来开放具体最佳的Shuffle模块;核心接口ShuffleManager,具体默认实现有HashShuffleManager、SortShuffleManager等,Spark 1.6.0中具体的配置如下:

valshortShuffleMgrNames = Map(
"hash" ->"org.apache.spark.shuffle.hash.HashShuffleManager",
"sort" ->"org.apache.spark.shuffle.sort.SortShuffleManager",
"tungsten-sort" ->"org.apache.spark.shuffle.sort.SortShuffleManager")

最新文章

  1. 一个千万量级的APP使用的一些第三方库
  2. mysql数据库添加索引优化查询效率
  3. cached过高导致内存溢出 java head space
  4. MTOM以及在WCF中的应用
  5. iOS开发系列--扩展--播放音乐库中的音乐
  6. 后序/中序--->前序
  7. C#中Delegate
  8. 如何理解 Redux?
  9. c++ string 对象操作
  10. Oracle:对表的CREATE、ALTER、INSERT、RENAME、DELETE操作练习以及主外键约束
  11. macTypeError: slice indices must be integers or None or have an index method
  12. intellij 操作
  13. ssh: connect to host gitlab.alpha.com port 22: Network is unreachable
  14. MySQL的自动补全和语法高亮工具MyCli
  15. java使用memcached1--安装与基本使用
  16. EasyUI Calendar 日历插件,只显示年月。
  17. 【转】 GATK--原始数据预处理
  18. C++解析(24):抽象类和接口、多重继承
  19. 一次安装win10 ubuntu16.0经过记录
  20. Spring 事务不回滚

热门文章

  1. Oracle数据库中number类型在java中的使用
  2. youku视频
  3. Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.
  4. 路径不对 导致FileNotFoundError: [WinError 2] 系统找不到指定的文件, 问题解决办法
  5. jmeter maven自动移动jar包windows 批处理命令
  6. CSS加DIV布局
  7. HDU 1019 Least Common Multiple 数学题解
  8. 志强处理器结尾的ES、QS、正式版的区别
  9. node调试的两种方法
  10. CCDictionary