zoukankan      html  css  js  c++  java
  • Spark闭包函数从产生到在executor执行经历了什么?

    首先,对RDD相关的操作需要传入闭包函数,如果这个函数需要访问外部定义的变量,就需要满足一定条件(比如必须可被序列化),否则会抛出运行时异常。闭包函数在最终传入到executor执行,需要经历以下步骤:

    1.driver通过反射,运行时找到闭包访问的变量,并封装成一个对象,然后序列化该对象

    2.将序列化后的对象通过网络传输到worker节点

    3.worker节点反序列化闭包对象

    4.worker节点的executor执行闭包函数

    简而言之,就是要通过网络传递函数、然后执行,期间会经历序列化和反序列化,所以要求被传递的变量必须可以被序列化和反序列化,否则会抛类似Error:Task not serializable: java.io.NotSerializableException when calling function outside closure only on classes not objects这样的异常。即使是本地执行时,也会按照上述的步骤执行,这也是为什么不允许在RDD内部直接操作RDD的原因(SparkContext不支持序列化)。同时,在这些算子闭包内修改外部定义的变量不会被反馈到driver端。

  • 相关阅读:
    k8s 1.10 部署springcloud
    TF-IDF关键词提取步骤
    k8s 离线安装
    JWT对SpringCloud进行系统认证和服务鉴权
    centos7 安装 docker-registry
    Docker安装elasticsearch-head监控ES步骤
    tengine 配置应用防火墙
    elasticsearch6.1.3 集成分词器
    centos7 nginx tengine 安装
    elk 搭建
  • 原文地址:https://www.cnblogs.com/itboys/p/13026763.html
Copyright © 2011-2022 走看看