Spark-core—RDD序列化
1、闭包检查
- 从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor端执行。那么在 scala 的函数式编程中,就会导致算子内经常会用到算子外的数据,这样就形成了闭包的效果。
- 如果使用的算子外的数据无法序列化,就意味着无法传值给 Executor端执行,就会发生错误,所以需要在执行任务计算前,检测闭包内的对象是否可以进行序列化,这个操作我们称之为闭包检测。
2、序列化方法和属性
从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 Executor端执行。
1)Task not serializable报错原因
package Operator.action
import org.apache.spark.{
SparkConf, SparkContext}
object Spark07_RDD_Operator_Action {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("Operator").setMaster("local[*]")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(1, 2, 3, 4))
val user = new User()
rdd.foreach(
num => {
println( "age= " + (user.age+num))
}
)
sc.stop()
}
class User{
val age:Int=20
}
}
运行以上代码,报错显示定义的User(类)没有序列化。
Exception in thread "main" org.apache