Spark闭包清理类ClosureCleaner简析

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

Spark闭包清理类ClosureCleaner简析

版权声明:本文为博主原创文章,未经博主允许不得转载。

手动码字不易,请大家尊重劳动成果,谢谢

作者:http://blog.csdn.net/wang_wbq

从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 {
    
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值