主页 > 新闻资讯 > 大数据学习:MapReduce编程模型

大数据学习:MapReduce编程模型

作者:张老师 浏览次数: 2021-01-05 17:38
Hadoop当中的MapReduce,作为核心计算引擎,主要负责大规模离线数据的处理,至今仍然是非常经典的一代框架。对于MapReduce的学习,我们重点要掌握其编程模型。今天的大数据学习分享,我们就主要来讲讲,MapReduce编程模型。

大数据学习:MapReduce编程模型

MapReduce编程模型

MapReduce 框架只对 <key, value> 形式的键值对进行处理。MapReduce会将任务的输入当成一组 <key, value> 键值对,最后也会生成一组 <key, value> 键值对作为结果。

常见的输入为文件,此时读取的行偏移量会作为Key,文件内容作为Value。

key 和 value 的类必须由框架来完成序列化,所以需要实现其中的可写接口(Writable)。如果需要进行数据排序,还必须实现 WritableComparable 接口。

MapReduce已经提供了基本数据类型的Writable实现类,自定义类需要自行实现接口。

常见的基本数据类型的Writable有IntWritable、LongWritable、Text等等。

MapReduce任务由Map和Reduce两个过程,所以需要分别进行编写。Map的实现需要继承Mapper类,实现map方法完成数据处理;Reduce则要继承Reduer类,实现reduce方法完成数据聚合。

/*

* KEYIN:输入kv数据对中key的数据类型

* VALUEIN:输入kv数据对中value的数据类型

* KEYOUT:输出kv数据对中key的数据类型

* VALUEOUT:输出kv数据对中value的数据类型

* 数据类型为Writable类型

*/

public static class MyMapper extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>{

  // Context为MapReduce上下文,在Map中通常用于将数据处理结果输出

  public void map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedException {

// Map功能的实现

  }

}

public static class MyReducer extends Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {

// 这里reduce方法的输入的Value值是可迭代Iterable类型,因为Reduce阶段会将Key值相同的数据放置在一起

  public void reduce(KEYIN key, Iterable<VALUEIN> values, Context context ) throws IOException, InterruptedException {

  // Reduce功能的实现

  }

}

除了MapReduce,为了提高Shuffle效率,减少Shuffle过程中传输的数据量,在Map端可以提前对数据进行聚合:将Key相同的数据进行处理合并,这个过程称为Combiner。

Combiner需要在Job中进行指定,一般指定为Reducer的实现类。

Map和Reduce的功能编写完成之后,在main函数中创建MapReduce的Job实例,填写MapReduce作业运行所必要的配置信息,并指定Map和Reduce的实现类,用于作业的创建。

public static void main(String[] args) throws Exception {

// 配置类

  Configuration conf = new Configuration();

  // 创建MapReduce Job实例

  Job job = Job.getInstance(conf, "Job Name");

  // 为MapReduce作业设置必要的配置

  // 设置main函数所在的入口类

  job.setJarByClass(WordCount.class);

  // 设置Map和Reduce实现类,并指定Combiner

  job.setMapperClass(MyMapper.class);

  job.setCombinerClass(MyReducer.class);

  job.setReducerClass(IntSumReducer.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);

}

除了基本的设置外,还可以指定Reduce的个数

job.setNumReduceTasks(int)

MapReduce提供的常见类,除Mapper、Reduer之外,还有Partitioner和Counter。

其中Partitioner可以自定义Map中间结果输出时对Key的Partition分区,其目的是为了优化并减少计算量;如果不做自定义实现,HashPartitioner 是 MapReduce 使用的默认分区程序。

Counter (计数器)是 MapReduce 应用程序报告统计数据的一种工具。在 Mapper 和 Reducer 的具体实现中,可以利用 Counter 来报告统计信息。

关于大数据学习,MapReduce编程模型,以上就为大家做了简单的介绍了。MapReduce框架,虽然现如今在实际工作当中的编程任务不多,但是理解其核心原理,还是很有必要的。成都加米谷大数据,专业大数据培训机构,大数据开发,数据分析与挖掘,零基础班本月正在招生中,课程大纲及试学视频,可联系客服领取!
热点排行
推荐文章
立即申请>>