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