20-大数据分析与内存计算-第4章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

依赖关系--窄依赖
窄依赖: • 是指每个父RDD的一个Partition最多
被子RDD的一个Partition所使用。 (独生子女) • 比如map、filter、union等;
注意:一个RDD对不同的父节点可能有不同的依赖方式,可能对父节点1是宽依赖,对 父节点2是窄依赖。
依赖关系--宽依赖
宽依赖: • 是指一个父RDD的Partition会被多个
子RDD的Partition所使用;(超生) • 比如groupByKey、reduceByKey、
sortByKey等;
依赖关系-- DAG的生成
• 什么是DAG:

DAG(有向无环图,Directed Acyclic Graph),原始的RDD通过一系列的转换
就形成了DAG,在spark里每一个操作生成一个RDD,RDD之间连一条边,最后这些
大数据分析与内存计算 第四章
Spark RDD
03
共享变量
——累加器和广播变量
共享变量
Driver Program num=30 counter =0
Worker
executor executor
task num/counter
task
task num/counter
task
task num/couBaidu Nhomakorabeater
04
RDD依赖关系
——RDD操作记录
依赖关系
➢RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确 定性操作来创建。
➢能从其他RDD通过确定操作创建新的RDD的原因是RDD含有从其他 RDD衍生(即计算)出本RDD的相关信息(即血统,Lineage)
➢Dependency代表了RDD之间的依赖关系,分为窄依赖和宽依赖。
共享变量—广播变量
!!!注意事项!!!
1、能不能将一个RDD使用广播变量广播出去? 不能,因为RDD是不存储数据的。可以将RDD的结果广播出去。
2、 广播变量只能在Driver端定义,不能在Executor端定义。 3、 在Driver端可以修改广播变量的值,在Executor端无法修改广播变量的值。 4、如果executor端用到了Driver的变量,如果不使用广播变量在Executor有多少task就有 多少Driver端的变量副本。 5、如果Executor端用到了Driver的变量,如果使用广播变量在每个Executor中只有一份 Driver端的变量副本。
Broadcast : • 一般用于处理共享配置文件,通
用的数据子,常用的数据结构等 等;不适合存放太大的数据 • 不会内存溢出,因为其数据的保 存的 Storage Level 是 MEMORY_AND_DISK 的方式
共享变量—广播变量
>>> b = sc.broadcast([1, 2, 3, 4, 5]) >>> b.value [1, 2, 3, 4, 5] >>> sc.parallelize([0, 0]).flatMap(lambda x: b.value).collect() [1, 2, 3, 4, 5, 1, 2, 3, 4, 5] >>> b.unpersist()
stage划分依据:根据RDD之间的依赖关系将DAG划分为不同的Stage,对于 窄依赖,partition的转换处理在stage中完成计算,对于宽依赖,由于有 shuffle的存在,只能在parentRDD中处理完成后才开始接下来的计算,因此 宽依赖是划分stage的依据。
RDD和他们之间的边组成一个有向无环图。
依赖关系-- DAG的生成
有了计算的DAG图,Spark内核下一步的任务就是根据DAG图将计算划分成任务集,也就是Stage, 这样可以将任务提交到计算节点进行真正的计算。
Stage划分目的:把RDD生成一个个task提交到Executor中执行,所以需要 把RDD 先划分stage再生成task。 一个Stage 生成n个分区个task。
共享变量—累加器
• accumulator

一个全局共享变量,可以完成对信息进行聚合操作。
counter = 0 rdd = sc.parallelize(range(10))
def increment(x): global counter counter += x
rdd.foreach(increment) print("Counter value: ", counter)
共享变量—累加器
!!!注意事项!!!
1、 累加器在Driver端定义赋初始值,累加器只能在Driver端读取最后的值,在Excutor端 更新。
2、累加器不是一个调优的操作,因为如果不这样做,结果是错的
共享变量—广播变量
• Broadcast

一个全局共享变量,可以广播只读变量。
spark1.x:HttpBroadcast 、 TorrentBroadcast spark2.x:TorrentBroadcast TorrentBroadcast:点到点的传输, 有效避免单点故障,提高网络利用 率,减少节点压力
共享变量—累加器
counter = 0
def increment(x): global counter counter += x
rdd = sc.parallelize(range(10)) rdd.foreach(increment) print("Spark Counter value: ", counter)
修改counter
counter = sc.accumulator(0) rdd = sc.parallelize(range(10))
def increment(x): global counter counter += x
rdd.foreach(increment) print("Counter value: ", counter.value)
task
共享变量—累加器
counter = 0 data=(range(10))
def increment(x): global counter counter += x
for i in data: print(i) increment(i)
print("Normal Counter value: ", counter)
相关文档
最新文档