1. MapReduce/Hadoop
1.1. 编程模型
1.1.1. 整体思路
- 解决思路
- 程序员写串行程序
 - 由系统完成并行分布式的执行
 
 - 程序员保证串行程序的正确性
- 编程序时不需要思考并行的问题
 - 调试时只需要保证串行执行正确
 
 - 系统负责并行分布执行的正确性和效率  
- Multi-threading, Socket programming, Data distribution, Job distribution, coordination, load balancing, Fault tolerance
 
 
- 缺点:
 - 牺牲了程序的功能!
 - <key, value>
- 数据由一条一条的记录组成
 - 记录之间是无序的
 - 每一条记录有一个key,和一个value
 - key: 可以不唯一
 - key与value的具体类型和内部结构由程序员决定,系统基本上把它们看作黑
 
 
1.1.3. Map-shuffle-Reduce
Map(ik,iv) -> {<mk,mv>}
Reduce(mk,{mv}) -> {<ok,ov>}
Map 函数

shuffle
为了做Reduce,系统内部做了一个shuffle的操作。
Reduce

Map-shuffle-Reduce

1.1.4. Word count举例

1.1.5. 与SQL Select语句的关系

1.2. 系统实现
1.2.1. 系统架构
系统架构


MapReduce/Hadoop 系统架构

1.2.2. 工作过程
提交作业:
用户向JobTracker提交JobConf。JobConf包括Map函数、Reduce函数(Jar)、配置信息(例如,几个Mappers,几个Reducers)、输入路径、输出路径等Map Task 读数据
JobTracker给mappers分配任务,mapper从HDFS中读取数据块并处理。
Split:一个HDFS数据块
Split 的个数可能多于Mappers个数
- 每个split对应一个Map Task
 - 每个Mapper可能需要处理多个Task
 
优化:就近处理
- JobTracker尽量Mapper处理本机data node存储的split,从而减少网络数据传输的开销
 
InputFormat
- Hadoop提供TextInputFormat,KeyValueInputFormat,SequenceFileInputFormat
 - 如何从提供的输入路径获得数据
 - 如何把输入数据分成split
 - 如何将数据分解成<ik,iv>
 
程序员可以编写自己的InputFormat
- Map Task 执行
 
对于一个split,Mapper
- 对每个<ik, iv>调用一次Map函数生成<mk,mv>
 - 对每个mk调用Partitioner计算其对应的Reduce task id
 - 属于同一个Reduce task的<mk,mv>存储于同一个文件,放在本地硬盘上
 - 每个文件按照mk自小到大排序
 
Partitioner:
- Hadoop默认使用HashPartitionerReduce taskid=hash(mk) % ReduceTaskNumber
 - 程序员可以编写自己的Partitioner
 
- shuffle
 
- Reducer从每个Map task传输中间结果文件
- 每个文件本身已经排好序了
 
 - 对多个结果文件进行归并,从而实现group by
 
- Reduce

 
- 对于每个<mk,{mv}>调用一次Reduce函数
 - 产生的<ok, ov>写入输出文件
 - OutputFormat
 - 每个Reduce task 产生一个单独的文件
 
1.2.3. 容错
HeartBeat(心跳)消息定期发送,向JobTracker汇报进度
JobTracker可以及时发现不响应的机器或速度非常慢的机器
- 这些异常机器被称作Stragglers
 
一旦发现Straggler
- JobTracker就将它需要做的工作分配给另一个worker
 
Straggler是Mapper,将所对应的splits分配给其它的Mapper
- 输入数据是分布式文件,所以不需要特殊处理
 - 通知所有的Reducer这些splits的新对应Mapper
 - Shuffle时从新对应的Mapper传输数据
 
Stragger是Reducer,在另一个TaskTracker执行这个Reducer
Grep
Sorting
Join
2. Microsoft Dryad

Dryad是对MapReduce模型的一种扩展
- 组成单元不仅是Map和Reduce,可以是多种节点
 - 节点之间形成一个有向无环图DAG(Directed Acyclic Graph) ,以表达所需要的计算
 - 节点之间的数据传输模式更加多样
- 可以是类似Map/Reduce中的shuffle
 - 也可以是直接1:1、1:多、多:1传输
 
 - 比MapReduce更加灵活,但也更复杂–需要程序员规定计算的DAG
 
Microsoft内部云计算系统Cosmos基于Dryad
3. 同步图计算系统
3.1. 图算法
3.2. 同步图计算
3.2.1. 图计算模型

3.2.1.1. 特点
- BSP模型

 - 基于顶点的编程模型

 
3.2.1.2. 如何结束











