开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:高级特性_闭包_Spark 闭包分发】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/12030
高级特性_闭包_Spark 闭包分发
内容简介
一、闭包分发
二、要点
这节我们继续了解 spark 中的闭包,为什么要说闭包的概念,很重要的概念,通过本节的学习就能去规避经常会出现的 bug,理解 dirver 是怎样分发任务的。
一、闭包分发
1.sc.textfile(“dataset/access_log_sample.text”)
//通过 textfile 读取文件
.flatmap(item => item.split(
“”))
// flatmap 进行文件处理 括号内函数每个分区就代表一个 task,函数所代表的 task 会被分发到不同的 executor 中,task 会被分发到不同的节点去执行。
2.item => item.split(“”)函数是闭包,闭包只有在封闭了外部作用域的时候,函数才被称为闭包
.collect()
// collect 收集
Class Myclass
(
Val field =
“hello”
Def dostuff
(rdd:RDD(string]):RDD[string] = {
Rdd.map(x => field + x
)// 函数
}
3.Dostuff 方法中,RDD 进行了 map
(x => field + x)函数中,引用了 myclass 对象中的一个成员变量,说明其可以访问 myclass 这个类的作用域,也是一个闭包,封闭的是 myclass 这个作用域
这个函数可以访问 myclass 的作用域,说明闭包是一个封闭的 myclass 的作用域。
将闭包实例分发到不同 executor 中执行的时候,其依赖类 myclass 这个类当前的对象,因为其封闭了这个作用域。Myclass 和函数都要一起被序列化,分发到不同的节点执行。
问题:如果 myclass 不能被序列化,将会报错
问题:如果在这个闭包中,依赖类一个外部很大的集合,那么这个集合会随着一个 task 分发。可以理解为,其依赖的外部的数据,都会被复制很多份。
二、要点
1.一个函数如果在另一个函数中定义,那么这个函数中依赖了外部的一个变量,那么这个函数就要去持有外部类的对象(作用域),这样我们称函数为闭包
2.在 spark 数据中,算子所传入的函数中,包含了外部的变量,变量和类会随着 task 一起被序列化,分发到不同的 executor 中执行,外部依赖有多少 task,就会被复制多少份。