/**
* !!!!!
* 闭包检测及序列化
* 闭包检测:通俗理解函数或方法会用到方法体外的变量,所以编译的时候不光会检测方法体内语法等问题,会包含用到的方法体外的变量都检测了
* 形式上“闭包”,“必包”
* 序列化在spark程序中的常用场景,executor端有rdd要执行的算子和算子用到的部分数据,另外用到的类数据需要从driver端传到executor端
* 这个类就需要序列化,extends Serializable(或者变成样例类)
* 当然,除了序列化还有另外一种解决思路,就是尽量让方法只调用方法体内的属性,不使用类的属性
*/
/*object Test {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List("hello","hive","hi","scala"))
val search = new Search("h")
search.getMatch4(rdd).collect().foreach(println)
sc.stop
}
//extends Serializable
class Search(query:String) extends Serializable {
def isMatch(s:String): Boolean ={
s.contains(query)
}
def getMatch1(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
rdd.filter(isMatch)
}
def getMatch2(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
rdd.filter(x=>x.contains(query))
}
def getMatch3(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
rdd.filter(x=>x.contains(this.query))
}
def getMatch4(rdd:RDD[String]): RDD[String] ={//这个方法不用序列化
val q = query
rdd.filter(x=>x.contains(q))
}
}
}*/
/**
* !!!!!
* foreach
* 序列化样例
* !!!!!
*/
/*
object Test {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")
val sc: SparkContext = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List[Int](1,2,3,4))
val user = new User()
//RDD算子中传递的函数是会包含闭包操作,那么就会检测功能
//闭包检测
//闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量,闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数
//所以即使rdd为空,看似不需要计算,对象也需要序列化,否则报错
rdd.foreach(
num => {
println(user.age+num)}
)
sc.stop
}
//SparkException: Task not serializable
//对象要进行序列化才可以进行io传输
//java.io.NotSerializableException
//user对象构建在driver端,rdd.foreach中println在Excutor执行,因此需要将user在网络中传递
//所以 class User extends Serializable
//或者 case class User(),因为样例类自动混入序列化特质(自动实现序列化接口)
class User extends Serializable {
var age = 30
}
}
*/
spark闭包检测及序列化
最新推荐文章于 2023-07-04 14:56:07 发布
博客探讨了Spark中闭包检测和序列化的概念。闭包是指函数引用了外部变量,Spark在执行时会检查这些变量。在Spark程序中,序列化是必要的,特别是当数据需要从Driver传到Executor时。示例展示了如何通过`extends Serializable`实现序列化,以及避免闭包的方法。此外,还提到了`foreach`操作中闭包检测的重要性,强调了在RDD操作中对象需要序列化的必要性。
摘要由CSDN通过智能技术生成