四、试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. Routeros 计划任务连线/断线ADSL

    老板吩咐,要求晚上11点前断网,目的是让大家伙早睡早起. 不想使用Panabit来做策略,阿童木的D2500C还是性能不足,就用ROS的计划任务. 第1步 校时 时间要准,要不控制个乱七八糟. 操作路 ...

  2. 【原创】leetCodeOj --- Word Ladder II 解题报告 (迄今为止最痛苦的一道题)

    原题地址: https://oj.leetcode.com/submissions/detail/19446353/ 题目内容: Given two words (start and end), an ...

  3. [2014 Regional]牡丹江 H Hierarchical Notation 做题记录

    主妇:老年人谁是炮灰牡丹江,我们的团队只是做同步大赛 他决定开爆震H什么时候,A 5min 1Y.I在该限制后,纠结了很久30min+ 1Y,神继续承担各种位置卡D在,hpp见B我认为这是非常熟悉的研 ...

  4. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  5. 说说nio2

    利不百不变法,功不十不易器 为什么会出现nio,之前的io有什么问题? 请先看 说说nio1 nio类图例如以下 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX ...

  6. 使用clojure訪问SQL Server数据库

    (require '[korma.core :as kc]) (require '[korma.db :as kd]) (Class/forName "com.microsoft.jdbc. ...

  7. NET WEB

    .NET WEB程序员需要掌握的技能 2015-12-28 08:50 by 敏捷的水, 3997 阅读, 66 评论, 收藏, 编辑 本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师 ...

  8. Andoird实现类似iphone AssistiveTouch的控件的demo

    类似Iphone Assistive Touch的控件的实现 网上也有些这方面的控件,不过貌似不怎么好用,或者是论坛需要积分下载,恰好自己在项目中有用到这种控件,就打算自己写一个,也成功实现了这种功能 ...

  9. linux 脚本測试网络速度

    example: ./netspeed eth0 1 #!/bin/bash 2   3 INTERVAL="1"  # update interval in seconds   ...

  10. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...