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] = withScope {