1 .MapReduce/Hadoop 简介
-
MapReduce是目前云计算中最广泛使用的计算模型,Hadoop是MapReduce的一个开源实现
-
解决思路:1. 程序员写串行程序 2. 由系统完成并行分布式地执行
-
程序员保证串行程序的正确性:1. 编程序时不需要思考并行的问题 2. 调试时只需要保证串行执行正确
-
系统负责并行分布执行的正确性和效率
-
缺点:1. 直接进行并行分布式编程,可以完成各种各样丰富的功能 2. 而一个编程模型实际上是限定了程序的功能类型
-
MapReduce:Map(ik, iv) -> {<mk, mv>},Reduce(mk, {mv}) -> {<ok, ov>}
-
Map 函数:
-
Shuffle (由系统完成):
- Shuffle = group by mk
- 对于所有的map函数的输出,进行group by
- 将相同mk的所有mv都一起提供给Reduce
-
Reduce 函数:
-
Map‐shuffle‐Reduce:word count 举例:
-
程序员编制串行的Map函数和Reduce函数
-
系统完成shuffle功能
-
-
MR: Fault Tolerance(容错):
- 定期发送,向JobTracker汇报进度
- JobTracker可以及时发现不响应的机器或速度非常慢的机器,这些异常机器被称作Stragglers
-
Split:一个HDFS数据块;Split 的个数可能多于Mappers个数:1. 每个split对应一个Map Task 2. 每个Mapper可能需要处理多个Task 。优化:就近处理 : JobTracker尽量Mapper处理本机data node存储的split,从而减少网络数据传输的开销
-
对于一个split,Mapper:1. 对每个<ik, iv>调用一次Map函数生成<mk,mv> 2. 对每个mk调用Partitioner计算其对应的Reduce task id 3. 属于同一个Reduce task的<mk,mv>存储于同一个文件,放在本地硬盘上 4. 每个文件按照mk自小到大排序
-
Partitioner: 1. Hadoop默认使用HashPartitioner Reduce task id = hash(mk) % ReduceTaskNumber 2. 程序员可以编写自己的Partitioner
-
MR运行:Shuffle:1. Reducer从每个Map task传输中间结果文件 2. 每个文件本身已经排好序了 3. 对多个结果文件进行归并,从而实现group by
-
MR运行:Reduce:1. 对于每个<mk,{mv}>调用一次Reduce函数 2. 产生的<ok, ov>写入输出文件 3. OutputFormat 4. 每个Reduce task 产生一个单独的文件
-
Combiner:1. Combiner(mk, {mv}) -> <mk, mv’> 2. 传输很多<mk, 1>似乎有些浪费 3. 如果在Mapper一侧,一个mk出现多次,完全可以进行本地的累计,这样只需要传输一个<mk, 本地次数> 4. 这可以用Combiner实现
2. 图算法举例: PageRank
- 初始化:1. 所有的顶点的PageRank为 1 N \frac{1}{N} N1 ,迭代:用上述公式迭代直至收敛
- 问题: N 非常大时,数据精度可能不够?:1. 初始化:所有的顶点的PageRank为1 2. 迭代:用上述公式迭代直至收敛
-
图计算模型:
- 运算分成多个超步,超步间全局同步
- 超步内,并行执行每个顶点
- 顶点算法通常步骤:1. 接收上个超步发出的in‐neighbor的消息 2. 计算当前顶点的值 3. 向out‐neighbor发消息
-
BSP 模型:1. 全部计算分成多个超步(SuperStep) 2. 超步之间进行全局同步 3. 超步内部全部并行,对多个运算单元进行计算,每个超步内部,所有运算,都无依赖地分布式运行 4. 相邻的超步之间存在依赖关系,上一个超步的运算产生下一个超步的输入
- 基于顶点的编程模型:1. 每个顶点有一个value 2. 顶点为中心的运算,程序员可以实现一个Compute函数,在每个超步中,同步图系统对每个顶点调用一次Compute,Compute通常接收消息,计算,然后发送消息
-
图运算如何结束?:顶点的两种状态:1. 活跃态Active:图系统只对活跃顶点调用compute 2. 非活跃态Inactive:compute调用Volt to halt时,顶点变为非活跃态
-
同步图运算系统小结:1. **运算在内存中完成 **2. 基于BSP模型实现同步图运算 3. 基于顶点的编程模型 4. 容错依靠定期地把图状态写入硬盘生成检查点,在一个超步开始时,master可以要求所有的worker,都进行检查点操作