Spark Shuffle详解

一:到底什么是Shuffle?
Shuffle中文翻译为“洗牌”,需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。
二:Shuffle可能面临的问题?运行Task的时候才会产生Shuffle(Shuffle已经融化在Spark的算子中了)。
1, 数据量非常大,从其他各台机器收集数据占用大量网络。
2, 数据如何分类,即如何Partition,Hash、Sort、钨丝计算;
3, 负载均衡(数据倾斜),因为采用不同的Shuffle方式对数据不同的分类,而分类之后又要跑到具体的节点上计算,如果不恰当的话,很容易产生数据倾斜;
4, 网络传输效率,需要在压缩和解压缩之间做出权衡,序列化和反序列也是要考虑的问题;
说明:具体的Task进行计算的时候尽一切最大可能使得数据具备Process Locality的特性;退而求次是增加数据分片,减少每个Task处理的数据量。
注:除非你的计算特别复杂,否则的话,都要要求所有的数据在内存中,即是说任务很多需要排队,但是总体的运行速度更快,一般情况下,进行持久化是没有什么收益的,而读中间结果cache得到的价值,还不如出错的情况下重算一遍,除非计算链条特别长,计算特别的复杂。
Cache的风险:
1. 有风险,例如,Memory溢出的风险,例如说被别人占用掉这个内存的风险。
2. 读磁盘是一个高风险的事,但是读内存就更安全,这是在一个Stage内提倡的。
但是Shuffle是需要网络通信,这个时候就需要持久化,因为所有的父Stage算完,才能进行下一个Stage的计算,所以没有持久化,下一个Stage出错的话就需要全部重计算,Shuffle默认持久化到磁盘里,也可以持久化到内存中,Tachyon,Locality System中。Spark默认遇到Shuffle都会将结果进行持久化的。
二:Hash Shuffle
1, 要求key不能是Array;
2, Hash Shuffle不需要排序,此时从理论上讲就节省了Hadoop MapReduce中进行Shuffle需要排序时候的时间浪费,因为实际生产环境有大量的不需要排序的Shuffle类型;
思考:不需要排序的Hash Shuffle是否一定比需要排序的Sorted Shuffle速度更快?不一定!如果数据规模比较小的情形下,Hash Shuffle会比Sorted Shuffle速度快(很多)!但是如果数据量大,此时Sorted Shuffle一般都会比Hash Shuffle快(很多),因为如果数据规模比较大,Hash Shuffle甚至无法处理,因为Hash Shuffle会产生很多的句柄,小文件,这时候磁盘和内存会变成瓶颈,而Sorted Shuffle就会极大的节省内存和磁盘的访问,所以更有利于更大规模的计算。Hash Shuffle适合中小型规模的数据计算。
3, 每个ShuffleMapTask会根据key的哈希值计算出当前的key需要写入的Partition,然后把决定后的结果写入单独的文件,此时会导致每个Task产生R(指下一个Stage的Task并行度)个文件,如果当前的Stage中有M个ShuffleMapTask,则会产生M*R个文件!!!此时数据已经分好类了,下一个Stage就会通过网络根据Driver端的注册信息,因为上一个Stage写过的内容会注册给Driver,然后向Driver获取上一个Stage的输出位置&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值