闭包检测
在scala代码中,算子内经常会用到算子外的数据,这样就形成了闭包。
需要在执行任务计算前,检测闭包内的对象是否可以进行序列化,这个操作我们称之为闭包检测
涉及driver、executor之间的数据交互都需要序列化
Driver:算子以外的代码都是在Driver端执行
Executor:算子里面的代码都是在Executor端执行
序列化问题要注意以下三点:
1. 作为RDD的元素类型的自定义类,必须是可以序列化的;
2. 算子函数里可以使用的外部的自定义变量,必须是可以序列化的;
3. 不可以在RDD的元素类型、算子函数里使用第三方的不支持序列化的类型,例如Connection。
如何序列化
方案一:Serializable
类继承scala.Serializable即可。
class Search() extends Serializable{…}
方案二:kryo
val conf: SparkConf = new SparkConf()
.setAppName(“SerDemo”)
.setMaster(“local[*]”)
// 替换默认的序列化机制
.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)
// 注册需要使用 kryo 序列化的自定义类
.registerKryoClasses(Array(classOf[Searcher]))
class Searcher(val query: String)…
方案二:case calss
把Search类变成样例类,样例类默认是序列化的。
case class Search(query:String) extends Serializable {…}
