14. Map Reduce

当计算应用在一个很大的数据集上。会有哪些挑战?

  1. 内存存不下
  2. 速度上不去
    上面2个问题就是并行算法需要解决的。

BATCH VS STREAM
STREAM: 处理完的结果 立刻有反馈 (数据是动态)
BATCH: 每一段时间 离线处理, 返回一次结果 (数据是静态)

为什么要理解MAP REDUCE?
要从算法层面理解它。每个步骤的出发点。
当数据量大了,可以从MAP REDUCE去思考解决经典的算法在大数据量的问题。
比如2 SUM 在大数据里如何用MAP REDUCE解。

第一个例子
Word Count
统计每个词多少次
当数据量不大,直接在内存用HASHMAP 里解决。

空间少一些,SORT + UNIQUE

空间再少, EXTERNAL SORT

当词的数目有限,即使数据量大,也可以放进内存

那如果有多个机器,怎么使得多个机器都用起来?
把输入切割成一个个CHUNK,分配给不同机器。

汇总的机器,会出现瓶颈。最后一个机器(MERGER)过很大的数据集,会造成BOTTLE NECK。


10803273-c126f8882c38bb29.png
image.png

破解方法,
按KEY HASH到不同的汇总机器上。每个机器负责一个KEY RANGE。

Map -> shuffle -> reduce
SHUFFLE 的目的,就是让MAPPER里的APPLE 都映射到同一个REDUCER
那么这个REDUCER 统计出的APPLE 4次,肯定是最终结果的子结果了。
可以根据单词的HASHCODE MODE reducer的机器数目

为了让REDUCER均匀, 可以在前期做SAMPLING
出了最坏的情况,可以把中间结果丢进DFS。
SHUFFLE的好处,REDUCER可以各自处理自己的事,没有OVERLAP。有最大的并行度。


10803273-47b2ed8d17e3a6a3.png
image.png

数据本地性,
起MAPPER的时候,优先选择本地的存数据的机器做MAPPER。这样可以避免网络传输。

例子2,
QUICKLY SORT 1TB DATA

想想如何用MAP REDUCE来解决?
solution 1:
STEP1. 切CHUNK , 分给MAPPER
STEP2. MAPPER自己排序
STEP3. k way merge

瓶颈在最后的MERGER。
那么还是要借鉴SHUFFLE的思想。

REDUCER 的 I个最大的数据, 要比I+1最小的要小。
这样合起来就能是完整的排序结果了。
所以用HASHCODE 就不好了,需要考虑顺序。
按照字符顺序去划分REDUCER。


10803273-75064ca01a2d1557.png
image.png

如何让每个REDUCER尽量的均匀?

先期取一个SAMPLE,看一下分布。
随机采样:b,abc,abd,bcd,abcd,efg,
对采样数据排序: abc,abcd,abd,...
如果REDUCE TASK个数为4, 那么找到3个分割点 ,分别为25%,50%,75%
来了一个新的字符串,用BINARY SEARCH 比3个分割点。就能知道去哪个REDUCER了。
那么分割点的字符串特别长,在比较的时候比较费时。
那么就可以用TRIE树了加速了。


10803273-b3a2013869cc646f.png
image.png

Yahoo Hadoop tutorial
https://developer.yahoo.com/hadoop/tutorial/module4.html

homework:
2-sum 如何用MAP REDUCE
倒排索引 如何用MAP REDUCE

猜你喜欢

转载自blog.csdn.net/weixin_33981932/article/details/87634582