新增的Java MapReduce API

http://book.51cto.com/art/201106/269647.htm

Hadoop的版本0.20.0包含有一个新的 Java MapReduce API,有时也称为"上下文对象"(context object),旨在使API在今后更容易扩展。新的API 在类型上不兼容先前的API,所以,需要重写以前的应用程序才能使新的API发挥作用。

新增的API 和旧的API 之间,有下面几个明显的区别。

新的API 倾向于使用虚类,而不是接口,因为这更容易扩展。例如,可以无需修改类的实现而在虚类中添加一个方法(即用默认的实现)。在新的API 中, mapper 和reducer现在都是虚类。

新的API 放在org.apache.hadoop.mapreduce 包(和子包)中。之前版本的API 依旧放在org.apache.hadoop.mapred中。

新的API充分使用上下文对象,使用户代码能与MapReduce系统通信。例如,MapContext 基本具备了JobConf、OutputCollector和Reporter的功能。

新的API 同时支持"推"(push)和"拉"(pull)式的迭代。这两类API,均可以将键/值对记录推给mapper,但除此之外,新的API 也允许把记录从map()方法中拉出。对reducer来说是一样的。"拉"式处理数据的好处是可以实现数据的批量处理,而非逐条记录地处理。

新增的API实现了配置的统一。旧API 通过一个特殊的JobConf 对象配置作业,该对象是Hadoop配置对象的一个扩展 (用于配置守护进程,详情请参见第130页的"API配置"小节)。在新的API 中,我们丢弃这种区分,所有作业的配置均通过Configuration 来完成。

新API中作业控制由Job类实现,而非JobClient类,新API中删除了JobClient类。

输出文件的命名方式稍有不同。map的输出文件名为part-m-nnnnn,而reduce的输出为part-r-nnnnn(其中nnnnn表示分块序号,为整数,且从0开始算)。

例2-6 显示了使用新API 重写的MaxTemperature应用。不同之处已加粗显示。

 将旧API写的Mapper和Reducer类转换为新API时,记住将map()和reduce()的签名转换为新形式。如果只是将类的继承修改为对新的Mapper和Reducer类的继承,编译的时候也不会报错或显示警告信息,因为新的Mapper和Reducer类同样也提供了等价的map()和reduce()函数。但是,自己写的mapper或reducer代码是不会被调用的,这会导致难以诊断的错误。

