Hadoop入门进阶步步高(四)-测试Hadoop

四、测试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

结果如下:


[email protected]:~/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/下面生成四个文件:

其中两个.crc文件是隐藏,是用于CRC校验的,我们不需要关心;

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

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

下面的截图是通过Hadoop执行,在~/java/result目录下面的结果:

part_r_00000里面的内容和通过JAVA执行结果是一样的,这里就不贴图了。通过Hadoop命令执行,里面多了一个_logs目录,它里面存放了本次用于执行的jar文件以及本次执行Hadoop用到的配置信息文件“*_conf.xml”,这个配置文件需要重点关注一下,因为这个文件里面包含了本次计算执行所需要的所有配置信息,以下为本次执行过后的配置文件:

注:后面补上

Hadoop入门进阶步步高(四)-测试Hadoop

时间: 2024-10-07 10:37:49

Hadoop入门进阶步步高(四)-测试Hadoop的相关文章

Hadoop入门进阶步步高(一)-环境准备

前言 Hadoop从存储上来说,是类似于冗余磁盘阵列(RAID)的存储方式,将数据分散存储并提供以提供吞吐量,它的存储系统就是HDFS(Hadoop Distuibute Fils System):从计算上来说,它通过MapReduce模型,将大数据的计算分发到多台计算机上完成,再将结果合并,减少计算的时间. Hadoop适合于: 1.超大数据的计算: 2.一次写入.多次读取的模式: 3.可以跑在普通的硬件上. Hadoop不适合: 1.低延迟的数据访问,它是为高数据吞吐量应用优化的: 2.大量

Hadoop入门进阶步步高(三)-配置Hadoop

三.配置Hadoop 1.设置$HADOOP_HOME/conf/hadoop-env.sh 这个文件中设置的是Hadoop运行时需要的环境变量,在1.2.1版中共有19个环境变量,如下: 变量名称 默认值 说明 JAVA_HOME 设置JDK的路径,这个必须设置,否则Hadoop无法启动,值如: /usr/local/jdk1.6.0_33 HADOOP_CLASSPATH 空 这个用以设置用户的类路径,也可以在执行计算之前设置 HADOOP_HEAPSIZE 1000m 设置Hadoop堆的

Hadoop入门进阶步步高(六)-Hadoop1.x与Hadoop2的区别

六.Hadoop1.x与Hadoop2的区别 1.变更介绍 Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要的变更: l HDFS的NameNodes可以以集群的方式布署,增强了NameNodes的水平扩展能力和可用性: l MapReduce将JobTracker中的资源管理及任务生命周期管理(包括定时触发及监控),拆分成两个独立的组件,并更名为YARN(Yet Another Re

Hadoop入门进阶步步高(二)-目录介绍

二.Hadoop目录结构 这里重点介绍几个目录bin.conf及lib目录. 1.$HADOOP_HOME/bin目录 文件名称 说明 hadoop 用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心 hadoop-config.sh Hadoop的配置文件 hadoop-daemon.sh 通过执行hadoop命令来启动/停止一个守护进程(daemon). 该命令会被bin目录下面所有以"start"或"stop&quo

Hadoop入门进阶步步高(五)-搭建Hadoop集群

五.搭建Hadoop集群 上面的步骤,确认了单机可以执行Hadoop的伪分布执行,真正的分布式执行无非也就是多几台slave机器而已,配置方面的有一点点区别,配置起来就非常简单了. 1.准备三台服务器 192.168.56.101 192.168.56.102 192.168.56.103 在每台机器的/etc/hosts中都将ip及hostname给映射上: 192.168.56.101  nginx1 192.168.56.102  nginx2 192.168.56.103  nginx3

Hadoop入门进阶步步高(二)-文件夹介绍

二.Hadoop文件夹结构 这里重点介绍几个文件夹bin.conf及lib文件夹. 1.$HADOOP_HOME/bin文件夹 文件名 说明 hadoop 用于运行hadoop脚本命令,被hadoop-daemon.sh调用运行,也能够单独运行,一切命令的核心 hadoop-config.sh Hadoop的配置文件 hadoop-daemon.sh 通过运行hadoop命令来启动/停止一个守护进程(daemon). 该命令会被bin文件夹以下全部以"start"或"stop

【Hadoop测试程序】编写MapReduce测试Hadoop环境

我们使用之前搭建好的Hadoop环境,可参见: <[Hadoop环境搭建]Centos6.8搭建hadoop伪分布模式>http://www.cnblogs.com/ssslinppp/p/5923793.html 示例程序为<Hadoop权威指南3>中的获取最高温度的示例程序: 数据准备 输入数据为:sample.txt 0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN99

[hadoop读书笔记] 第四章 Hadoop I/O操作

P92 压缩 P102 序列化 序列化:将结构化对象转为字节流便于在网上传输或写到磁盘进行永久性存储的过程 用于进程之间的通信或者数据的永久存储 反序列化:将字节流转为结构化对象的逆过程 Hadoop中的序列化:在Hadoop中,系统中多个节点上进程间的通信是通过远程过程传输RPC来实现的. RPC协议将消息序列化成二进制流后发送到远程节点,远程节点接着将二进制流反序列化成原始信息. Avro:一个独立于编程语言,并基于 IDL的序列化框架,非常适合用于Hadoop的大规模数据处理

Hadoop入门进阶课程12--Flume介绍、安装与应用案例

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  .该系列课程是应邀实验楼整理编写的,这里需要赞一下实验楼提供了学习的新方式,可以边看博客边上机实验,课程地址为 https://www.shiyanlou.com/courses/237 [注]该系列所使用到安装包.测试数据和代码均可在百度网盘下载,具体地址为 http://pan.baidu.c