Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lec1:入门介绍(以MapReduce为例) #2

Open
chaozh opened this issue Apr 10, 2017 · 3 comments
Open

Lec1:入门介绍(以MapReduce为例) #2

chaozh opened this issue Apr 10, 2017 · 3 comments

Comments

@chaozh
Copy link
Owner

chaozh commented Apr 10, 2017

课前阅读论文:MapReduce(2004)
观看视频:Lecture1讲义
代码实验:Lab1-MapReduce

参考资料:

  1. MapReduce简介
  2. 相关论文资料
@chaozh chaozh changed the title Lec1:Introduction Lec1:入门介绍(以MapReduce为例) Apr 10, 2017
@chaozh
Copy link
Owner Author

chaozh commented Apr 10, 2017

什么是分布式系统?
是类似P2P文件交换系统、MapReduce、DNS等。
为何选择分布式架构?

  • 联通物理上分散的节点
  • 通过各个节点的资源隔离保证安全
  • 通过备份实现高可用
  • 方便横向资源扩展

但是分布式系统实现很复杂,需要解决各个层次上的并发,肯定会出现部分节点失效的情况,还需要有很强的系统性能优化能力(操作系统、文件系统、网络Lan->Wan、数据库等底层的优化使用)。本质上还是解决体系结构的老问题。体系结构无非三大领域:计算、存储、网络。这三大领域中关于分布式系统工程实现都有一些共性的需要解决的问题,包括

  • 基础组件实现:RPC机制、线程机制、并发控制等如何高效实现
  • 线性横向扩展:节点越多越难实现,比如负载不均衡、部分逻辑无法并发、共享资源形成瓶颈等情况都怎么处理
  • 容错性:肯定会出现节点失效,如何故障隔离,如何保证高可用。
  • 一致性保证:各个节点都有可能出问题的情况下,通信存在延迟的情况下,包括网络分割等情况都如何处理;强一致又必然损耗性能,如何做到性能与一致性之间的设计平衡

这些都是分布式系统设计与实现中需要考虑研究的问题。

@chaozh
Copy link
Owner Author

chaozh commented Apr 10, 2017

让我们以MapReduce为例看看这个架构如何碰到上面的这些问题,又是如何解决的。

严格来讲,MapReduce是一种分布式计算模型,用于解决大于1TB数据量的大数据计算处理。著名的开源项目Hadoop和Spark在计算方面都实现的是MapReduce模型。从论文中可以看到花了不少篇幅在讲解这个模型的原理和运行过程,但同时也花了一点篇幅来讲解处理分布式系统实现中可能遇到的问题。

MapReduce的模型设计很容易进行水平横向扩展以加强系统的能力,基本分为两种任务:map和reduce,通过map任务完成程序逻辑的并发,通过reduce任务完成并发结果的归约和收集,使用这个框架的开发者的任务就是把自己的业务逻辑先分为这两种任务,然后丢给MapReduce模型去运行。设计上,执行这两种任务的worker可以运行在普通的PC机器上,不需要使用太多资源。当系统整体能力不足时,通过增加worker即可解决。

那么什么更容易导致系统性能扩展的瓶颈?CPU?内存?磁盘?还是网络?在2004年这篇文章问世的时候回答还是”网络带宽“最受限,论文想方设法的减少数据在系统内的搬运与传输,而到如今数据中心的内网速度要比当时快多了,因此如今更可能的答案恐怕就是磁盘了,新的架构会减少数据持久化到磁盘的次数,更多的利用内存甚至网络(这正是Spark的设计理念)

如何处理较慢的网络?参考论文3.4节减少网络带宽资源的浪费,都尽量让输入数据保存在构成集群机器的本地硬盘上,并通过使用分布式文件系统GFS进行本地磁盘的管理。尝试分配map任务到尽量靠近这个任务的输入数据库的机器上执行,这样从GFS读时大部分还是在本地磁盘读出来。中间数据传输(map到reduce)经过网络一次,但是分多个key并行执行

如何做负载均衡?某个task运行时间比较其他N-1个都长,大家都必须等其结束那就尴尬了,因此参考论文3.5节、3.6节系统设计保证task比worker数量要多,做的快的worker可以继续先执行其他task,减少等待。(框架的任务调度后来发现更值得研究)

如何做容错性?参考论文3.3节重新执行那些失败的MR任务即可,因此需要保证MR任务本身是幂等且无状态的。

更特别一些,worker失效如何处理?将失败任务调配到其他worker重新执行,保证最后输出到GFS上的中间结果过程是原子性操作即可。(减少写错数据的可能)

Master失效如何处理?因为master是单点,只能人工干预,系统干脆直接终止,让用户重启重新执行这个计算

其实还有部分工程问题,这篇文章中并没有讨论,可能因为这些更偏重工程实践,比如:task任务的状态如何监控、数据如何移动、worker故障后如何恢复等。

最后总结一下MapReduce,这是个非常成功的分布式系统模型设计,尽管它可能不是某个问题的最佳解决方案,但是它是最通用化的解决方法(有点类似集装箱,不一定可以装最多,但是最容易标准化)。利用它你可以很轻松的将程序的逻辑进行标准化并放到多节点上并行执行。这种标准化模型的横向扩展性很强,同时因为标准化也解决了分布式系统中需要处理的种种问题,成功简化了分布式应用的开发,使得大数据处理程序得以工业级流水线生产,普通开发人员即可胜任,可谓是开启大数据时代的发明。它在工程设计上各个特性的取舍实践也很有学习的价值。

@ChelesteWang
Copy link

ChelesteWang commented Nov 21, 2020

Lab links and expiration
Update lab1 link
https://pdos.csail.mit.edu/6.824/labs/lab-mr.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants