6.824-Lab 1: MapReduce

lab1链接:6.824 Lab 1: MapReduce (mit.edu)

介绍

在这个实验中,你将构建一个MapReduce系统。你将实现一个工作进程(worker process),调用应用程序的Map和Reduce函数,并处理文件的读写,以及一个主进程(master process),分配任务给工作进程并处理失败的工作进程。你将构建的系统与MapReduce论文中描述的相似。

合作政策

你必须自己编写你提交的6.824课程的所有代码,除了我们作为作业一部分提供给你的代码。你不允许查看其他人的解决方案,也不允许查看前几年的解决方案。你可以与其他学生讨论作业,但你不可以查看或复制彼此的代码。这条规则的原因是我们相信通过自己设计和实现实验的解决方案,你将学到最多。

请不要发布你的代码或使其对当前或未来的6.824学生可用。github.com仓库默认是公开的,所以请不要将你的代码放在那里,除非你将仓库设为私有。你可能会发现使用MIT的GitHub很方便,但请确保创建一个私有仓库。

软件

你将使用Go语言实现这个实验(以及所有实验)。Go网站包含大量教程信息。我们将使用Go版本1.13对你的实验进行评分;你也应该使用1.13版本。你可以通过运行go version来检查你的Go版本。

我们建议你在自己的机器上工作,这样你就可以使用你已经熟悉的工具、文本编辑器等。或者,你也可以在Athena上工作。

macOS

你可以使用Homebrew安装Go。安装Homebrew后,运行brew install go。

Linux

根据你的Linux发行版,你可能能够从包仓库中获取最新版本的Go,例如通过运行apt install golang。否则,你可以从Go的网站手动安装二进制文件。首先,确保你运行的是64位内核(uname -a应该提到“x86_64 GNU/Linux”),然后运行:

$ wget -qO- https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz | sudo tar xz -C /usr/local

你需要确保/usr/local/bin在你的PATH中。

Windows

实验可能无法直接在Windows上工作。如果你感到冒险,你可以尝试在Windows子系统中运行Linux,并按照上述Linux指南操作。否则,你可以退回到Athena。

开始

你将使用git(一个版本控制系统)获取初始实验软件。要了解更多关于git的信息,请查看Pro Git书籍或git用户手册。获取6.824实验软件:

$ git clone git://g.csail.mit.edu/6.824-golabs-2020 6.824
$ cd 6.824
$ ls
Makefile src
$

我们为你提供了一个简单的顺序mapreduce实现,在src/main/mrsequential.go中。它一次一个地运行maps和reduces,只在一个进程中。我们还为你提供了一些MapReduce应用程序:word-count在mrapps/wc.go中,文本索引器在mrapps/indexer.go中。你可以按照以下方式顺序运行word count:

$ cd ~/6.824
$ cd src/main
$ go build -buildmode=plugin ../mrapps/wc.go
$ rm mr-out*
$ go run mrsequential.go wc.so pg*.txt
$ more mr-out-0
A 509
ABOUT 2
ACT 8
...

mrsequential.go将其输出留在名为mr-out-0的文件中。输入来自名为pg-xxx.txt的文本文件。

随意借用mrsequential.go中的代码。你还应该查看mrapps/wc.go,以了解MapReduce应用程序代码的样子。

你的任务

你的任务是实现一个分布式MapReduce,由两个程序组成,master和worker。将只有一个master进程,以及一个或多个并行执行的worker进程。在一个真实的系统中,workers会在一堆不同的机器上运行,但对于这个实验,你将在一台机器上运行它们全部。workers将通过RPC与master通信。每个worker进程将向master请求一个任务,从一个或多个文件中读取任务的输入,执行任务,并将任务的输出写入一个或多个文件。如果一个worker在合理的时间内(对于这个实验,使用十秒钟)没有完成其任务,master应该注意到,并将相同的任务分配给另一个worker。 我们已经给你一些代码来开始。master和worker的“main”例程分别在main/mrmaster.gomain/mrworker.go中;不要更改这些文件。你应该将你的实现放在mr/master.gomr/worker.gomr/rpc.go中。

以下是如何在word-count MapReduce应用程序上运行你的代码。首先,确保word-count插件是最新构建的:

$ go build -buildmode=plugin ../mrapps/wc.go

在主目录中,运行master。

$ rm mr-out*
$ go run mrmaster.go pg-*.txt

mrmaster.go的pg-*.txt参数是输入文件;每个文件对应一个“split”,并且是一个Map任务的输入。 在一个或多个其他窗口中,运行一些workers:

$ go run mrworker.go wc.so

