MapReduce的过程(2)

MapReduce的编程思想(1)

MapReduce的过程(2)

1. MapReduce从输入到输出

  • 一个MapReduce的作业经过了input、map、combine、reduce、output五个阶段。
  • 其中combine阶段不一定发生,map输出的中间结果被分发到reduce的过程称为shuffle(数据混洗)。
  • shuffle阶段会发生copy(复制)和sort(排序)。
  • Reduce任务默认在Map任务数量完成5%才开始启动。

2. input

  • HDFS上的文件作为MapReduce的输入,org.apache.hadoop.mapreduce.InputFormat类的子类FileInputFormat类将作为输入的HDFS上的文件切分形成输入分片(InputSplit),每个InputSplit将作为一个Map任务的输入,再将InputSplit解析为键值对。
  • InputSplit只是对数据逻辑上的分片,不会在磁盘上将文件切分、存储。 - 元数据信息由文件路径、文件开始的位置、文件结束的位置、数据块所在的host4部分组成。
  • InputSplit的数量=文件大小/InputSplitSize
  • 尽量使InputSplit的大小和块的大小相同,从而提高Map任务计算的数据本地性。

3. Map和中间结果的输出

  • Map函数产生的输出时,为了保证I/O效率,采取了先写到内存的环形缓存区,并做一次预排序。
  • 每个Map任务都有一个内存缓冲区(默认100M),用于存储map函数的输出。
  • 一旦内存缓存区达到阀值,就会新建一个益处写文件,因此在Map任务写完其最后一个输出记录之后,会有若干个溢出写文件。
  • 在Map任务完成之前,溢出写文件被合并成一个已分区且已排序的输出文件为map输出的中间结果。也是Map任务的输出结果。
  • combine若指定,会在输出文件写到磁盘之前运行,使得map输出的中间结果更紧凑,使得写到本地磁盘和出给Reduce的数据更少。
  • Map输出的中间结果存储格式为IFile,支持压缩的存储格式。
  • Reduce通过HTTP方式得到输出文件的分区。

4. shuffle

  • shuffle代表map函数产生输出到reduce的消化输入的整个过程。
  • 在shuffle过程中,Map任务就处理的只是一个InputSplit,而Reduce任务处理的是所有Map任务同一个分区的中间结果。
  • shuffle的Copy阶段
    • 当一个Map任务完成时,Reduce任务就开始复制其输出。
  • shuffle的Sort阶段
    • 合并map的输出文件,并维持排序,做归并排序,排序过程循环进行。

5. Reduce及最后结果的输出

  • Reduce阶段操作实质上就是对经过shuffle处理后的文件调用reduce函数处理,reduce输出一般为HDFS。

6. Sort

  • MapReduce计算框架中,主要两种排序算法:快速排序和归并排序。
  • MapReduce过程中,共发生三次排序:
    • 第一次排序是在内存缓冲区做的内排序,使用的算法是快速排序。
    • 第二次和第三次排序都是文件合并阶段发生的,使用的是归并排序。

7. MapReduce作业进度组成

  • Map即Map,如map50%reduce0%,表示Map任务已经处理作业输入文件的60%。
  • Reduce阶段,分为copy、sort、reduce且各占1/3。如,reduce处理了2/3的输入,则整个reduce进度为1/3+1/3+1/3*(2/3)=5/9,因为reduce开始处理输入时,copy和sort已经完成。

MapReduce的编程思想(1)

MapReduce的过程(2)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark生态圈

[Spark SQL] 主要执行流程

SparkSql的第一件事就是把SQLText解析成语法树,这棵树包含了很多节点对象,节点可以有特定的数据类型,同时可以有0个或者多个子节点,节点在SparkS...

2761
来自专栏图形学与OpenGL

实验1 C++函数

int main() { int total, n; cout << "Welcome to NIM. Pick a starting tot...

1102
来自专栏一名合格java开发的自我修养

Strom序列化机制

  Storm 中的 tuple可以包含任何类型的对象。由于Storm 是一个分布式系统,所以在不同的任务之间传递消息时Storm必须知道怎样序列化、反序列化消...

822
来自专栏我是攻城师

Spark中foreachPartition和mapPartitions的区别

5455
来自专栏李航的专栏

Shell 主要逻辑源码级分析:SHELL 运行流程 (1)

分享一下在学校的时候分析shell源码的一些收获,帮助大家了解shell的一个工作流程,从软件设计的角度,看看shell这样一个历史悠久的软件的一些设计优点和缺...

2.1K0
来自专栏JackieZheng

Hadoop阅读笔记(七)——代理模式

  关于Hadoop已经小记了六篇,《Hadoop实战》也已经翻完7章。仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序、单表链接等,想得其精髓,...

21510
来自专栏大内老A

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

通过前面的介绍我们知道ModelValidatorProviders的静态只读Providers维护着一个全局的ModelValidatorProvider列表...

21710
来自专栏Hadoop实操

使用JDBC向Kudu表插入中文字符-双引号的秘密

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 1.问题描述 使用Impala JDBC向Kudu表中插入中文字符,插入的中文字符串乱码,中文字...

3757
来自专栏IT笔记

JAVA实现一个简单的RPC+项目源码

论坛中说到聊一聊RPC远程过程调用协议 http://www.52itstyle.com/thread-22564-1-1.html RPC(Remote Pr...

4709
来自专栏Albert陈凯

4.4 共享变量

4.4 共享变量 一般来说,当一个被传递给Spark操作(例如,Map和Reduce)的函数在一个远程集群上运行时,该函数实际上操作的是它用到的所有变量的独立...

33012

扫码关注云+社区

领取腾讯云代金券