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

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

相关推荐
苍煜4 小时前
Kafka消息零丢失核心全解:生产者acks机制+消费者offset机制
分布式·kafka
何中应14 小时前
RabbitMQ集群搭建
分布式·rabbitmq
薪火铺子14 小时前
Redis 分布式锁与 Redisson 原理深度解析
java·redis·分布式·后端
skilllite作者15 小时前
Deer-Flow 工作流引擎深度评测报告
java·大数据·开发语言·chrome·分布式·架构·rust
摇滚侠15 小时前
Java 项目教程《黑马商城》微服务拆分 20 - 22
java·分布式·架构
乐之者v16 小时前
Kafka 跨服数据同步
分布式·kafka
喜欢流萤吖~16 小时前
分布式搜索引擎:Elasticsearch 从入门到实战
分布式·elasticsearch·搜索引擎
PawSQL16 小时前
同一条SQL,单机秒回,分布式集群卡成PPT——问题究竟出在哪?
数据库·分布式·sql
富士康质检员张全蛋17 小时前
Kafka 消息查找流程和消息读取流程
分布式·kafka
深蓝轨迹18 小时前
Kafka入门教程--帮你理清所有概念和细节
分布式·zookeeper·kafka