【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce

6.5840/6.824 Lab汇总

本文对应的Lab版本为MIT6.5840-Spring2024的Lab1

本博客只提供思路,不会公开任何代码

本lab耗时约6h,码量约500行

MapReduce思想

MapReduce的思想属于是比较简单的,分为两个阶段:

Map阶段将用户指定的输入文件(通常存放于分布式文件系统中,不过本Lab使用本地文件系统来代替),利用用户编写的map函数,将输入文件拆分为(key,value)形式,输出到若干个中间文件中(这些中间文件存放在map函数所运行的机器中,假设后面运行reduce函数的worker有nReduce个,那么每个运行map函数的worker,就需要把拆分出来的kv对分为nReduce个中间文件来存放,可在key上做hash来划分kv对到对应的中间文件中)

Reduce阶段将中间文件读取出来,并按照key进行排序,然后调用用户提供的reduce函数,将相同key的所有value进行聚合,最后输出到文件中。假设存在nReduce个reduce任务,那么最后会产生nReduce个输出文件。

MapReduce框架中,存在一个coordinator(论文里也叫master),用于协调map任务与reduce任务,同时,需要考虑任务crash的问题(重启任务)。

实现思路

代码主要分为两部分:coordinator.go和worker.go

coordinator主要用于回应worker的rpc请求,分为两种请求(分配任务与任务反馈)。coordinator需要维护每一个任务的状态(可使用map),当收到分配任务的请求时,它找出一个未完成的任务并分配给worker(也是通过rpc),指定该任务的类型,并传输所需参数;当收到worker的任务反馈时,判断任务是否成功,并更新任务状态。

同时,coordinator需要监控worker,如果一个worker超过10s还没有回复,那么认为该worker已经crash了,需要重新分配这个worker所运行的任务。

worker则是打工人,需要不断询问coordinator是否有任务做,对于map任务与reduce任务,进行不同的逻辑处理,按照MapReduce框架的思想进行实现就可以了。

感受

第一次使用go,2小时就可以速成,变量声明与赋值都很方便(像python),但它是类型安全的编译型语言,不会产生运行时的类型错误,写起来非常方便。同时,不像C++一样需要内存管理,因为存在gc机制。

当然,目前看到的只是冰山一角,还需要继续深入学习思考。

相关推荐
张彦峰ZYF23 分钟前
投资策略规划最优决策分析
分布式·算法·金融
processflow流程图3 小时前
分布式kettle调度平台v6.4.0新功能介绍
分布式
全栈开发圈3 小时前
干货分享|分布式数据科学工具 Xorbits 的使用
分布式
运维&陈同学5 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
时差9535 小时前
Flink Standalone集群模式安装部署
大数据·分布式·flink·部署
菠萝咕噜肉i5 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
只因在人海中多看了你一眼9 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian11 小时前
Spark 之 Aggregate
大数据·分布式·spark
求积分不加C13 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan052913 小时前
javaer快速上手kafka
分布式·kafka