Spark中ClosureClean中的clean方法

转载原文地址:
https://blog.csdn.net/u013761049/article/details/82492581

spark里面,大量使用了一个方法, ClosureCleaner.clean()----闭包资源清除。

为了能将RDD算子正常发送到各个worker节点。那么就需要序列化的类必须是正常的(指该类中的对外部的引用也能找到)

因此对一些没有用的资源进行删除、清理。在这个类的闭包范围内。


 
 
  1. // 这里调用了SparkContext的clean方法
  2. // clean方法实际上调用了ClosureCleaner的clean方法,这里一再清除闭包中的不能序列化的变量,防止RDD在网络传输过程中反序列化失败。
  3. val cleanF = sc.clean(f)

 
 
  1. private[spark] def clean[F <: AnyRef](f: F, checkSerializable: Boolean = true): F = {
  2. // clean方法实际上调用了ClosureCleaner的clean方法,这里一再清除闭包中的不能序列化的变量,防止RDD在网络传输过程中反序列化失败。
  3. ClosureCleaner.clean(f, checkSerializable)
  4. f
  5. }

 
 
  1. def clean(
  2. closure: AnyRef,
  3. checkSerializable: Boolean = true,
  4. cleanTransitively: Boolean = true): Unit = {
  5. // 直接就是调用下面的方法
  6. clean(closure, checkSerializable, cleanTransitively, Map.empty)
  7. }

quora上有一篇参考文章 https://www.quora.com/What-does-Closure-cleaner-func-mean-in-Spark 
大概意思,scala支持闭包(jvm上的闭包当然也是一个对像),闭包会把它对外的引用(闭包里面引用了闭包外面的对像)保存到自己内部, 
这个闭包就可以被单独使用了,而不用担心它脱离了当前的作用域; 
但是在spark这种分布式环境里,这种作法会带来问题,如果对外部的引用是不可serializable的,它就不能正确被发送到worker节点上去了; 
还有一些引用,可能根本没有用到,这些没有使用到的引用是不需要被发到worker上的; ClosureCleaner.clean()就是用来完成这个事的; 
ClosureCleaner.clean()通过递归遍历闭包里面的引用,检查不能serializable的, 去除unused的引用; 
这个方法在SparkContext中用得很多,对rpc方法,只要传入的是闭包,基本都会使用这个方法,它可以降低网络io,提高executor的内存效率 
csdn:http://www.jianshu.com/p/51f5a34e2785 
csdn:http://www.cnblogs.com/ivanny/p/spark_ClosureCleaner_clean_function.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值