例2-6. 用新上下文对象MapReduce API重写的MaxTemperature应用

  1. public class NewMaxTemperature {
  2. static class NewMaxTemperatureMapper
  3. extends Mapper<LongWritable, Text, Text, IntWritable> {
  4. private static final int MISSING = 9999;
  5. public void map(LongWritable key, Text value,Context context
  6. throws IOException, InterruptedException {
  7. String line = value.toString();
  8. String year = line.substring(15, 19);
  9. int airTemperature;
  10. if (line.charAt(87) == ‘+‘) { // parseIntdoesn‘t like leading plus signs
  11. airTemperature = Integer.parseInt(line.substring(88, 92));
  12. } else {
  13. airTemperature = Integer.parseInt(line.substring(87, 92));
  14. }
  15. String quality = line.substring(92, 93);
  16. if (airTemperature != MISSING && quality.matches("[01459]")) {
  17. context.write(new Text(year), new IntWritable(airTemperature));
  18. }
  19. }
  20. }
  21. static class NewMaxTemperatureReducer
  22. extends Reducer<Text, IntWritable, Text, IntWritable> {
  23. public void reduce(Text key, Iterable<IntWritable> values,
  24. Context context)
  25. throws IOException, InterruptedException {
  26. int maxValue = Integer.MIN_VALUE;
  27. for (IntWritable value : values) {
  28. maxValue = Math.max(maxValue, value.get());
  29. }
  30. context.write(key, new IntWritable(maxValue));
  31. }
  32. }
  33. public static void main(String[] args) throws Exception {
  34. if (args.length != 2) {
  35. System.err.println("Usage: NewMaxTemperature<input path> <output path>");
  36. System.exit(-1);
  37. }
  38. Job job = new Job();
  39. job.setJarByClass(NewMaxTemperature.class);
  40. FileInputFormat.addInputPath(job, new Path(args[0]));
  41. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  42. job.setMapperClass(NewMaxTemperatureMapper.class);
  43. job.setReducerClass(NewMaxTemperatureReducer.class);
  44. job.setOutputKeyClass(Text.class);
  45. job.setOutputValueClass(IntWritable.class);
  46. System.exit(job.waitForCompletion(true) ? 0 : 1);
  47. }
  48. }
时间: 2024-10-02 14:42:00

新增的Java MapReduce API的相关文章

Java MapReduce详解--(3)

如果Hadoop命令是以类名作为第一个参数,它就会启动一个JVM来运行这个类.使用命令比直接使用Java更方便,因为前者把类的路径(及其依赖关系)加入Hadoop的库中,并获得Hadoop的配置.要添加应用程序类的路径,我们需要定义一个HADOOP_CLASSPATH环境变量,Hadoop脚本会来执行相关操作. 注意:以本地(独立)模式运行时,本书所有程序希望都以这种方式来设置HADOOP_CLA-SSPATH.命令必须在示例代码所在的文件夹下被运行. 运行作业所得到的输出提供了一些有用的信息.

全面挖掘Java Excel API 使用方法

使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件.这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件,

Atitit. C# java 的api 目录封装结构映射总结

Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent thread System.Threading java.lang.Thread collection System.collection java.util.collection Io Sys.io sys.text sys.xml sys.data.sql sys.data sys.web s

Java 2D API - 2. Graphics 入门

Java 2D API强大而复杂,不过大多时候我们只需使用java.awt.Graphcis类的部分功能.下面的内容将覆盖大多数的常见应用. Graphics 类中的方法大致可以分为两类: Draw and fill方法,用于绘制基本的图形.文本和图像: 属性设置方法,用于控制绘制和填充的效果.setFont()和setColor()等方法就属于这类方法. 下图显示这些方法和图像的对应关系: 1. drawString() 用于绘制文本: g.drawString("Hello", 1

Java 2D API - 1. 基本概念

Java 2D API扩展AWT包,对二维图形.文本及成像功能提供了支持,可用于开发复杂的界面.绘图软件和图像编辑器.Java 2D对象位于用户坐标空间(User coordinate space),当对象呈现在屏幕或打印机,用户空间坐标转换为设备空间坐标(device space coordinate).下面两个类对 Java 2D API十分重要: Graphics Graphics2D Java 2D API提供了如下功能: 为显示设备和打印机等提供了统一的渲染模型: 提供了大量的几何图元

Java Logging API - Tutorial

Java Logging This article describes how to use the Logging API in Java programs. It includes an example for creating an HTML logger. Table of Contents 1. Overview 1.1. Logging 1.2. Logging in Java 1.3. Create a logger 1.4. Level 1.5. Handler 1.6. For

浅析Java servlet Api

Java Servlet 开发工具(JSDK)提供了多个软件包,在编写 Servlet 时需要用到这些软件包.其中包括两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http.可从sun公司的Web站点下载 Java Servlet 开发工具. 下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口. HTTP Servlet 使用一个 HTML 表格来发送和接收数据.要创建一个 HTTP Servlet

Java Servlet API中文说明文档

Java Servlet API中文说明文档译者前言:       近来在整理有关Servlet资料时发现,在网上竟然找不到一份中文的Java Servlet API的说明文档,而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全,而这份文档的2.1a版在1998年的11月份就已定稿.所以我决定翻译一份中文的文档(其中一些与技术关系不大的部分已被略去),有兴趣的读者可以从http: //java.sun.com/products/servlet/2.1/servletsp

Java Excel API简介

1.从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表.读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java) import java.io.*; import jxl.*; … … … … try { //构建Workbook对象, 只读Workbook对象 //直接从本地文件创建Workbook //从输入流