Spark之Shuffle(一)--博客园

DT大数据梦工厂由王家林老师及其团队打造,旨在为社会培养100万优秀大数据人才,Spark已是目前大数据行业主流数据处理框架和未来趋势。

关注DT大数据梦工厂公众号:

DT_Spark

查看免费公开课,内容绝对详细。
YY永久免费直播频道:68917580

王家林老师联系方式:

1.什么是shuffle?为什么要Shuffle?

   Shuffle中文翻译为洗牌,需要Shuffle的关键原因是具有共同特点的数据需要汇聚到一个计算节点上进行计算(统计分析)。

2.Shuffle可能面临的问题?运行Task的时候才会产生Shuffle(Shuffle已经融入到了Spark的算子当中)

   1)数据量非常大;

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

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

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

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

3.Hash Shuffle

1) key不能是Array

       Hash Shuffle的key不可以是数组,原因如下源码注释:

/**
* A [[org.apache.spark.Partitioner]] that implements hash-based partitioning using
* Java's `Object.hashCode`.
*
* Java arrays have hashCodes that are based on the arrays' identities rather than their contents,
* so attempting to partition an RDD[Array[_]] or RDD[(Array[_], _)] using a HashPartitioner will
* produce an unexpected or incorrect result.
*/
class HashPartitioner(partitions: Int) extends Partitioner {

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中有MShuffleMapTask,则会M*R个文件!!!

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

    Hash Shuffle的两大死穴:

    第一:Shuffle前会产生海量的小文件于磁盘之上,此时会产生大量耗时低效的IO操作;

    第二:内存不共用!!!由于内存中需要保存海量的文件操作句柄和临时缓存信息,如果数据处理规模比较庞大的话,内存不可承受,出现OOM等问题!  

   Spark升级:

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

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

// Let the user specify short names for shuffle managers
val shortShuffleMgrNames = Map(
"hash" -> "org.apache.spark.shuffle.hash.HashShuffleManager",
"sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager",
"tungsten-sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager")
val shuffleMgrName = conf.get("spark.shuffle.manager", "sort")

 默认情况下:Spark采用val shuffleMgrName = conf.get("spark.shuffle.manager", "sort")。

Shuffle已经融化在Spark的算子中了

posted @ 2016-04-07 14:53  一味00000  阅读(154)  评论(0)    收藏  举报