Hadoop权威指南读书笔记(二)—— MapReduce的Hello World(气温分析实例demo)

书中第二章以一个气温分析的实例,来帮助读者初步了解MapReduce的编程模式和一些相关的接口。例子非常简单,大概可以理解为利用MapReduce来实现对各地一段年份区间内的天气数据来求得每年的最高气温。
通过该例子,基本可以了解Map、Reduce函数基本的角色,相关接口的使用、以及如何将写好的程序打包放到集群运行。

一、环境搭建

当然先决条件是配置Hadoop开发环境(我这里安装的是2.10),分为两步:

  1. Hadoop安装和相关文件配置
  2. 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));
    }
}

三、总结

  1. 代码本身就不说了,就是很基础的数据处理。
  2. 要通过这个例子熟悉Hadoop相关接口,比如Hadoop包装的数据格式;Hadoop是怎么读写文件的,默认的机制是什么;如何配置、启动、停止一个Hadoop job。
  3. 学会将写好的程序打包、将输入数据put到Hdfs,然后提交job(这里上面贴的两篇博文里都有提到)
  4. 学会看Hadoop job运行的输出信息,以及log信息
  5. 有一个坑可能需要注意一下,使用Mac的同学在打包jar包后,可能会出现Mkdirs failed to create xxx的错误,可以参照这里解决一下:解决ES-Hadoop打包报错“Mkdirs failed to create /var/folders…”问题
  6. 其实这个例子还可以更丰富/扩展,比如对天气数据本身的处理,可以单独写一个天气类,来实现更多的功能;还可以使用上一篇文章提到的combiner等等。这里就先不扩展了吧,考虑到时间问题,前期以先熟悉理论知识为主,感兴趣的同学可以自己去尝试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值