您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Hadoop MapReduce执行过程是怎么样的
## 一、MapReduce概述
### 1.1 什么是MapReduce
MapReduce是一种分布式计算模型,由Google提出,主要用于大规模数据集(大于1TB)的并行运算。它将复杂的、运行于大规模集群上的并行计算过程高度抽象为两个函数:Map和Reduce。
### 1.2 MapReduce的核心思想
"分而治之"是MapReduce的核心思想:
- **Map阶段**:将大数据集分解为成百上千的小数据集
- **Reduce阶段**:对Map阶段的中间结果进行汇总
### 1.3 MapReduce的优势
1. 易于编程
2. 良好的扩展性
3. 高容错性
4. 适合海量数据离线处理
## 二、MapReduce架构组成
### 2.1 主要组件
| 组件 | 功能描述 |
|------|----------|
| Client | 提交MapReduce作业 |
| JobTracker | 资源管理和作业调度 |
| TaskTracker | 执行具体任务 |
| HDFS | 存储输入输出数据 |
### 2.2 角色划分
1. **JobTracker**(主节点):
- 管理所有作业
- 调度任务到TaskTracker
- 监控任务执行
2. **TaskTracker**(从节点):
- 执行Map和Reduce任务
- 向JobTracker汇报状态
## 三、MapReduce详细执行流程
### 3.1 整体流程图
```mermaid
graph TD
A[Input Data] --> B[Split]
B --> C[Map Task]
C --> D[Shuffle]
D --> E[Reduce Task]
E --> F[Output]
关键参数:
<property>
<name>mapreduce.input.fileinputformat.split.minsize</name>
<value>1</value>
</property>
示例代码:
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(" ");
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Map端Shuffle: 1. Partition:根据Reduce数量分区
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
Reduce端Shuffle: 1. Copy:从各Map节点拉取数据 2. Merge:合并来自不同Map的数据 3. Sort:二次排序
示例代码:
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));
}
}
TaskTracker故障:
Task失败:
推测执行:
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
</property>
job.setCombinerClass(WordCountReducer.class);
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
传统架构 | YARN架构 |
---|---|
JobTracker | ResourceManager |
TaskTracker | NodeManager |
- | ApplicationMaster |
完整代码示例:
public class WordCount {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
数据倾斜解决方案:
Shuffle优化:
输入文件处理:
参数调优:
<!-- 设置Map任务数 -->
<property>
<name>mapreduce.job.maps</name>
<value>100</value>
</property>
监控工具:
MapReduce作为Hadoop的核心计算框架,虽然在新一代计算框架面前显得效率不足,但其”分而治之”的思想仍然深刻影响着大数据处理领域。理解MapReduce的执行原理,不仅有助于优化传统Hadoop作业,更能为学习其他分布式计算框架奠定坚实基础。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。