当前位置: 首页 > news >正文

Java 序列化和Scala的闭包的区别和注意点

背景

最近在做一些scala闭包和java序列化的问题回顾,具体的是Spark DPP(动态分区裁剪)导致的DataSourceScanExec NullPointerException问题分析以及解决
在此记录一下,主要是文章说到的 DataSourceScanExec 中 maxMetadataValueLength字段的序列化和反序列化问题

trait DataSourceScanExec extends LeafExecNode {def relation: BaseRelationdef tableIdentifier: Option[TableIdentifier]protected val nodeNamePrefix: String = ""override val nodeName: String = {s"Scan $relation ${tableIdentifier.map(_.unquotedString).getOrElse("")}"}// Metadata that describes more details of this scan.protected def metadata: Map[String, String]protected val maxMetadataValueLength = sqlContext.sessionState.conf.maxMetadataStringLength...

在这里说到了DataSourceScanExec的实现类FileSourceScanExecdoCanonicalize方法会new FileSourceScanExec对象(这里会在Executor调用),所以导致 maxMetadataValueLength这行代码报空指针问题,因为 sqlContext 标记为了@transient,这样在新建该对象的时候就会初始化 maxMetadataValueLength ,所以就NPE了,
而之所以不会再Executor反序列化RDD的时候报错,是因为 maxMetadataValueLength 在序列化的时候,获取的值是 具体的整数值,会直接把该整数值给序列化,这样在反序列化的时候,直接获取的就是对应的整数值。

Java序列化

java序列化的时候,只会序列化实例变量所引用的对象,如

SparkConf confRef = conf	

如果是以下这种就不会序列化对应的SparkConf对象:

int maxMetadataValueLength = conf.maxMetadataStringLength	

这是因为该maxMetadataValueLength已经获取到了对应的整数类型值了,不需要conf了。

Scala闭包

什么是Scala闭包

Scala 闭包是一种函数,它能够捕获并包含其定义环境中的自由变量,使其在函数外部的作用域结束后依然可用。 闭包由两部分组成:一个函数和该函数引用的外部变量。 这种机制允许函数访问和操作其定义时所在的上下文变量,即使在调用该函数时外部变量已经超出作用域

如果此时你这么定义:

val conf = new SparkConf().set("key", "value")val processFunc = (x: Int) => {val maxMetadataValueLength = conf.maxMetadataStringLength  // 闭包内部定义x + maxMetadataValueLength
}

这个时候闭包就会引用conf 对象,也就是说该conf对象会在闭包中存在一个成员变量并引用该对象。在spark中 ClosureCleaner 会 clone 一份该对象。
那如何规避,在闭包中不引用该对象呢:
可以通过 预计算值方法,如下:

val conf = new SparkConf().set("key", "value")
val maxMetadataValueLength = conf.maxMetadataStringLength  // 先计算val processFunc = (x: Int) => {x + maxMetadataValueLength  // 闭包只引用值,不引用 conf
}
http://www.dtcms.com/a/517120.html

相关文章:

  • 莘庄做网站视频直播怎么赚钱的
  • 南昌网站seo公司电商网站的功能
  • 注销之后logonui.exe依然有事情要做
  • 短租网站那家做的好处富力海外网络推广
  • 【C++ STL 深入解析】insert 与 emplace 的区别与联系(以 multimap 为例)
  • 文件系统LittleFS
  • day16_接口加强练习
  • 潍坊中脉网站建设公司做个网站多少钱一个月
  • PHP+Ajax网站开发典型实例3d建模自学
  • 雪崩阵列中的多域物理串扰模型
  • 注册公司网站模版怎么自己做网页
  • 四网合一的网站个人网站可以做推广吗
  • 做网站是用wordpress还是DW谷歌海外推广怎么做
  • 蛋白表达系统的技术布局与应用
  • C++11 核心新特性:从语法重构到工程化实践
  • C# 上传票据文件 调用Dify的API完成OCR识别
  • 交换机Super密码配置方法(V7
  • 做网站的实施过程足球梦网站建设的基本思路
  • 安阳市住房和城乡建设厅网站华为做网站
  • 欧普建站网页设计与网站建设全攻略
  • 怎么优化自己网站wordpress文章不显示图片
  • 网站公司建立网页设计素材哪里找
  • 网站友情链接交易平台wordpress首页模块排序权限修改
  • 下列哪一项不属于电子商务网站建设网站标题作弊详解
  • 网络故障排查三板斧:路由追踪、端口检查,快速定位网络问题
  • 一站式服务平台官网wordpress后台字体修改
  • Flink状态编程之算子状态(OperatorState)
  • 哔哩哔哩修改版 8.64.0| 去除多项冗余内容和广告,精简流畅好用
  • 如何写网站建设报告3d动画制作流程
  • 网站建设合同表(书)注册万维网网站