MIT6.824 分布式系统之lab1 mapReduce

这篇博客详细介绍了MIT6.824分布式系统实验第一部分——MapReduce的实现,包括映射/减少输入输出、单工字数统计、任务分发、处理工作者失败等环节,以及可选的倒排索引生成实验。内容涵盖实验原理、思路和解决方案,旨在帮助读者理解MapReduce并动手实践。
摘要由CSDN通过智能技术生成

本篇博文记录了我的lab1实现原理,思路以及答案。希望对大家有所帮助,也希望大家踊跃的指出错误和欢迎提出更好的思路算法。共勉。

前言

首先在做本实验之前,必须先阅读mapReduce论文
《MapReduce: Simplified Data Processing on Large Cluster 》
能看懂英文原版的当然看英文最好,看不懂的网上也有很多翻译版,大家自行查阅。可能翻译版都是靠翻译软件翻译的,很多地方有逻辑语义错误,不过问题不大,只是读起来别扭,看懂应该没问题的。

实验解析

论文我就不说了,不是本文的重点,本文重在讲解实验。

实验0 实验准备

做实验之前要先把官方提供的实验代码下载下来
具体下载方法实验指导书上面也写的很详细。大家按着提示下载就行了

$ git clone git://g.csail.mit.edu/6.824-golabs-2018 6.824
$ cd 6.824

实验一 映射/减少输入和输出

本实验完成common_map.go中的doMap()函数和 common_reduce.go中的doReduce()这两个函数。

doMap管理一个映射任务:它应该读取一个输入文件(inFile),为该文件的内容调用用户定义的映射函数(mapF),并将mapF的输出划分为nReduce中间文件。也就是说doMap的任务是把输入文件的内容分成一个一个的键值对然后进行输出

每个reduce任务有一个中间文件。文件名包含map任务编号和reduce任务编号。需要用到官方提供的
reduceName(jobName, mapTask, r)生成的文件名作为reduce任务r的中间文件,这个r如何取值呢?官方提供了一个ihash函数,将每个key传入ihash函数,返回一个int,最后再用此int mod nReduce就可以了。

还有一点就是由于reduce的输出必须是json格式,为了方便起见,这里的输出文件最好也输出为json格式(非必须)

func doMap(
	jobName string, // the name of the MapReduce job
	mapTask int, // which map task this is
	inFile string,
	nReduce int, // the number of reduce task that will be run ("R" in the paper)
	mapF func(filename string, contents string) []KeyValue,
) {
   
	
	// 打开输入文件
	file,err:=os.OpenFile(inFile,os.O_RDONLY,0644)
	if err!=nil {
   
		fmt.Println("map 66文件打开失败:",err)
	}
	//记得关闭文件
	defer file.Close()
	//文件内容读取操作
	reader:=bufio.NewReader(file)
	FileContent,err1:=ioutil.ReadAll(reader)
	if err1!=nil {
   
		fmt.Println("map 74 文件打开失败:",err1)
	}
	ReduceKeyValue:=mapF(inFile,string(FileContent))
	//生成reduce中间文件
	for i:=0;i<nReduce;i++{
   
		//中间文件命名规则 由项目提供的函数命名
		RName:=reduceName(jobName,mapTask,i)
		mapOutFile,err2:=os.OpenFile(RName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
		if err2!=nil{
   
			fmt.Println(RName,"map 82 文件打开失败",err2)
		}

		//写入文件 使用json格式
		enc:=json.NewEncoder(mapOutFile)

		for _,value:=range ReduceKeyValue{
   
			if ihash(value.Key)%nReduce==i {
   
				err3:=enc.Encode(&value)
				if err3!=nil {
   
				fmt.Println<
MIT 6.824 课程的 Lab1 是关于 Map 的实现,这里单介绍一下实现过程。 MapReduce 是一种布式计算模型,它可以用来处理大规模数据集。MapReduce 的核心想是将数据划分为多个块,每个块都可以在不同的节点上并行处理,然后将结果合并在一起。 在 Lab1 中,我们需要实现 MapReduce 的基本功能,包括 Map 函数、Reduce 函数、分区函数、排序函数以及对作业的整体控制等。 首先,我们需要实现 Map 函数。Map 函数会读取输入文件,并将其解析成一系列键值对。对于每个键值对,Map 函数会将其传递给用户定义的 Map 函数,生成一些新的键值对。这些新的键值对会被分派到不同的 Reduce 任务中,进行进一步的处理。 接着,我们需要实现 Reduce 函数。Reduce 函数接收到所有具有相同键的键值对,并将它们合并成一个结果。Reduce 函数将结果写入输出文件。 然后,我们需要实现分区函数和排序函数。分区函数将 Map 函数生成的键值对映射到不同的 Reduce 任务中。排序函数将键值对按键进行排序,确保同一键的所有值都被传递给同一个 Reduce 任务。 最后,我们需要实现整个作业的控制逻辑。这包括读取输入文件、调用 Map 函数、分区、排序、调用 Reduce 函数以及写入输出文件。 Lab1 的实现可以使用 Go 语言、Python 或者其他编程语言。我们可以使用本地文件系统或者分布式文件系统(比如 HDFS)来存储输入和输出文件。 总体来说,Lab1 是一个比较简单的 MapReduce 实现,但它奠定了 MapReduce 的基础,为后续的 Lab 提供了良好的基础。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值