Google 发表了两篇论文《Google File System》 《Google MapReduce》 《Google File System》简称 GFS,是 Google 公司用于解决海量数据存储的文件系统。 《Google MapReduce》简称 MapReduce,是 Google 的计算框架,基于 GFS。
Map 映射 Reduce 汇聚、缩减 目标:普通人都能理解的理论基础 比如:如何统计北京一共有多少栋楼房?

源数据:
Haidian 200 Haidian 230
Haidian 200 Haidian 230
Haidian 300 Haidian 330
Haidian 400 Haidian 420
Haidian 500 Haidian 540
Haidian 600 Haidian 120

Map->
Haidian 200
Haidian 230
Haidian 200

Haidian 200,300,400,230,600
Reducer:
Haidian sum
MapReduce 概述_数据
原语:<<相同的 key 为一组,这一组数据调用一次 reduce 方法,方法内迭代计算这一组数 据>>
Map-Reduce: 线性依赖关系,先执行完 map,再执行 reduce
MapTask: 映射:保证原语中组的实现 并行度:split split:大小可调整,默认等于 hdfs 中 block 的大小 框架默认,hdfs 一个文件多少个 block,就会有多少个 map 计算级别:split 中一条记录(record)调用一次 map 方法!
ReduceTask: 汇聚: 计算级别:按照组 group 为单位,一组调用一次 reduce 方法! 并行度: 理想状态:多少组 group 对应多少个 reduceTask 但是,其实一个 reduceTask 可以线性处理若干组

术语对比关系:
• block > split
– 1:1(默认)
– N:1
– 1:N
• split > map
– 1:1
• map > reduce
– N:1
– M:N
– 1:1
– 1:N
• group(key)>partition(redues task) reduce(){}
– 1:1
– N:1
– M:N
– 1:N? >违背了原语
• partition > outputfile
– 1:1

1、每个 block 会有 map 任务
2、block 切分为切片,每个切片对应一个 map 任务,默认一个 block 一个切片,一个 map
3、map 默认按行读取切片数据,组成键值对<当前行字节偏移量, “读到的行字符串”>
4、map 函数对该键值对进行计算,输出若干键值对。<key, value, partition> partition 指定该键值对由哪个 reducer 进行处理
5、map 输出的 kvp 写到环形缓冲区,环形缓冲区默认 100MB,阈值 80%,当环缓达到 80% 就向磁盘溢写小文件,该小文件首先按照分区号排序,相同分区号的按 key 进行排序。
6、默认如果落磁盘的小文件达到了 3 个,则进行归并,归并的大文件也是按分区号排序, 相同分区号按照 key 进行排序。只是一个归并。
7、如果 map 任务处理完了,它的输出被下载到 reducer 所在主机 按照 HTTP GET 的方式下载到 reducer: reducer 发送 HTTP GET 请求到 mapper 主机下载数据,该过程是洗牌 shuffle
8、每个 map 任务都要经历运行结束洗牌的过程
9、可以设置 combinClass,先在 map 端对数据进行一个压缩,比如 10w 个<hello,1> 压缩为 1 个<hello, 10w>通过网络 IO 洗牌,肯定要快很多。一般情况下,combineClass 就是一个 reducerClass。

开阔眼界:
尽管 hadoop 框架是 java 开发的,MapReduce 应用不一定得 java 开发。hadoop streaming 允许用户使用可执行文件的方式提供 mapper 和 reducer,创建和执行作业。 hadoop pipes 是一个跟 SWIG 兼容的 C++ API,用于开发 MapReduce 应用(不基于 JNI)。