四、试Hadoop

一个简单的求每年温度最大值的程序。

1、准备两个文本測试数据

准备两个名为data1.txt及data2.txt的文件。用于做为计算的输入数据,将其放于/home/fenglibin/java/data文件夹下:

data1.txt

data2.txt

1999 10

1999 20

1999 25

2000 21

2000 22

2000 18

2000 40

2001 45

2001 65

2002 90

2002 89

2002 70

2003 40

2003 80

1999 40

1999 10

1999 25

2000 51

2000 22

2000 18

2000 40

2001 95

2001 65

2002 90

2002 19

2002 70

2003 100

2003 80

每行有两列,分别表示年份和温度。

2、准备JAVA代码

该代码来自于《Hadoop权威指南(第二版)》,例如以下:

package hadoop;

import java.io.IOException;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class MaxTemperature {

static class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

@Override

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

String line = value.toString();

if (line == null || line.trim().equals("")) {

return;

}

String[] arr = line.split(" ");

String year = arr[0];

int airTemperature = Integer.parseInt(arr[1]);

context.write(new Text(year), new IntWritable(airTemperature));

}

}

static class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

@Override

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

int maxValue = Integer.MIN_VALUE;

for (IntWritable value : values) {

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

}

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

}

}

public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

Job job = new Job();

job.setJarByClass(MaxTemperature.class);

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

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

job.setMapperClass(MaxTemperatureMapper.class);

job.setReducerClass(MaxTemperatureReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

System.exit(job.waitForCompletion(true) ?

0 : 1);

}

}

3、编译

javac -cp $HADOOP_HOME/hadoop-core-1.2.1.jar hadoop/MaxTemperature.java

4、运行

运行的方式有两种,直接通过java命令和$HADOOP_HOME/bin/hadoop命令,只是不同的运行方式有一定的差别。

4.1、通过java命令运行

有例如以下特点:

1)、指定本地的输入文件。

2)、将结果输出到本地;

3)、须要指定依赖的一长串classpath;

4)、仅仅须要启动map/reduce就可以,不须要启动namenode及datanode;

5)、须要在class所在文件夹运行,因而不须要指定HADOOP_CLASSPATH。

运行例如以下:

java -Xmx256m -Xms256m -XX:PermSize=128m -cp $HADOOP_HOME:.:$HADOOP_HOME/hadoop-core-1.2.1.jar:$HADOOP_HOME/hadoop-tools-1.2.1.jar:$HADOOP_HOME/hadoop-ant-1.2.1.jar:$HADOOP_HOME/hadoop-client-1.2.1.jar:$HADOOP_HOME/hadoop-minicluster-1.2.1.jar:$HADOOP_HOME/lib/commons-logging-1.1.1.jar:$HADOOP_HOME/lib/commons-logging-api-1.0.4.jar:$HADOOP_HOME/lib/commons-configuration-1.6.jar:$HADOOP_HOME/lib/commons-lang-2.4.jar:$HADOOP_HOME/lib/jackson-core-asl-1.8.8.jar:$HADOOP_HOME/lib/jackson-mapper-asl-1.8.8.jar:$HADOOP_HOME/lib/commons-httpclient-3.0.1.jar hadoop/MaxTemperature /home/fenglibin/java/data/ /home/fenglibin/java/result/

4.2、通过hadoop命令运行

有例如以下特点:

1)、输入文件必须放到hdfs上;

2)、输出结果在hdfs上。

3)、须要设置HADOOP_CLASSPATH。但不是绝对;

4)、须要将class文件打成jar包。

HADOOP_CLASSPATH是用于加入用户的jar,hadoop在运行的时候会将其追加到hadoop本身的classpath中。

Hadoop在启动的时候,会将$HADOOP_HOME/lib文件夹以下的jar所有加到classpath中。假设想偷懒不设置HADOOP_CLASSPATH,能够将你的jar包放到$HADOOP_HOME/lib中。

