Java MapReduce详解--(3)

如果Hadoop命令是以类名作为第一个参数,它就会启动一个JVM来运行这个类。使用命令比直接使用Java更方便,因为前者把类的路径(及其依赖关系)加入Hadoop的库中,并获得Hadoop的配置。要添加应用程序类的路径,我们需要定义一个HADOOP_CLASSPATH环境变量,Hadoop脚本会来执行相关操作。

注意:以本地(独立)模式运行时,本书所有程序希望都以这种方式来设置HADOOP_CLA-SSPATH。命令必须在示例代码所在的文件夹下被运行。

运行作业所得到的输出提供了一些有用的信息。(无法找到作业JAR文件的相关信息是意料之中的,因为我们是在本地模式下没有JAR的情况下运行的。在集群上运行时,不会看到此警告。)例如,我们可以看到,这个作业被给予了一个IDjob_local_0001,并且它运行了一个map任务和一个reduce任务(使用attempt_local_0001_m_000000_0和attempt_local_0001_r_000000_0两个ID)。在调试MapReduce作业时,知道作业和任务的ID是非常有用的。

输出的最后一部分叫"计数器"(Counter),显示了在Hadoop上运行的每个作业产生的统计信息。这些对检查处理的数据量是否符合预期非常有用。例如,我们可以遵循整个系统中记录的数目:5个map输入产生了5个map的输出,然后5个reduce输入产生两个reduce输出。

输出被写入output目录,其中每个reducer包括一个输出文件。作业包含一个reducer,所以我们只能找到一个文件,名为part-00000:

1.%catoutput/part-00000

2.1949 111

3.1950 22

这个结果和我们之前手动寻找的结果一样。我们可以把前面这个结果解释为在1949年的最高气温记录为11.1℃,而在1950年为2.2℃。

新的JavaMapreduce API

Hadoop最新版JavaMapReduce Release 0.20.0的API包括一个全新的MapReduce
JavaAPI,有时也称为"contextobject"(上下文对象),旨在使API在未来更容易扩展。新的API类型上不兼容以前的API,所以,以前的应用程序需要重写才能使新的API发挥其作用。

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

新的API倾向于使用抽象类,而不是接口,因为这更容易扩展。例如,你可以添加一个方法(用默认的实现)到一个抽象类而不需修改类之前的实现方法。在新的API中,Mapper和Reducer是抽象类。

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

新的API广泛使用context object(上下文对象),并允许用户代码与MapReduce系统进行通信。例如,MapContext基本上充当着JobConf的OutputCollector和Reporter的角色。

新的API同时支持"推"和"拉"式的迭代。在这两个新老API中,键/值记录对被推mapper中,但除此之外,新的API允许把记录从map()方法中拉出,这也适用于reducer。"拉"式的一个有用的例子是分批处理记录,而不是一个接一个。

新的API统一了配置。旧的API有一个特殊的JobConf对象用于作业配置,这是一个对于Hadoop通常的Configuration对象的扩展(用于配置守护进程,请参见5.1节)。在新的API中,这种区别没有了,所以作业配置通过Configuration来完成。

作业控制的执行由Job类来负责,而不是JobClient,它在新的API中已经荡然无存。

例2-6使用新API重写了MaxTemperature的代码,不同之处用黑体字突出显示。

例2-6:使用新的context object(上下文对象)MapReduce
API在气象数据集中查找最高气温

1.public class NewMaxTemperature {

2.static class NewMaxTemperatureMapper

3.extends Mapper<LongWritable,Text, Text, IntWritable>
{

4.

5.private static final int
MISSING =
9999;

6.

7.public void map(LongWritable key, Text value,Context context)

8.throws IOException, InterruptedException {

9.

10. String line =value.toString();

11. String year =line.substring(15, 19);

12. int airTemperature;

13. if (line.charAt(87) == ‘+‘) { // parseInt doesn‘t like

14. leading plus signs

15. airTemperature =Integer.parseInt(line.substring(88, 92));

16. } else {

17. airTemperature =Integer.parseInt(line.substring(87, 92));

18. }

19. String quality =line.substring(92, 93);

20. if (airTemperature !=MISSING &&quality.matches("[01459]")){

21. context.write(new Text(year), new

22. IntWritable(airTemperature));

23. }

24. }

25.}

26.

27.static class NewMaxTemperatureReducer

28. extends Reducer<Text, IntWritable, Text,IntWritable>
{

29.

30. public void reduce(Text key, Iterable<IntWritable> values,

31. Context context)

32. throws IOException, InterruptedException {

33.

34. int maxValue =
Integer.MIN_VALUE;

35. for (IntWritable value : values) {

36. maxValue =Math.max(maxValue, value.get());

37. }

38. context.write(key, new IntWritable(maxValue));

39. }

40.}

41.

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

43. if (args.length != 2) {

44. System.err.println("Usage: NewMaxTemperature
<input path>

45. <output path>");

46. System.exit(-1);

47. }

48.

49. Job job =new Job();

50. job.setJarByClass(NewMaxTemperature.class);

51.

52. FileInputFormat.addInputPath(job, new Path(args[0]));

53. FileOutputFormat.setOutputPath(job, new Path(args[1]));

54.

55. job.setMapperClass(NewMaxTemperatureMapper.class);

56. job.setReducerClass(NewMaxTemperatureReducer.class);

57.

58. job.setOutputKeyClass(Text.class);

59. job.setOutputValueClass(IntWritable.class);

60.

61. System.exit(job.waitForCompletion(true) ? 0 : 1);

62.

63. }

64.}

时间: 2024-10-21 21:05:07

Java MapReduce详解--(3)的相关文章

MapReduce:详解Shuffle过程

MapReduce:详解Shuffle过程[转] 博客分类: mapreduce MapreduceITeye数据结构多线程Hadoop Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混.前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟.考虑到之前我在

package-info.java文件详解

package-info.java文件详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.pacakge-info.java介绍 pacakge-info.java是一个Java文件,可以添加到任何的Java源码包中.pacakge-info.java的目标是提供一个包级的文档说明或者是包级的注释. pacakge-info.java文件中,唯一要求包含的内容是包的声明语句,比如: package com.ch.service; 二.包文档 在

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

Java synchronized详解

Java synchronized详解 第一篇: 使用synchronized 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用.我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款.取款操作的. 在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息.在主程序中我们首先生成了1000个线程,然后启动它们

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁

Java引用类型详解

JVM  的垃圾回收器对于不同类型的引用有不同的处理方式.java中对于一个对象来说,只要有引用的存在,它就会一直存在于内存中.如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误.虽然垃圾回收的具体运行是由JVM来控制的,但是开发人员仍然可以在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存.这种交互方式就是使用JDK1.2 引入的  java.lang.ref包. 强引用(strong reference) 在一般的 Jav

Java堆栈详解 .

1. Java中堆栈(stack)和堆(heap) (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不 允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的

Java网络详解

Java网络详解 Java网络基本概念 网络基础知识 1.计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议 2.网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上

Java面向对象详解

Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵懵懂懂,后来实践的多了,有些东西才慢慢清 楚:二是经过一定的实践之后,反过头来再去学习一些基础东西才能够理解的更透彻:三是有些东西基础但是确很重要,是值得好好搞一搞的. 1.面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),