大数据 Shuffle 原理与实践(上篇)|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第1天 前几天已经对流式计算、批式计算、spark等等有了一些了解。今天我学习了spark中Shuffle的原理并用python做了一些实践
1.Shuffle的概述
1.1 Map阶段
1.2 Shuffle阶段
1.3 Reduce阶段
1.4为什么Shuffle 对性能非常重要
2.1Shuffle 算子分类
Shuffle在Spark中主要分为4类:repartition、ByKey、join、Distinct 用python的pyspark做的小实践
import pyspark
import random
def inside(p):
x,y = random.random(),random.random()
return x*x + y*y < 1
NUM_SAMPLES = 1000000
sc = pyspark.SparkContext()
count = sc.parallelize(range(0,NUM_SAMPLES)).filter(inside).count()
print("pi is roughly %f"%(4.0 * count/NUM_SAMPLES))
spark源码中RDD的单元测试
spark源码中pairRDDFunctions的单元测试
2.2宽依赖、窄依赖
窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
宽依赖:父RDD的每个分片至多被子RDD中的多个分片所依赖
2.2.1 Shuffle Dependency 构造 -partitioner
两个接口:numberPartitions、getPartition
经典实现:HashPartitioner
2.2.2 shuffle Dependency构造 -Aggregator(优化器)
例如:在上述例子中map步骤中直接数出各类型的个数,那么在reduce步骤中就不再需要用count操作,可直接使用sum createCombiner:只有一个value的时候初始化的方法 mergeValue:合并一个value到Aggregator中 mergeCombiners:合并两个Aggregator
3.Shuffle过程
3.1.1 Hash Shuffle - 写数据
每个partition会映射到一个独立的文件 缺点:生成文件多,同时打开的文件也会非常多
3.1.2 Hash Shuffle - 写数据优化
每个partition会映射到一个文件片段 缺点:文件数量下降没有很多
3.2 Sort shuffle:写数据
每个task生成一个包含所有partition数据的文件(通过排序的方式将相同的partition放到一起,排序会消耗更多的CPU)
3.3 Shuffle - 读数据
每个reduce task 分别获取所有map task生成的属于自己的片段
3.4 Shuffle过程的触发流程
3.5 Shuffle Handle的创建
Register Shuffle时做的最重要的事情是根据不同条件创建不同的shuffle Handle