Spark 的 Shuffle 浅析

前言:

Spark: version 2.3.2 (mater branch)

HiBench: version 6

Hadoop: version 2.7.1

一、内容:

1. Terasort测试用例 registerShuffle 里的 dependency 默认会用 Kryo serializer。

因为它是根据  SerializerManager.scala 里的 getSerializer 来判断是否用 Kryo serializer。 而不是用户设置的 spark.serializer                 org.apache.spark.serializer.JavaSerializer 值。参考代码  getSerializer 函数,会根据key和value的类型来选择,如下:

  /**
   * Pick the best serializer for shuffling an RDD of key-value pairs.
   */
  def getSerializer(keyClassTag: ClassTag[_], valueClassTag: ClassTag[_]): Serializer = {
    if (canUseKryo(keyClassTag) && canUseKryo(valueClassTag)) {
      kryoSerializer
    } else {
      defaultSerializer
    }
  }

Spark 官网的文档也做了相关说明,参考 http://spark.apache.org/docs/latest/tuning.html:  Since Spark 2.0.0, we internally use Kryo serializer when shuffling RDDs with simple types, arrays of simple types, or string type.

2. SortShuffleManager里的registerShuffle函数决定job 使用哪种 shufflehandle(来决定用哪种shufflewriter)

注意:Spark 里的 Application/Job/Stage/Task(ShuffleMap/Result Tasks) 关系图如下,并且container(其中一个container 固定跑driver + 其它的container跑tasks(数目=executor数))分配后,会一直使用直到所有stages的Tasks执行完毕。

3. Spark里application, Job, Stage and shuffle的关系

猜你喜欢

转载自blog.csdn.net/don_chiang709/article/details/82968966