前言:
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的关系