4.2.1、将class文件打成jar包

首先须要创建一个mainfest.mf,放在与要打包的class同样的文件夹中,里面写上内容:

Main-Class: hadoop.MaxTemperature

然后通过例如以下命令进行打包:

jar cvfm maxTemperature.jar mainfest.mf -c hadoop/

4.2.2、设置HADOOP_CLASSPATH

如此时maxTe mperature.jar放在/home/fenglibin/java文件夹下,此时设置HADOOP_CLASSPATH例如以下:

export HADOOP_CLASSPATH=/home/fenglibin/java/maxTemperature.jar

4.2.3、拷贝本地文件到HDFS

hdfs -copyFromLocal data ~/java

注:hdfs是我本地的“hadoop fs”的alias,文件夹“~/java”是hdfs中的文件夹。

查看是否拷贝成功:

hdfs -ls ~/java

结果例如以下:

fenglibin@ubuntu1110:~/java$ hdfs -ls ~/java

Warning: $HADOOP_HOME is deprecated.

Found 1 items

drwxr-xr-x   - fenglibin supergroup      0 2013-12-25 14:33 /home/fenglibin/java/data

文件已经存在,表示拷贝成功。

4.2.4、运行

Jar的mainfest.mf中标识了Main-Class是hadoop/MaxTemperature是主类。因而我们能够有两种运行方式,直接运行类hadoop/MaxTemperature或者直接运行jar。

1)、直接运行类hadoop/MaxTemperature

hadoop hadoop/MaxTemperature ~/java/data ~/java/result1

2)、直接运行jar包

hadoop jar /home/fenglibin/java/maxTemperature.jar ~/java/data ~/java/result2

尽管这样的方式是运行jar包,事实上也是调用类hadoop/MaxTemperature运行。仅仅是入口不一样而已。

4.2.5 查看结果

以上两种方式运行的计算结果是同样的。结果文件有一些不同,结果的存放位置不同。通过JAVA直接运行的结果是存放在本地的,通过Hadoop运行的结果是放到Hdfs上的。

以下的截图是通过JAVA运行后,在/home/fenglibin/java/result/以下生成四个文件:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2xpYmluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

当中两个.crc文件是隐藏,是用于CRC校验的。我们不须要关心。

_SUCCESS是一个空文件,仅仅是用于表示当前操作运行成功;

part_r_00000里面存放的就是我们每年最大值的输出结果,内容例如以下:

以下的截图是通过Hadoop运行。在~/java/result文件夹以下的结果:

part_r_00000里面的内容和通过JAVA运行结果是一样的。这里就不贴图了。通过Hadoop命令运行,里面多了一个_logs文件夹。它里面存放了本次用于运行的jar文件以及本次运行Hadoop用到的配置信息文件“*_conf.xml”。这个配置文件须要重点关注一下,由于这个文件中面包括了本次计算运行所须要的所有配置信利息。以下是轮廓后第二次运行:

注意:向上的背

版权声明:本文博主原创文章,博客,未经同意不得转载。

