Spark闭包清理类ClosureCleaner简析
版权声明:本文为博主原创文章,未经博主允许不得转载。
手动码字不易,请大家尊重劳动成果,谢谢
从6月初开始因为一些工作上的事情,已经好久没有写博客了,这次把之前Spark源码阅读中深入了解的Spark闭包清理类ClosureCleaner简单介绍下,将知识留个档以便以后忘记了还有个地方来还原下思路。
Scala闭包机制回顾
在之前文章Spark闭包清理类ClosureCleaner简析中已经简单介绍了Scala的闭包实现方式,即用$outer字段来从闭包中引用外部的变量。
另外在另一篇文章慎用Scala中的return表达式中,介绍了在lambda表达式中,return语句的含义是NonLocalReturn而不是仅仅退出该lambda表达式,因此在lambda表达式中,return语句是很危险的,并且随时可能引起严重的后果。
Spark算子
这里并不会详细讲解Spark的RDD算子,我们仅仅从最简单的一个算子map入手,来看下你在rdd.map(func)中填入的func函数是如何运行在各个执行机之上的。
我们先从RDD类的map源码看起:
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}
def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U] = withSc

本文简述Spark的ClosureCleaner类在解决闭包引用外部不可序列化对象时的作用。首先回顾Scala闭包机制,然后分析Spark算子中的map操作,指出闭包在序列化过程中的要求。接着详细探讨ClosureCleaner如何清理闭包,包括检查return语句、遍历字节码等步骤,以确保任务序列化成功。文章最后提到了ClosureCleaner存在的问题及潜在优化空间。
最低0.47元/天 解锁文章
3123

被折叠的 条评论
为什么被折叠?



