mysql怎么输出函数运行结果_task运行的函数是怎么从driver传给executor的?

6cc4d30b63ef502c0ee9568fdec3c27d.png

在你面试的时候,可能你会说到整个流程,说到怎样确定driver、怎样初始化sc、触发job,到提交task,你可能很轻松的说出task是driver端通过层层封装,发给executor的,但是你如果不去看一下源码,可能你永远都不会知道这个有意思的地方——task运行的函数是通过广播方式发过去的

其实仔细看spark相关源码,可以在DAGSchedulersubmitMissingTasks方法中发现如下代码:

  private def submitMissingTasks(stage: Stage, jobId: Int) {
    ...
    var taskBinary: Broadcast[Array[Byte]] = null
    try {
      var taskBinaryBytes: Array[Byte] = null
      taskBinaryBytes = stage match {...}
      taskBinary = sc.broadcast(taskBinaryBytes)
    } catch {
      ...
    }

    val tasks: Seq[Task[_]] = new ShuffleMapTask(..., taskBinary)

    taskScheduler.submitTasks(new TaskSet(
        tasks.toArray,...))
  }

我们可以看到,实际上提交的TaskSet封装的并不是直接序列化后的task,而是对应的广播

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值