Hadoop获得先进的步步高(四)-试Hadoop的更多相关文章

  1. Hadoop学习之路(四)Hadoop集群搭建和简单应用

    概念了解 主从结构:在一个集群中,会有部分节点充当主服务器的角色,其他服务器都是从服务器的角色,当前这种架构模式叫做主从结构. 主从结构分类: 1.一主多从 2.多主多从 Hadoop中的HDFS和Y ...

  2. Hadoop 学习之路(四)—— Hadoop单机伪集群环境搭建

    一.前置条件 Hadoop的运行依赖JDK,需要预先安装,安装步骤见: Linux下JDK的安装 二.配置免密登录 Hadoop组件之间需要基于SSH进行通讯. 2.1 配置映射 配置ip地址和主机名 ...

  3. 《Hadoop权威》学习笔记四:Hadoop的I/O

    一.数据完整性   二.压缩   三.序列化 基本概念 序列化指的是将结构化对象转化为字节流以便于通过网络进行传输或写入持久化存储的过程 反序列化指的是将字节流转为一系列结构化对象的过程. 进程间通信 ...

  4. Hadoop 系列(四)—— Hadoop 开发环境搭建

    一.前置条件 Hadoop 的运行依赖 JDK,需要预先安装,安装步骤见: Linux 下 JDK 的安装 二.配置免密登录 Hadoop 组件之间需要基于 SSH 进行通讯. 2.1 配置映射 配置 ...

  5. Hadoop完整搭建过程(四):完全分布模式(服务器)

    1 概述 上一篇文章介绍了如何使用虚拟机搭建集群,到了这篇文章就是实战了,使用真实的三台不同服务器进行Hadoop集群的搭建.具体步骤其实与虚拟机的差不多,但是由于安全组以及端口等等一些列的问题,会与 ...

  6. 大数据时代之hadoop(四):hadoop 分布式文件系统(HDFS)

    分布式文件系统即是网络中多台计算机组合在一起提供一个统一存储及管理的系统. Hadoop提供了一个文件系统接口和多个分布式文件系统实现,其中比较重要的就是HDFS(Hadoop Distributed ...

  7. hadoop(七)集群配置同步(hadoop完全分布式四)|9

    前置配置:rsync远程同步|xsync集群分发(hadoop完全分布式准备三)|9 1. 分布式集群分配原则 部署分配原则 说明Namenode和secondarynamenode占用内存较大,建议 ...

  8. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  9. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

随机推荐

  1. HTML contact form with CAPTCHA

    http://www.html-form-guide.com/contact-form/html-contact-form-captcha.html#codedownload

  2. 【iOS】使用SQLite与FMDB

    iOS中的SQLite与Android中的一模一样,仅仅是调用方法有差异.假设单从调用来讲,Android封装的一套helper更好用一些,而iOS原生的用C语言的几个函数在操作,比較麻烦.只是引入第 ...

  3. 同一路由器不同vlan之间的通信(一)

    还是废话不多说,第一步,看拓扑图. 先把pc上的ip都配好.開始设置 switch0: >en >conf t >vlan 2 >exit >int fa 0/1 > ...

  4. Android从无知到有知——NO.7

    的ip拨号器在监听外拨电话时用的是系统提供的广播事件.而有些时候我们须要自己设定广播事件来满足特定的须要. Ok,今天整一下自己定义广播事件,我们用一个状态监測模块向一个3G模块发送报警信息来实现这一 ...

  5. 每天进步一点点——再次了解Linux进程ID

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/38968011 1. 概述 众所周知,进程(process)是一个可运行程序的实例,可是在Li ...

  6. Android游戏源代码合集(主要是AndEngine和Libgdx的)

    近期在网络上看到有网友抱怨Android游戏源代码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源代码,以Eclipseproject的形式配置好环境,再陆续发出(某引擎避嫌,不在此 ...

  7. 华为编程大赛汇总----java

           以下华为编程比赛题目都是网上整理得到的,代码都是自己调试过的,由于网上java答案较少,欢迎大家批评指正,也希望对准备华为上机的童鞋们有一点点帮助.在练习的过程中成长,加油!~~  1. ...

  8. A Novel Multi-label Classification Based on PCA and ML-KNN

     ICIC Express Letters                  ICIC International ⓒ2010 ISSN 1881-803X Volume4, Number5, O ...

  9. CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)

    在做练习,触摸故障,看到源代码,以了解下触摸事件. 练习操作:直CClayer子类init在 this->setTouchEnabled(true); 事件处理方法覆盖 virtual bool ...

  10. C#中禁止程序多开

    原文:C#中禁止程序多开 方法一.使用Mutex bool createdNew; //返回是否赋予了使用线程的互斥体初始所属权            System.Threading.Mutex i ...