美文网首页
MapReduce 6.824 学习笔记

MapReduce 6.824 学习笔记

作者: 莫Y兮 | 来源:发表于2017-06-06 00:38 被阅读59次

map函数和reduce函数

这两个函数是交给用户实现的,这两个函数定义了任务本身。

map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。

reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

统计词频的MapReduce函数的核心代码非常简短,主要就是实现这两个函数。

// filename 文件名 contents 文件内容
// 将文件内容中的word提出来,并将其value置为1
func mapF(filename string, contents string) (res []mapreduce.KeyValue) {
    // TODO: you have to write this function
    values := strings.FieldsFunc(contents, func(c rune) bool {
        return !unicode.IsLetter(c)
    })
    for _, word := range values {
        res = append(res, mapreduce.KeyValue{Key: word, Value: "1"})
    }
    return res
}

// key Reduce任务负责的key, values Reduce任务对应map结果 key的所有values
// 统计values中元素的个数,就是wordcount
func reduceF(key string, values []string) string {
    // TODO: you also have to write this function
    var cnt int
    for _, value := range values {
        n, err := strconv.Atoi(value)
        if err != nil {
            fmt.Printf("%v make error: %v\n", n, err)
        }
        cnt += n
    }
    return strconv.Itoa(cnt)
}

在统计词频的例子里,map函数接受的键是文件名,值是文件的内容,map逐个遍历单词,每遇到一个单词w,就产生一个中间键值对<w, "1">,这表示单词w咱又找到了一个;MapReduce将键相同(都是单词w)的键值对传给reduce函数,这样reduce函数接受的键就是单词w,值是一串"1"(最基本的实现是这样,但可以优化),个数等于键为w的键值对的个数,然后将这些“1”累加就得到单词w的出现次数。最后这些单词的出现次数会被写到用户定义的位置,存储在底层的分布式存储系统(GFS或HDFS)。

工作原理

593588a31d410.jpg

上图是论文里给出的流程图。一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。图中执行的顺序都用数字标记了。

1.MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。

2.user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。

3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

4.缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。

5.master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的。

6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。

7.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。

所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统(GFS)的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统(GFS)的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。

总结:

通过以上你是否了解什么是MapReduce了那,什么是key,怎么过滤有效数据,怎么得到自己想要的数据。
MapReduce是一种编程思想,可以使用java来实现,C++来实现。Map的作用是过滤一些原始数据,Reduce则是处理这些数据,得到我们想要的结果,比如你想造出番茄辣椒酱。也就是我们使用hadoop,比方来进行日志处理之后,得到我们想要的关心的数据

相关文章

  • MapReduce 6.824 学习笔记

    map函数和reduce函数 这两个函数是交给用户实现的,这两个函数定义了任务本身。 map函数:接受一个键值对(...

  • 6.824:MapReduce

    MapReduce 练手 Part I common_map.go common_reduce.go Part I...

  • MIT 6.824 Day1

    MapReduce 参考paper:https://pdos.csail.mit.edu/6.824/papers...

  • 6.824MapReduce

    介绍 MapReduce的实验基于论文Mapreduce 以计数为例 输入是M个文件 Input1 -> Map ...

  • mit6.824-(lab1)

    mit-6.824 lab1文档这部分是实现和理解mapreduce论文,实现简单的mapreduce框架 主要设...

  • 6.824 Lab 1: MapReduce

    计划过很多次,终于开始了6.824的征程;希望一鼓作气! 一: MapReduce逻辑 二: 实验任务 完成用户端...

  • mapreduce框架详解

    参考:hadoop 学习笔记:mapreduce框架详解 [toc] 总结 Mapreduce是一个计算框架,既然...

  • 6.824-Lab1: MapReduce

    MapReduce, 批处理的典型之一。主要思想即“分而治之”,将一大批数据(一个大任务)分成多个子任务,分别进行...

  • 6.824 Lab01 MapReduce

    一些废话:学6.824是因为实在是喜欢存储,不想再做监控运维之类无聊的工作,想真正成长为一个专业的分布式存储工程师...

  • raft 学习笔记(6.824 Lab 2)

    raft 学习笔记 最近在学习 6.824 的分布式课程.学习到 Raft 算法. 写篇文章作为记录. 什么是 R...

网友评论

      本文标题:MapReduce 6.824 学习笔记

      本文链接:https://www.haomeiwen.com/subject/rgawfxtx.html