MapReduce分析年气象数据平均温度与最高温度(云计算实验作业20180523)
课程原地址:http://hbust.shiyanbar.com/course/91079
上课老师:李歆
实验时间:20180523
地点:云桌面
实验人:郭畅
【实验目的】
1) 理解mapreduce执行原理
2) 理解map,reduce阶段
3) 熟悉map和reduce代码的编写
【实验原理】
把采集的气象数据信息以日志的方式保存到指定的位置,该位置可以是本地,也可以是hdfs分布式系统上,利用hadoop计算技术对该日志文件进行处理,主要分两个阶段:mapper阶段和reducer阶段,mapper阶段主要是对日志文件进行按行读取并进行字符串截取,reducer阶段对mapper阶段传过来的数据进行大小比较,最终获取每一年中的最高温度。
气象采集数据格式如下:
0067011990999991950051507004888888889999999N9+00001+9999999999999999999999
0067011990999991950051512004888888889999999N9+00221+9999999999999999999999
0067011990999991950051518004888888889999999N9-00111+9999999999999999999999
0067011990999991949032412004888888889999999N9+01111+9999999999999999999999
数据说明:
第15-19个字符是year
第45-50位是温度表示,+表示零上 -表示零下,且温度的值不能是9999,9999表示异常数据。
第50位值只能是0、1、4、5、9几个数字
【实验环境】
本次环境是:centos6.5 + jdk1.7.0_79 + hadoop2.4.1 + eclipse
日志文件source.txt存放在桌面名为`分布式计算MapReduce开发基础`目录下的相应章节中对应的实验名下的文件夹中找寻。
jar包在桌面名为`lib`文件夹下。
【实验步骤】
一、项目准备阶段
1.1 在linux系统的命令终端上切换到/simple目录,执行命令:touch source.txt创建一个文件。如图1所示:
图1
1.2 在simple目录下,执行命令:vi /simple/source.txt编辑该文件,并把采集的气象信息内容拷贝到该文件中,然后在simple目录可以查看到source.txt文件。如图2所示
图2
1.3 本案例因为需要用到hadoop的计算,所以在编写程序之前需要先启动yarn服务,可以在命令终端执行命令:start-all.sh 把hdfs和yarn服务启动。(查看服务启动共有6项,如果缺少请执行stop-all.sh关闭,重新启动)。如图3所示
图3
二 程序编写
2.1 在eclipse中的项目列表中,右键点击,选择“new“—>”Java Project…”新建一个项目“TemperatureAvg” 。 如图4所示:
图4
2.2 在项目src目录下,右键点击,选择“新建”创建一个类文件名称为“AvgTemperatureMapper”并指定包名”com.simple.temperature” 。如图5所示
图5
2.3 在编写“AvgTemperatureMapper”类之前需要把hadoop相关的jar包导入,首先在项目根目录下创建一个文件夹lib并把指定位置中的包放入该文件中 。如图6所示
图6
2.4 把lib下所有的jar包导入到环境变量,首先全选lib文件夹下的jar包文件,右键点击,选择“build path”-->“add to build path”,添加后,发现在项目下多一个列表项“Referenced Libraries”。如图7所示
图7
2.5 让类“AvgTemperatureMapper”继承类Mapper同时指定需要的参数类型,根据业务逻辑修改map类的内容如下。
package com.simple.temperature;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class AvgTemperatureMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
private static final int MISSING = 9999;
@Override
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
String line = value.toString();//读取一条记录
String year = line.substring(15, 19);//获取温度数
System.out.println("year=="+year);
int airTemperature;
if (line.charAt(45) == '+') { //判断温度正负
airTemperature = Integer.parseInt(line.substring(46, 50));
} else {
airTemperature = Integer.parseInt(line.substring(45, 50));
}
String quality = line.substring(50, 51);
System.out.println("quality: " + quality);
//判断温度是否异常
if (airTemperature != MISSING && quality.matches("[01459]")) {
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}
2.6 在项目src目录下指定的包名”com.simple.temperature”下右键点击,新建一个类名为“AvgTemperatureReducer “并继承Reducer类,然后添加该类中的代码内容如下所示。
package com.simple.temperature;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class AvgTemperatureReducer extends Reducer
<Text, IntWritable, Text, IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {
//声明变量sumValue作为年温度和
int sumValue = 0;
//声明count作为统计同一年温度记录的次数
int count = 0;
//循环求同一年所有温度的和及温度记录次数
for(IntWritable value: values){
sumValue+=value.get();
count++;
}
int avgValue = sumValue/count;
context.write(key, new IntWritable(avgValue));
}
}
2.7 在项目src目录下指定的包名”com.simple.temperature”下右键点击,新建一个测试主类名为“AvgTemperature “并指定main主方法。如图8所示
图8
2.8添加代码如下所示。
package com.simple.temperature;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class AvgTemperature {
public static void main(String[] args) throws Exception{
//获取作业对象
Job job = Job.getInstance(new Configuration());
//设置主类
job.setJarByClass(AvgTemperature.class);
//设置job参数
job.setMapperClass(AvgTemperatureMapper.class);
job.setReducerClass(AvgTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置job输入输出
FileInputFormat.addInputPath(job, new Path("file:///simple/source.txt"));
FileOutputFormat.setOutputPath(job, new Path("file:///simple/output"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
2.9 按照以上的步骤,把mapper和reducer阶段以及测试代码编写完毕之后,选中测试类“AvgTemperature “,右键点击选择`”Run as”--->”Java Application”`,查看控制台显示内容查看是否正确执行。如图9所示
图9
上一篇: python随机森林
下一篇: 青蒿素抗疟疾效果预测比赛