本文抛开 hadoop shuffle 原理 与 spark shuffle 单纯从逻辑思考。便于对hadoop shuffle 以及 spark shuffle的原理理解。
数据:100亿数据存在1000台分布式系统中,每个机器存储1千万数据,这1千万数据存放在1000个block中,每个block存1万数据
想象一下目标:100亿数据,得到每个关键词的词频
如果是你,你的处理流程是什么呢:
1,每个机器 并行读取 每个block-1数据,按照关键词进行map:
aa
|
1
|
bb
|
1
|
cc
|
1
|
dd
|
1
|
aa
|
1
|
|
|
2,看到有两个aa,合并成一个 aa:2
3,发现内存还有剩余:读取block-2
4,发现与 block-1 的有重复,合并:aa:5
5,一直读取block-n,发现内存不足了,写磁盘:
a,
以先进先出原则,边落盘到本地,
边删除堆内存中的kv数据,
边继续增加新的kv。
b,
写磁盘不能按照原来的block数量 需要重新分区:partition操作
c,写磁盘前需要先对partition内数据做个排序,保证每个partition都是有序的
d,写磁盘前对几个block-1 ~ block-n 的数据足了合并,
aa:5
:combine
7,每个机器内,每个map 都会创建n个partition文件,然后呢
8,每个机器内的所有partitions,做合并:merge ,例如 aa:1,2,3,4,5,100
好了到此 map的事儿就干完了
——————————————————————————————————————————————————————————
reduce过程
9,拉取这1000个机器上的1000个文件
10,两两合并他们,形成统一结果:combine+merge
11,输出:aa:500