mit6.824学习 lab1 mapreduce part 1

mit 6.824 学习资料


以上是一些学习资料。可以参考下。知道大数据和一些相关的东西,还是15年在学习linux的时候,里面提到的一些概念,分布式的块存储:drdb,分布式文件系统gfs,然后后来接触的hadoop系列中的hdfs,zookeeper分布式协调系统。elasticserach的分路由存储和搜索,mysql的读写分离和组复制技术,openstack使用的ceph存储。其实我在工作中所使用的大部分的系统都是分布式的,为了更好的理解这些分布式的特征和原理,决定跟着mit 6.824的课程,对其进行学习,更加深入的了解其特性和一些难点,以及可能出现的问题,在实际工作中的时候,可以快速的处理故障。
来先理解下map reduce。这个概念在原来使用hadoop的时候经常提起,是因为这是整个hadoop体系进行计算的一些基础,一个最基础的计算模型,想理解它,可以参考python的map函数和reduce函数。
可以参考下廖雪峰的教程 map/reduce /python
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
  • 但是在系统里面则可以这么认为map包含两个对象(python里面的概念,一切皆对象):第一个是文件,我们需要用map处理的问题,第二个是函数,函数如何处理这个文件,得到什么结果需要被后续的reduce进行处理。 reduce则包含两个行为 第一个也是文件,不过这个文件是map处理后的中间文件,第二个则是我们定义的reduce函数。使用reduce函数处理第一个中间文件,然后接着处理第二个中间文件,涉及到内部的算法,reduce需要对每个文件的每一行进行reduce或者行里面的每个key进行reduce,甚至是每个字符,这应该是取决于你每个reduce的功能需要你自己定义。
  • 这里面涉及到的一个问题就是:如果文件很大,单机无法进行处理,就需要对文件进行分割处理,采用何种形式分割就是一个很大的问题。第二,即使进行分割了,中间文件如何保证尽量减少reduce对此文件的操作次数,保证每个reduce最好只操作中间的文件一次,这样reduce操作可以在不同的计算机下面并行的进行。这里也是map/reduce的一个难点。
  • 更加需要注意的是:大规模系统里面的单机崩溃,网络不可用,上层应用导致的full gc 暂时无法相应,或者甚至是磁盘缓存问题导致磁盘响应太慢,影响计算效率。如何处理这些问题也是难点。不过好在这门课程这些里面的东西都有涉及,所以超级推荐大家学习。。
进入学习正题:实验一part 1 map/reduce input and out put

代码结构如下:

.
├── Makefile
├── pkg
│   └── linux_amd64
│       └── mapreduce.a
└── src
    ├── kvraft
    │   ├── client.go
    │   ├── common.go
    │   ├── config.go
    │   ├── server.go
    │   └── test_test.go
    ├── labgob
    │   ├── labgob.go
    │   └── test_test.go
    ├── labrpc
    │   ├── labrpc.go
    │   └── test_test.go
    ├── linearizability
    │   ├── bitset.go
    │   ├── linearizability.go
    │   ├── model.go
    │   └── models.go
    ├── main
    │   ├── diskvd.go
    │   ├── ii.go
    │   ├── lockc.go
    │   ├── lockd.go
    │   ├── mr-challenge.txt
    │   ├── mr-testout.txt
    │   ├── pbc.go
    │   ├── pbd.go
    │   ├── pg-being_ernest.txt
    │   ├── pg-dorian_gray.txt
    │   ├── pg-frankenstein.txt
    │   ├── pg-grimm.txt
    │   ├── pg-huckleberry_finn.txt
    │   ├── pg-metamorphosis.txt
    │   ├── pg-sherlock_holmes.txt
    │   ├── pg-tom_sawyer.txt
    │   ├── test-ii.sh
    │   ├── test-mr.sh
    │   ├── test-wc.sh
    │   ├── viewd.go
    │   └── wc.go
    ├── mapreduce
    │   ├── common.go
    │   ├── common_map.go
    │   ├── common_reduce.go
    │   ├── common_rpc.go
    │   ├── master.go
    │   ├── master_rpc.go
    │   ├── master_splitmerge.go
    │   ├── schedule.go
    │   ├── test_test.go
    │   └── worker.go
    ├── raft
    │   ├── config.go
    │   ├── persister.go
    │   ├── raft.go
    │   ├── test_test.go
    │   └── util.go
    ├── shardkv
    │   ├── client.go
    │   ├── common.go
    │   ├── config.go
    │   ├── server.go
    │   └── test_test.go
    └── shardmaster
        ├── client.go
        ├── common.go
        ├── config.go
        ├── server.go
        └── test_test.go

About: loony


发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code