MR执行流程

MR执行流程


(1).客户端提交一个mr的jar包给JobClient(提交方式:hadoop jar ...)
(2).JobClient通过RPC和JobTracker进行通信,返回一个存放jar包的地址(HDFS)和jobId
(3).client将jar包写入到HDFS当中(path = hdfs上的地址 + jobId)
(4).开始提交任务(任务的描述信息,不是jar, 包括jobid,jar存放的位置,配置信息等等)
(5).JobTracker进行初始化任务
(6).读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask
(7).TaskTracker通过心跳机制领取任务(任务的描述信息)
(8).下载所需的jar,配置文件等
(9).TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
(10).将结果写入到HDFS当中
MapReduce任务的执行流程是一个高度分布式的计算过程,通常分为Map阶段、Shuffle阶段和Reduce阶段。整个流程由Hadoop框架自动管理,并且在大规模数据处理中展现出良好的可扩展性和容错性。以下是对整个执行流程的概述: ### Map阶段 1. **输入分片(Input Split)**:在作业提交时,Hadoop会将输入数据划分为多个逻辑分片(Input Split),每个分片将由一个Map任务进行处理。Input Split并不实际存储数据,而是记录数据的起始位置和长度,用于指导后续的读取操作。 2. **RecordReader读取数据**:每个Map任务通过`RecordReader`从Input Split中逐条读取键值对形式的数据。例如,在处理文本文件时,输入数据通常以`<行偏移量, 行内容>`的形式被读取。 3. **执行Map函数**:Map任务将读取到的数据传递给用户定义的`map()`函数进行处理。该函数会生成中间键值对(Intermediate Key-Value Pairs),这些中间结果将被写入到内存中的缓冲区。 4. **Map输出缓冲与溢写**:Map输出的中间结果首先被写入内存缓冲区(通常为100MB大小),当缓冲区达到阈值(默认80%)时,会触发溢写(Spill)操作,将数据写入磁盘。在溢写过程中,MapReduce框架会对Key进行排序,并根据用户指定的Partitioner进行分区。如果中间结果较大,可能会生成多个溢写文件。在Map任务结束时,所有溢写文件会被合并成一个最终的输出文件,以减少Reduce阶段的I/O开销[^5]。 ### Shuffle阶段 Shuffle是MapReduce框架中最复杂和关键的部分,它负责将Map任务的输出正确地分发给Reduce任务。 1. **分区(Partition)**:Map任务的输出结果会根据Key的哈希值或其他分区策略被划分到不同的分区中,每个分区对应一个Reduce任务。 2. **排序与合并**:在Shuffle阶段,Map输出的中间结果会根据Key进行排序,并且可以进行可选的Combiner操作,以减少传输到Reduce端的数据量。 3. **数据传输**:Reduce任务会从各个Map任务所在的节点上拉取(Pull)属于自己的分区数据。Hadoop会使用HTTP协议进行数据传输,确保跨节点的数据获取效率。 4. **归并排序**:Reduce任务在接收到所有Map任务的输出后,会将这些数据进行归并排序,形成一个统一的Key-Value对列表,供后续的Reduce处理使用。 ### Reduce阶段 1. **执行Reduce函数**:Reduce任务会针对每个唯一的Key及其对应的Value列表调用用户定义的`reduce()`方法,进行聚合、统计等操作。最终的输出结果将以键值对的形式生成。 2. **输出到外部存储**:Reduce任务将处理后的结果通过`OutputFormat`写入到外部存储系统中,如HDFS。输出的格式可以根据用户需求进行自定义,比如文本文件、SequenceFile等。 在整个执行过程中,Application Master(AM)负责协调Map和Reduce任务的调度与执行,它与ResourceManager和NodeManager协作,确保任务在合适的容器中运行[^2]。同时,每个任务的执行进度和状态都会被定期更新,以支持容错机制和任务监控。 ### 错误处理与容错机制 MapReduce框架具备完善的错误处理机制。如果某个任务执行失败,Application Master会重新调度该任务到其他节点上执行。默认情况下,每个任务最多会被尝试执行4次,若仍失败,则整个作业会被标记为失败。此外,Map任务的输出在写入磁盘时会进行校验,以确保数据的完整性。 ### 示例代码:WordCount的Map和Reduce实现 以下是一个简单的WordCount示例,展示了Map和Reduce函数的基本实现: ```java // Mapper类 public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] words = value.toString().split("\\s+"); for (String w : words) { word.set(w); context.write(word, one); } } } // Reducer类 public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } ``` 在该示例中,Mapper将输入的文本按空格拆分为单词,并为每个单词输出`<word, 1>`的键值对;Reducer则对每个单词的计数进行累加,输出最终的词频统计结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值