【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机制。

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

相关推荐
无心水2 小时前
2025,一路有你!
java·人工智能·分布式·后端·深度学习·架构·2025博客之星
打工的小王6 小时前
消息队列之Kafka(一)搭建服务
分布式·kafka
鸡蛋豆腐仙子7 小时前
redis及实现分布式锁的原理
java·redis·分布式·学习·缓存
蒸蒸yyyyzwd8 小时前
分布式学习笔记 p5-13
笔记·分布式·学习
好家伙VCC8 小时前
**发散创新:用 Rust构建多智能体系统,让分布式协作更高效**在人工智能快速演进的今天,**多智能体系统(
java·人工智能·分布式·python·rust
C澒8 小时前
从单体到分布式:SLDS 2.0 全球物流履约网络架构演进之路
前端·分布式·架构·系统架构·教育电商·交通物流
Jack_David8 小时前
kafka_2.13-4.1.1集群安装
java·分布式·kafka
jiuweiC11 小时前
kafka重平衡问题-golang
分布式·golang·kafka
你这个代码我看不懂18 小时前
@RefreshScope刷新Kafka实例
分布式·kafka·linq