MIT 6.824 第一次作业MapReduce论文
介绍
MIT 6.824 是麻省理工的一门关于分布式系统的课程,该课程由 12 个单元组成的核心研究生科目,包括演讲、阅读、编程实验室、可选项目、期中考试和期末考试。课程介绍了工程分布式系统的抽象和实现技术,主要主题包括容错、复制和一致性。该课程的大部分内容包括研究和讨论分布式系统的案例研究。
课程主页:https://pdos.csail.mit.edu/6.824/index.html
课程安排: https://pdos.csail.mit.edu/6.824/schedule.html
B站视频: https://www.bilibili.com/video/BV1R7411t71W
技术目的
设计一种抽象, 使得可以执行简单且量大的计算, 将并行化, 容错, 数据分布, 负载均衡这样的细节封装在库里. 使得计算能在合理的时间内完成.
有2个操作, map和reduce.将输入的每条记录执行一个map操作以产生一个key/value的中间结果集合, 对那些具有相同key的值应用一个reduce操作, 进行聚合操作 得到最终结果.
Map Reduce例子
map(String key, String value):
//key: document name, value: document content
foreach(var word in value)
{
EmitInermediate(w, "1");
}
reduce(String key, Iterator values):
//key: a word, values: a list of counts
int result = 0;
foreach(var v in values)
{
result += ParseInt(v);
}
抽象
Map: (k1, v1) => list(k2, v2)
Reduce: (k2, list(v2)) => list(k2, v2)
执行过程
容错
Worker失败
Master周期性的ping每个worker, 如果worker无响应, 那么认定worker挂了. worker执行的completed和in-progress状态的map task都要标记为idle, 重新加入调度, reduce task只需要标记in-progress的.
已经完成的(completed)map task需要重新执行, 因为结果是保存在worker所在的服务器上, 服务器挂了后, 就无法访问了. reduce
Master失败
master失败几率较低, 如果失败, 那么整个mapreduce任务就算失败, 结束任务.
优化
本地化
尽量减少网络传输. Google的输入文件是按64M划分为M个片段, 以GFS管理的, 分散在多个服务器上. Master在分配map task时, 尽量考虑将一个map task分配给存放这个task的文件的服务器上, 否则就尝试放到这个服务器网络上较近距离的服务器上.
任务粒度
两个参数, M和R. 文件会划分为M个片段, 就会有M个map task. 每个map task输出结果到R个文件中. 选择规则: 使每个独立task输入数据限制在16MB到64MB之间, R是worker机器的几倍, 如1TB数据, 2000个worker, M=20000, R=5000.
长尾问题
当一个任务的大多数task都完成时, 只剩少量task花费大量时间完成. 这个就是"长尾"现象. 发生"长尾"现象的服务器往往发生了一些故障, 如CPU, 内存, 磁盘或者网络有故障.
解决长尾问题有个通用解决办法, 当任务接近尾声时, 会将所有剩余的task都复制一份, 只要task的主体或者复制完成, 那么task就算完成, 这样可以明显降低任务的执行时间.
Lab
Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html, 在linux上完成一个简单的mapReduce程序.
之前比较忙, 最近抽了一周, 每天花1~2小时, 终于做完了.
由于一直用的windows, 所以学着搭了个WSL, 用vscode连着WSL, 完成了环境搭建.
再一路学习Go的语法, 函数库等, Go算是入门了.
https://github.com/winwink/MIT6.824
参考
2020 MIT 6.824 分布式系统课程 https://blog.csdn.net/jiangshouzhuang/article/details/104528806/