其他分享
首页 > 其他分享> > Spark2.x精通:三种ShuffleWriter触发条件

Spark2.x精通:三种ShuffleWriter触发条件

作者:互联网

一、概述


      上篇文章:Spark2.x精通:Shuffle演进历程及Shuffle两阶段划分;我们在了解了Spark Shuffle的技术演进历程,Spark2.x已经彻底废弃了Hash机制的Shuffle, 只剩下基于Sort的Shuffle机制。我们可以在配置文件指定spark.shuffle.manager,如果没有指定默认就是sort,但是tungsten-sort也是基于SortShuffleManager的。


    基于Sort的Shuffle Writer有三种实现:BypassMergeSortShuffleWriter

、UnsafeShuffleWriter、SortShuffleWriter,这篇文章我们主要看看在Spark2.x是如何选择使用哪种Shuffler Writer处理的。


二、Shuffle触发条件


 1.我们结合源码来看ShuffleManager是如何来决定选择实例化哪一种ShuffleHandle,如果注册的是SerializedShuffleHandle,就获取UnsafeShuffleWriter;如果注册的是BypassMergeSortShuffleHandle,就获取BypassMergeSortShuffleWriter;如果注册的是BaseShuffleHandle,就获取SortShuffleWriter,registerShuffle()函数代码如下:

  override def registerShuffle[K, V, C](      shuffleId: Int,      numMaps: Int,      dependency: ShuffleDependency[K, V, C]): ShuffleHandle = {      /*先判断是否满足BypassMergeSortShuffleHandle条件*/    if (SortShuffleWriter.shouldBypassMergeSort(conf, dependency)) {      new BypassMergeSortShuffleHandle[K, V](        shuffleId, numMaps, dependency.asInstanceOf[ShuffleDependency[K, V, V]])       /*再判断是否满足SerializedShuffleHandle条件*/    } else if (SortShuffleManager.canUseSerializedShuffle(dependency)) {      // Otherwise, try to buffer map outputs in a serialized form, since this is more efficient:      new SerializedShuffleHandle[K, V](        shuffleId, numMaps, dependency.asInstanceOf[ShuffleDependency[K, V, V]])     /*最后才是BaseShuffleHandle*/    } else {      // Otherwise, buffer map outputs in a deserialized form:      new BaseShuffleHandle(shuffleId, numMaps, dependency)    }  }


2.上面registerShuffle()函数的各个策略的判断条件,这里详细说一下:


1).BypassMergeSortShuffleWriter(对应BypassMergeSortHandle)的触发条件如下:


a.map端不能进行aggregation聚合操作

b.不能指定ordering,即分区内数据不能排序

c.分区的数目必须小于 spark.shuffle.sort.bypassMergeThrshold指定的阀值,默认值是200


2).UnsafeShuffleWriter触发条件(对应SerializedShuffleHandle)的触发条件如下:


a.shuffle依赖不带有聚合操作

b.支持序列化值的重新定位

c.分区数量少于16777216个


3).SortShuffleWriter(对应BaseShuffleHandle)

    上面如果不满足,默认是这个策略,用于处理所有其他情况。


    后面我会详细讲解三种Writer策略的原理和具体的实现细节,感谢关注!!!


标签:触发,numMaps,Shuffle,Spark2,ShuffleWriter,dependency,BaseShuffleHandle,SortShuffle
来源: https://blog.51cto.com/15080019/2653918