Hadoop:MapReduce计算框架基础

作者:JC2024.01.29 19:48浏览量:5

简介:本文介绍了Hadoop的MapReduce计算框架的基本概念和原理,包括其工作机制、编程模型以及如何在Hadoop上编写MapReduce程序。

Hadoop是一个开源的大数据处理框架,广泛应用于大数据的存储和处理。其中,MapReduce是其核心的计算框架,用于处理和生成大数据集。
一、MapReduce基本概念
MapReduce是一种编程模型,用于处理和生成大数据集。它将任务分解为两个主要阶段:Map阶段和Reduce阶段。这两个阶段都是函数式编程的概念,即输入数据和输出结果都是纯函数式编程语言中的函数。

  1. Map阶段:该阶段的任务是处理输入数据,并产生一系列中间键值对。每个键值对都与输入数据中的一行相关联。Map函数接收一个键值对(通常表示为一个元组),并输出一个或多个键值对。
  2. Reduce阶段:该阶段的任务是处理Map阶段输出的中间键值对,并对具有相同键的所有值进行聚合(例如,求和、求最大值等)。Reduce函数接收一个键和一个值的迭代器,并输出一个或多个键值对。
    二、MapReduce工作机制
    Hadoop的MapReduce框架负责处理任务的调度、分配和故障恢复。在Hadoop中,一个MapReduce作业可以分为以下几个步骤:
  3. 作业提交:用户通过编写MapReduce程序提交作业,并指定输入输出路径。Hadoop将作业提交到作业队列中等待调度。
  4. 作业初始化:Hadoop的JobTracker从作业队列中取出作业进行初始化,为作业分配任务。同时,TaskTracker会根据本地存储的资源情况来申请任务。
  5. 任务分配:JobTracker根据任务数据本地性、TaskTracker资源空闲等情况,将任务分配给对应的TaskTracker。TaskTracker与JobTracker之间的通信协议是Thrift。
  6. 任务执行:TaskTracker接收到任务后,会先检查本地存储的作业文件是否完整,完整则直接启动任务,否则从NameNode上获取数据并存储到本地,然后再启动任务。任务运行在子进程中,并且会占用TaskTracker的slot资源。
  7. 进度和状态更新:TaskTracker会将任务的进度、状态等信息实时汇报给JobTracker,以便用户可以查看任务执行情况。
  8. 作业完成:当所有任务完成后,JobTracker会将作业的状态设置为“完成”,并将结果输出到HDFS中。同时,用户可以从Hadoop的Web界面查看作业执行情况和结果。
    三、编写MapReduce程序
    在Hadoop中编写MapReduce程序需要使用Java或者Python等语言。以下是一个简单的Java MapReduce程序的示例:
  9. Mapper类:实现org.apache.hadoop.mapreduce.Mapper接口,并重写map()方法。该方法接收一个键值对作为输入,并输出一个或多个键值对。例如:
    1. public class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    2. private final static IntWritable one = new IntWritable(1);
    3. private Text word = new Text();
    4. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
    5. StringTokenizer itr = new StringTokenizer(value.toString());
    6. while (itr.hasMoreTokens()) {
    7. word.set(itr.nextToken());
    8. context.write(word, one);
    9. }
    10. }
    11. }
    这个Mapper将输入文本中的每个单词作为键,值为1。
  10. Reducer类:实现org.apache.hadoop.mapreduce.Reducer接口,并重写reduce()方法。该方法接收一个键和一个值的迭代器作为输入,并输出一个或多个键值对。例如:
    1. public class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
    2. private IntWritable result = new IntWritable();
    3. public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
    4. int sum = 0;
    5. for (IntWritable val : values) {
    6. sum += val.get();
    7. }
    8. result.set(sum);
    9. context.write(key, result);
    10. }
    11. }
    这个Reducer将所有具有相同键的值相加,并将结果输出。
  11. 主程序:使用org.apache.hadoop.mapreduce.Job类来配置和提交作业。