当workers和master完成后,查看mr-out-*中的输出。当你完成实验时,输出文件的排序联合应该与顺序输出匹配,如下所示:

$ cat mr-out-* | sort | more
A 509
ABOUT 2
ACT 8
...

我们为你提供了一个测试脚本,在main/test-mr.sh中。测试检查wcindexer MapReduce应用程序在给定pg-xxx.txt文件作为输入时是否产生正确的输出。测试还检查你的实现是否并行运行Map和Reduce任务,以及你的实现是否从运行任务时崩溃的workers中恢复。

如果你现在运行测试脚本,它会挂起,因为master永远不会完成:

$ cd ~/6.824/src/main
$ sh test-mr.sh
*** Starting wc test.

你可以在mr/master.go的Done函数中将ret := false更改为true,以便master立即退出。然后:

$ sh ./test-mr.sh
*** Starting wc test.
sort: No such file or directory
cmp: EOF on mr-wc-all
--- wc output is not the same as mr-correct-wc.txt
--- wc test: FAIL
$

测试脚本期望在名为mr-out-X的文件中看到输出,每个reduce任务一个。空的mr/master.gomr/worker.go实现不会产生这些文件(或做任何其他事情),所以测试失败。

当你完成时,测试脚本的输出应该如下所示:

$ sh ./test-mr.sh
*** Starting wc test.
--- wc test: PASS
*** Starting indexer test.
--- indexer test: PASS
*** Starting map parallelism test.
--- map parallelism test: PASS
*** Starting reduce parallelism test.
--- reduce parallelism test: PASS
*** Starting crash test.
--- crash test: PASS
*** PASSED ALL TESTS
$

你还会看到Go RPC包的一些错误,看起来像

2019/12/16 13:27:09 rpc.Register: method "Done" has 1 input parameters; needs exactly three

忽略这些消息。 一些规则:

  • map阶段应该将中间键分成nReduce个reduce任务的桶,其中nReduce是main/mrmaster.go传递给MakeMaster()的参数。 worker实现应该将X'th reduce任务的输出放在名为mr-out-X的文件中。
  • 一个mr-out-X文件应该包含每个Reduce函数输出的一行。该行应该使用Go的“%v %v”格式生成,调用键和值。在main/mrsequential.go中查看注释“这是正确的格式”。如果你的实现与这种格式偏差太大,测试脚本将会失败。
  • 你可以修改mr/worker.go、mr/master.go和mr/rpc.go。你可以临时修改其他文件进行测试,但请确保你的代码与原始版本一起工作;我们将使用原始版本进行测试。
  • worker应该将中间Map输出放在当前目录的文件中,以便你的worker稍后可以将它们作为Reduce任务的输入读取。
  • main/mrmaster.go期望mr/master.go实现一个Done()方法,当MapReduce作业完全完成时返回true;那时,mrmaster.go将退出。
  • 当作业完全完成时,worker进程应该退出。实现这一点的一种简单方法是使用call()的返回值:如果worker未能联系到master,它可以假设master已经退出,因为作业已经完成,所以worker也可以终止。根据你的设计,你可能还会发现让master给workers一个“请退出”的伪任务很有帮助。

