spark: ClosureCleaner.clean()
spark里面,大量使用了一个方法, ClosureCleaner.clean()
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的内存效率
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步