首先复习一下hadoop中hdfs常用的命令
/**
* hadoop fs -mkdir 创建HDFS目录
* hadoop fs -ls 列出HDFS目录
* hadoop fs -copyFromLocal 使用-copyFromLocal 复制本地(local)文件到HDFS
* hadoop fs -put 使用-put 复制本地(local)文件到HDFS
* hadoop fs -cat 列出HDFS目录下的文件内容
* hadoop fs -copyToLocal
* 使用-copyToLocal 将HDFS上文件复制到本地(local)
* hadoop fs -get 使用-get 将HDFS上文件复制到本地(local)
* hadoop fs -cp 复制HDFs文件
* hadoop fs -rm 删除HDFS文件
*/
一、maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wu</groupId>
<artifactId>HighTem</artifactId>
<version>1.0-SNAPSHOT</version>
<!--此程序需要以Hadoop文件作为输入文件,以Hadoop文件作为输出文件,因此需要用到文件系统,于是需要引入hadoop-hdfs包;-->
<!--我们需要向Map-Reduce集群提交任务,需要用到Map-Reduce的客户端,于是需要导入hadoop-mapreduce-client-jobclient包;-->
<!--另外,在处理数据的时候会用到一些hadoop的数据类型例如IntWritable和Text等,-->
<!--因此需要导入hadoop-common包。于是运行此程序所需要的相关依赖有以下几个:-->
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
</project>
二、程序
package com.wu;
/**
* 数据格式 年份日期+温度
* 2014010114
* 2014010216
* 2014010317
* 2014010410
* 2014010506
* 2012010609
* 2012010732
* 2012010812
* 2012010919
* 2012011023
* 2001010116
* 2001010212
* 2001010310
* 2001010411
* 2001010529
* 2013010619
* 2013010722
* 2013010812
* 2013010929
* 2013011023
*/
/**
* 1、首先创建input.txt文件,将上面的数据复制进去
* 2、将input.txt文件上传到hdfs文件系统中
* hadoop fs -mkdir /test #新建一个test的目录
* hadoop fs -put /home/hadoop/runfile/input.txt /test/ #把对应的文件传入到hdfs里面的test目录下
* hadoop fs -ls /test #查询对应目录的信息
*
* 3、将下面的代码进行打包,并在hadoop环境下运行
*/
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.conf.Configuration;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* @Auther: wuyilong
* @Date: 2019/5/24 15:55
* @Description: 一个简单的hadoop例子
*/
public class Temperature {
/**
* 四个泛型类型分别代表:
* KeyIn Mapper的输入数据的Key,这里是每行文字的起始位置(0,11,...)
* ValueIn Mapper的输入数据的Value,这里是每行文字
* KeyOut Mapper的输出数据的Key,这里是每行文字中的“年份”
* ValueOut Mapper的输出数据的Value,这里是每行文字中的“气温”
*/
static class TempMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String year = line.substring(0, 4);
int temperature = Integer.parseInt(line.substring(8));
context.write(new Text(year), new IntWritable(temperature));
}
}
/**
* 四个泛型类型分别代表:
* KeyIn Reducer的输入数据的Key,这里是每行文字中的“年份”
* ValueIn Reducer的输入数据的Value,这里是每行文字中的“气温”
* KeyOut Reducer的输出数据的Key,这里是不重复的“年份”
* ValueOut Reducer的输出数据的Value,这里是这一年中的“最高气温”
*/
static class TempReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int maxValue = Integer.MIN_VALUE;
StringBuilder sb = new StringBuilder();
for(IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
sb.append(value).append(", ");
}
context.write(key, new IntWritable(maxValue));
}
}
/**
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String dst = "hdfs://localhost:9000/intput.txt";// 1输入路径
String dstOut = "hdfs://localhost:9000/output";// 2输出路径,必须是不存在的,空文件加也不行
Configuration hadoopConfig = new Configuration();
hadoopConfig.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
hadoopConfig.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
Job job = new Job(hadoopConfig);
// job执行作业的输入和输出文件的路径
FileInputFormat.addInputPath(job, new Path(dst));
FileOutputFormat.setOutputPath(job, new Path(dstOut));
// 指定Mapper和Reducer两个阶段的处理类
job.setMapperClass(TempMapper.class);
job.setReducerClass(TempReducer.class);
// 设置最后输出的Key和Value的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 执行job,直到完成
job.waitForCompletion(true);
System.out.println("finished");
}
}
积沙成塔