DAG:
影響DAG性能的有以下幾點:
- 反序列化TaskResult實例時使用的SerializerInstance沒有重用
- TaskSchedulerImpl.resourceOffers方法只能單線程處理, 且生成其返回TaskDescription實例 時需要調用耗時的序列化操作
- taskScheduler中有不必要的序列化操作
taskScheduler在創建TaskDescription實例時調用Task.serializeWithDependencies(task, sched.sc.addedFiles, sched.sc.addedJars, ser)
把task和其依賴信息序列化, 但是在SPARK-2521: Broadcast RDD object once per TaskSet (instead of sending it for every task) 合并之后
ResultTask和ShuffleMapTask類不在包含rdd和closure等復雜對象,沒有必要獨立序列化, 可以把TaskDescription類改成下面這樣:
class TaskDescription[T](
val taskId: Long,
val attemptNumber: Int,
val executorId: String,
val name: String,
val index: Int,
val task: Task[T]) extends Serializable