概述
书中第二章以一个气温分析的实例,来帮助读者初步了解MapReduce的编程模式和一些相关的接口。例子非常简单,大概可以理解为利用MapReduce来实现对各地一段年份区间内的天气数据来求得每年的最高气温。
通过该例子,基本可以了解Map、Reduce函数基本的角色,相关接口的使用、以及如何将写好的程序打包放到集群运行。
一、环境搭建
当然先决条件是配置Hadoop开发环境(我这里安装的是2.10),分为两步:
- Hadoop安装和相关文件配置
- Hadoop+IDEA的本地开发环境搭建
过程就不详细介绍了,基本没有什么坑,贴上两篇博文,完全可以参照着来:
Hadoop安装和相关文件配置
Hadoop+IDEA的本地开发环境搭建
其中yarn-site.xml的配置需要参照下这个InvalidAuxServiceException
但是这里值得注意的有一个点,即在配置hadoop相关的描述文件时,最好都能搞清楚每一步是在干什么,有什么作用,而不是盲目的复制粘贴(相关内容都能很容易在搜索引擎上找到)。这样的话,即使配置出现问题,或者后续版本更迭,也能快速地明晰问题所在。
二、demo
开发环境的问题解决之后,就可以开始写demo了。我基本是按照书上给的代码,结合自己安装的hadoop版本,有一些微调。
其实可能实际工作中通过直接写MapReduce的方式去处理数据的情况很少,但这里写这个demo的意义一是为了开始熟悉一下很长时间没写的java,二是也便于了解MapReduce的过程和原理。
直接代码吧,然后简单总结一下:
import java.io.IOException;
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;
import org.apache.hadoop.conf.Configuration;
public class MaxTemperature {
public static void main(String[] args) throws Exception{
Configuration configuration = new Configuration();
if(args.length != 2){
System.err.println("Usage: Maxtemperature <input path> <output path>");
System.exit(-1);
}
Job job = Job.getInstance(configuration,"MaxTemperatureBySteven"); //Job() is deprecated
job.setJarByClass(MaxTemperature.class);
Path input = new Path(args[0]);
FileInputFormat.addInputPath(job, input);
Path output = new Path(args[1]);
// if the path exists, rm -r
if(output.getFileSystem(configuration).exists(output)){
output.getFileSystem(configuration).delete(output, true);
}
FileOutputFormat.setOutputPath(job, output);
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
System.out.println("Map Task Running……");
String line = value.toString();
String yearMo = line.substring(15, 21);
int airTemperature;
if(line.charAt(87) == '+'){
airTemperature = Integer.parseInt(line.substring(88, 92));
}else{
airTemperature = Integer.parseInt(line.substring(87, 92));//if negative, extract it with the sign
}
String quality = line.substring(92, 93);
if(airTemperature != MISSING && quality.matches("[01459]")){
context.write(new Text(yearMo), new IntWritable(airTemperature));
}
}
private static final int MISSING = 9999;
}
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
System.out.println("Reduce Task Running……");
int maxValue = Integer.MIN_VALUE;
for(IntWritable value: values){
maxValue = Math.max(maxValue, value.get());
}
context.write(key, new IntWritable(maxValue));
}
}
三、总结
- 代码本身就不说了,就是很基础的数据处理。
- 要通过这个例子熟悉Hadoop相关接口,比如Hadoop包装的数据格式;Hadoop是怎么读写文件的,默认的机制是什么;如何配置、启动、停止一个Hadoop job。
- 学会将写好的程序打包、将输入数据put到Hdfs,然后提交job(这里上面贴的两篇博文里都有提到)
- 学会看Hadoop job运行的输出信息,以及log信息
- 有一个坑可能需要注意一下,使用Mac的同学在打包jar包后,可能会出现Mkdirs failed to create xxx的错误,可以参照这里解决一下:解决ES-Hadoop打包报错“Mkdirs failed to create /var/folders…”问题
- 其实这个例子还可以更丰富/扩展,比如对天气数据本身的处理,可以单独写一个天气类,来实现更多的功能;还可以使用上一篇文章提到的combiner等等。这里就先不扩展了吧,考虑到时间问题,前期以先熟悉理论知识为主,感兴趣的同学可以自己去尝试。
最后
以上就是俊逸热狗为你收集整理的Hadoop权威指南读书笔记(二)—— MapReduce的Hello World(气温分析实例demo)的全部内容,希望文章能够帮你解决Hadoop权威指南读书笔记(二)—— MapReduce的Hello World(气温分析实例demo)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复