提示

  • 开始的一种方法是修改mr/worker.go的Worker(),发送一个RPC到master请求一个任务。然后修改master以响应尚未开始的map任务的文件名。然后修改worker以读取该文件并调用应用程序Map函数,如mrsequential.go中所示。
  • 应用程序Map和Reduce函数是使用Go插件包在运行时加载的,从以.so结尾的文件中加载。
  • 如果你更改了mr/目录中的任何内容,你可能必须使用类似go build -buildmode=plugin ../mrapps/wc.go的命令重新构建你使用的任何MapReduce插件
  • 这个实验依赖于workers共享一个文件系统。当所有workers都在同一台机器上运行时,这很简单,但如果workers在不同的机器上运行,就需要像GFS这样的全局文件系统。
  • 中间文件的一个合理命名约定是mr-X-Y,其中X是Map任务编号,Y是reduce任务编号。
  • worker的map任务代码需要一种方式将中间键/值对存储在文件中,以便在reduce任务期间可以正确地读回。一种可能性是使用Go的encoding/json包。将键/值对写入JSON文件:
      enc := json.NewEncoder(file)for _, kv := ... {err := enc.Encode(&kv)
    并且读回这样的文件:
     dec := json.NewDecoder(file)for {var kv KeyValueif err := dec.Decode(&kv); err != nil {break}kva = append(kva, kv)}
  • 你的worker的map部分可以使用worker.go中的ihash(key)函数为给定键选择reduce任务。
  • 你可以从mrsequential.go中窃取一些代码,用于读取Map输入文件,用于在Map和Reduce之间排序中间键/值对,以及用于将Reduce输出存储在文件中。
  • 作为RPC服务器的master将是并发的;不要忘记锁定共享数据。
  • 使用Go的竞态检测器,使用go build -race和go run -race。test-mr.sh中有一个注释,向你展示如何为测试启用竞态检测器。
  • Workers有时需要等待,例如,在最后一个map完成之前,reduces不能开始。一种可能性是workers定期向master请求工作,在每次请求之间使用time.Sleep()睡眠。另一种可能性是让master中的相关RPC处理程序有一个循环等待,使用time.Sleep()或sync.Cond。Go为每个RPC的处理程序运行在自己的线程中,所以一个处理程序的等待不会阻止master处理其他RPC。
  • master无法可靠地区分崩溃的workers、出于某种原因停滞的活着的workers和执行过慢以至于无用的workers。你能做的最好的是让master等待一段时间,然后放弃并将任务重新分配给另一个worker。对于这个实验,让master等待十秒钟;之后master应该假设worker已经死了(当然,它可能没有)。
  • 要测试崩溃恢复,你可以使用mrapps/crash.go应用程序插件。它在Map和Reduce函数中随机退出。
  • 为了确保在崩溃发生时没有人观察到部分写入的文件,MapReduce论文提到了使用临时文件并在完全写入后原子地重命名它的技巧。你可以使用ioutil.TempFile创建一个临时文件,使用os.Rename原子地重命名它。
  • test-mr.sh在mr-tmp子目录中运行所有进程,所以如果出了问题,你想查看中间或输出文件,请在那里查看。

提交程序

提交之前,请再次运行test-mr.sh。

使用make lab1命令打包你的实验作业并将其上传到课程的提交网站,位于https://6824.scripts.mit.edu/2020/handin.py/。

你可以使用MIT证书或通过电子邮件请求API密钥首次登录。你登录后会显示你的API密钥(XXX),可以使用它通过控制台上传lab1,如下所示。

$ cd ~/6.824
$ echo XXX > api.key
$ make lab1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现高效的Web自动化测试?

随着互联网的快速发展,Web应用程序的重要性也日益凸显。为了保证Web应用程序的质量和稳定性,Web自动化测试成为必不可少的一环。然而,如何实现高效的Web自动化测试却是一个值得探讨的课题。 首先,选择合适的测试工具是关键。市面…

Android 13.0 原生SystemUI下拉通知栏每条通知默认展开

1.前言 在13.0的系统rom原生开发中,在在对SystemUI下拉通知栏做定制的时候,在下拉状态栏的时候,通知栏中最后一条通知默认是收缩的 点击按钮 就会展开 原生系统systemui就是如此,为了更美观 所以要求最后一条通知也默认展开,显得更美观 最终效果图: 2.原生SystemUI下拉通…

【Eclipse插件开发】3工作台workbench探索【下篇】

【Eclipse插件开发】3工作台workbench探索【下篇】 文章目录 【Eclipse插件开发】3工作台workbench探索【下篇】一、Plugin 类AbstractUIPlugin二、偏好设置2.1 添加一个偏好设置页面2.2 实现用户偏好设置页面定义页面插件偏好存储查找和保存用户偏好设置2.3 编辑区域一、Plugi…

THM学习笔记——枚举

复制以下内容时注意中英文符号区别 在枚举之前我们要将shell升级为完全交互式的tty。 这涉及以下几条命令 python -c import pty;pty.spawn("/bin/bash") stty raw -echo export TERMxterm rlwrap nc -lvnp 443 从以上选一条即可 手动枚举 以下命令只需了解即可&…

VS Code中主程序C文件引用了另一个.h头文件,编译时报错找不到函数

目录 一、问题描述二、问题原因三、解决方法四、扩展五、通过CMake进行配置 一、问题描述 VS Code中主程序C文件引用了另一个.h头文件&#xff0c;编译时报错找不到函数 主程序 main.c #include <stdio.h> #include "sumaa.h"int main(int, char**){printf(&q…

thinkphp获取用户最新的阅读记录,按书籍id去重,返回最新的阅读记录

通过uid查询data_user_zhangjie的记录 去重shuji_id 获取createtime最新的一条数据 //获取用户章节记录public function getUserZhangjieList(){$uid = input(uid);if(empty

接雨水【中等难度】

接雨水【中等难度】 题目解题思路代码复杂度分析题目 题目:接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,…

微信小程序如何实现动态显示和隐藏某个控件

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;微信小程序作为一种轻量级的应用开发平台&#xff0c;越来越受到开发者和用户的关注。在微信小程序的开发过程中&#xff0c;控制元素的显示和隐藏是一个常见的需求。通过动态显示和隐藏某个控件&#xff0c;我们可以根据用户的…

【洛谷 P1177】【模板】排序 题解(向量+排序)

【模板】排序 题目描述 将读入的 N N N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N N N。 第二行包含 N N N 个空格隔开的正整数 a i a_i ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N N N 个数从小到大输出&#xff0c;数之间空格隔…

机器学习 | 一文看懂SVM算法从原理到实现全解析

目录 初识SVM算法 SVM算法原理 SVM损失函数 SVM的核方法 数字识别器(实操) 初识SVM算法 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种经典的监督学习算法&#xff0c;用于解决二分类和多分类问题。其核心思想是通过在特征空间中找到一…

详述FlinkSql Join操作

FlinkSql 的 Join Flink 官网将其分为了 Joins 和 Window Joins两个大类&#xff0c;其中里面又分了很多 Join 方式 参考文档&#xff1a; Joins | Apache Flink Window JOIN | Apache Flink Joins 官网介绍共有6种方式&#xff1a; Regular Join&#xff1a;流与流的 Joi…

使用Softing edgeConnector模块将云轻松连接到Siemens PLC

一 工业边缘的连接解决方案 云服务提供商 (CSP) 引入了服务和功能&#xff0c;以简化基于云的工业物联网解决方案的实施。Azure Industrial IoT Platform或AWS IoT SiteWise支持标准协议和接口&#xff0c;例如OPC UA或MQTT。但是&#xff0c;如果您希望在典型的旧改项目中连接…

LeetCode803. Bricks Falling When Hit——洪水填充

文章目录 一、题目二、题解 一、题目 You are given an m x n binary grid, where each 1 represents a brick and 0 represents an empty space. A brick is stable if: It is directly connected to the top of the grid, or At least one other brick in its four adjacen…

VM安装Centos7

目标&#xff1a; 一&#xff0c;安装Centos7 二&#xff0c;ssh可以连接 1 新建虚拟机 一直下一步 2 直到此处&#xff0c;选择稍后安装 一直下一步直到完成。 3 选中虚拟机&#xff0c;点击设置 选择CD/DVD&#xff0c;选取ISO映像文件。 4 等待安装 并且设置root密码 5…

Redis -- zset有序集合

聪明在于勤奋&#xff0c;天才在于积累。 目录 zset 有序集合 zset相关命令 zadd zcard zcount zrange zrevrange zrangebyscore zpopmax bzpopmax zpopmin bzpopmin zrank zscore zrem zRemRangeByRank zRemRangeByScore zincrby 集合间操作 zinte…

java日志框架总结(五、logback日志框架)

一、logback概述 Logback是由log4j创始人设计的又一个开源日志组件。 Logback当前分成三个模块&#xff1a; 1、logback-core, 2、logback- classic 3、logback-access。 1&#xff09;logback-core是其它两个模块的基础模块。 2&#xff09;logback-…

【操作系统】Ubuntu Swap内存扩容

目录 背景 查看内存信息 确定当前的交换空间大小 查看内存使用情况 查看fstab文件,确认swap分区位置 查看swap分区大小 swap分区扩容 关闭swap分区 创建大的swap文件 格式化swap空间 关闭之前的swap 开启新swap 开机挂载 验证交换空间的大小 背景 在执行某些程序…

详解C++类和对象(中(类的6个默认成员函数))

文章目录 写在前面1. 类的6个默认成员函数2. 构造函数2.1 构造函数的引入2.1 构造函数的特性 3. 析构函数3.1 析构函数的引入3.2 析构函数的特性 4. 拷贝构造函数4.1 拷贝构造函数概念4.2 拷贝构造函数的特性4.3 拷贝构造函数典型调用场景 5. 赋值运算符重载5.1 运算符重载5.2 …

【Android】获取设备IP的方法

序言 在Android开发中&#xff0c;有很多地方需要使用IP地址&#xff0c;但是有时候Android设备获取的IP地址是有区别的&#xff0c;比如如果Android设备创建一个热点&#xff0c;那此时这个Android设备就有两个IP地址了&#xff0c;一个是本身的IP地址&#xff0c;一个是热点…

2024-2-6-复习作业

1> 要求&#xff1a; 源代码&#xff1a; #include <stdio.h> #include <stdlib.h> void output(int arr[],int len) {for(int i0;i<len;i){printf("%d ",arr[i]);}puts(""); } void bubble_sort(int arr[],int len) {for(int i1;i<…