这是我参与「第四届青训营 」笔记创作活动的的第5天
MapReduce
MapReduce就是利用了分而治之的思想对任务进行处理,将大任务分开到不同的机器进行计算处理(map),然后将结果再整合到一起(reduce), 这就是mapreduce不太恰当的🌰
老师需要做一些任务,将这些任务分成几份给到学生去做,等学生工作完之后老师再讲工作成果整合到一起🤪
Map过程
- 根据 数据量的大小将任务分成不同的小任务,每个子任务会对原文件进行处理,生成
KV键值对- 对每个
KV键值对的key进行分类,加上标签,决定去往哪个reduce
Shuffle
- map端的shuffle 会将数据进行排序,当然是对每个子任务内部的数据分别进行排序
- 每个分区的文件按照
Key的值进行排序- reduce 端的shuffle拉取属于自己的键值对进行合并排序
WordCount的🌰
从一个文件中统计单词出现的数目
- Map:将文件计数的任务分给不同的机器去做, 内部分别进行排序,形成<k,v>对,根据key进行排序
- Shuffle: 将对应的结果拉到Reduce中去,这里只有一个Reduce
- Reduce:将拿到的结果进行统计分析,得到最终的单词的计数
GFS
下面的图片以及思路参考了这里
存储设计
文件按照
chunk = 64MB的大小为单位,这个chunk是偏大的
- 使用GFS系统需要存储的文件偏大,较大的chunk能够减小内部的寻址和交互的次数
Client可能在一个chunk上执行多次的操作,复用TCP- 减少chunk数量,节省元数据的存储开销
master设计
GFS设计了单个master节点,用于存储文件系统的三类 元数据
- 所有文件和chunk的
namespace: chunk的文件名和编号- 文件到chunk的映射
- 每个chunk的位置: chunk编号到chunkserver的位置
文件读取的过程:
文件名->获取文件对应的chunk名->chunk的位置->对应到chunkserver中读取chunk