MapReduce
分布式数据处理工具、分布式计算处理框架
MR 主要思想:分久必合,合久必分。
MR 架构 ---- kv 格式(key + value)
工作原理
map
- 假设 计算的数据都在 hdfs 上,从 hdfs 获取数据进行计算 – 寻找需要计算的位置
- map 会将 hdfs 上的大文件进行相应的切割 ---- 切割成一个个的 split 切片(默认大小与 block 大小一致)---- block = map = maptask
为了能把数据完整的切割,与 block 块近似相等
split 是 逻辑划分
eg:
若设置 split 大小为 256M
2block = split = maptask
若想提高 map 并行度,减小 split 大小
-
map 将数据进行切割之后进行计算 ---- 每个 map 会将自己的计算结果放入内存缓冲区(默认100M)
放入内存缓冲区之前 ---- 打标签 ---- 分区(默认 hashpartition)---- map 产生的数据的 key 的 hashcode 与 reduce 个数进行取模
分区的作用:哪一个数据由哪一个 reduce 处理
-
当 buffer 满了之后,会溢写到磁盘中
优先写入到 80M 中,当 80M 写完之后,会将数据溢写到磁盘上
在溢写之前,会对内存中的小文件进行一个排序 ---- 写在磁盘中的小文件 都是 有序的
-
溢写完之后,会进行一次小的 merge
目前为止:产生的磁盘小文件 ---- 相同种类的在一起,并且还是有序的
map端:产生一个个的有序文件
reduce
-
将 map 端产生的数据 从磁盘拉取到内存
reduce 默认占用内存的 70% (66%+4%) ---- 超过 66% 后会发生溢写
-
在发生溢写之前会进行一次排序(从 map 端拉取的文件都是有序的,但是 不同 map 之间是无序的,merge 之后会小的排序)
-
排序之后会产生很多的小文件 ---- 小文件进行一次合并 ---- 合并成简单有序的小文件
-
合并小文件之前会对文件进行排序 — 小文件已经有序,合并为大文件