广播变量broadcast
#定义
map_list = {(1,'dawang',22),(2,'xiaogou',333).....}
broadcast = sc..broadcast(map_list)
#使用
for i in broadcast.value:
print(i)
累加器accumulator
from pyspark import SparkConf, SparkContext, StorageLevel
from operator import add
if __name__ == '__main__':
# 1.通过sparkcof创建conf对象
conf = SparkConf().setAppName('test').setMaster('local[*]')
# 2.生成sc对象
sc = SparkContext(conf=conf)
# spark提供的参数,参数是初始值
aclator = sc.accumulator(0)
rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7], 2)
def add_num(data):
global aclator
aclator += 1
rdd2 = rdd.map(add_num)
rdd2.cache()
rdd2.collect()
rdd3 = rdd.map(lambda x: x)
rdd3.collect()
DAG-执行流程图
DAG的宽依赖(shuffle)和窄依赖
spark如何做内存计算,DAG的作用?stage阶段划分的作用?
spark为什么比mapreduce快?
- spark算子丰富,mapreduce只有map和reduce两个算子.
- mapreduce是在磁盘上进行交互,遇到复杂的极端涉及的磁盘交互会更多.运算就会变慢.
- spark可以走内存迭代计算,算子之间形成DAG,DAG根据宽窄依赖划分出阶段,单一阶段内形成内存管道迭代.
spark并行度
集群中如何规划并行度,一般是cpu核心的2~10倍.
spark的任务调度过程
- 逻辑DAG的产生
- 分区DAG的产生
- task分区任务的产生
- 将task分散给executor并监控其工作(worker的工作,上面三个是driver的工作)
spark层级关系梳理
DAG的知识总结
DAG是有向无环图,用于描述任务执行流程,主要协助DAG调度器构建task,分配用作任务管理
基于款窄依赖进行阶段划分,阶段内部都是窄依赖可以构建内存迭代的管道.
构建task分配用做任务管理