大数据 Shuffle 原理与实践(上篇)|青训营笔记

156 阅读2分钟

大数据 Shuffle 原理与实践(上篇)|青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第1天 前几天已经对流式计算、批式计算、spark等等有了一些了解。今天我学习了spark中Shuffle的原理并用python做了一些实践

1.Shuffle的概述

1.1 Map阶段

751C2896422BDDC84D2AF0F8E3CD3682.jpg

D2F1F7B80DCBB1D04CA0C968F30F2533.jpg

1.2 Shuffle阶段

15383249CCC35499FCF752353BDB7AFC.jpg

1.3 Reduce阶段

79DB13E088F0E64EA1200CF1D2ECF226.jpg

1.4为什么Shuffle 对性能非常重要

A806CC9B388BF9723166288FBC456238.jpg

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过程的触发流程

878ED0669A7DAF57C979A42581497342.jpg

3.5 Shuffle Handle的创建

Register Shuffle时做的最重要的事情是根据不同条件创建不同的shuffle Handle