MIT 6.824-Lab 1 MapReduce

1 前言

实验环境配置:https://pdos.csail.mit.edu/6.824/labs/lab-mr.html。

这篇笔记主要起到自我学习过程记录的作用,只写了我完成这个实验的大致步骤和遇到问题的解决思路,没有写我的实现思路(其实我的实现思路也很简单,不像很多大佬都做了优化),所以希望看到这篇文章的大佬不要太过严格,但是如果能对其他人提供帮助的话那就更好了。

2 阅读代码

看一下map函数:

// The map function is called once for each file of input. The first
// argument is the name of the input file, and the second is the
// file's complete contents. You should ignore the input file name,
// and look only at the contents argument. The return value is a slice
// of key/value pairs.
//
func Map(filename string, contents string) []mr.KeyValue {
   
	// function to detect word separators.
	ff := func(r rune) bool {
    return !unicode.IsLetter(r) }

	// split contents into an array of words.
	words := strings.FieldsFunc(contents, ff)

	kva := []mr.KeyValue{
   }
	for _, w := range words {
   
		kv := mr.KeyValue{
   w, "1"}
		kva = append(kva, kv)
	}
	return kva
}

就是靠strings.FieldsFunc,按空格和换行分割一个文件中的所有内容(数字不会保留到切片),最后形成一个巨大的slice words。每个单词就是一个元素。

kva就是kv array。是kv数组,对切片words遍历,每一个word就会生成一个{word, “1”}键值对,然后传到kva里面,最后返回kva。

kva就类似于:[{sheng 1} {jun 1} {a 1} ...]

然后mrsequential.go就会将kva追加到intermediate内。

所以,kva是一个文件的单词切片,intermediate是已完成map任务的所有文件的单词切片

这个和实际MapReduce有区别,因为实际的中间内容不可能全放在一起,而是会做分区放在buckets,以节省内存。

然后会对intermediate里面的元素按字母顺序排序。排完序之后就可以根据前后的key是不是一样进行计数:

// mrsequential.go
i := 0
for i < len(intermediate) {
   
    j := i + 1
    for j < len(intermediate) && intermediate[j].Key == intermediate[i].Key {
   
        j++
    }
    values := []string{
   }
    for k := i; k < j; k++ {
   
        values = append(values, intermediate[k].Value)
    }
    output := reducef(intermediate
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 提供了良好的基础。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值