MapReduce简介:

MapReduce”分而治之“的思想处处可见,适用于大量复杂的任务处理场景(大规模数据处理场景)。

Map负责”分“,即把复杂的任务分解为若干个”简单的任务“来处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduce负责“合”,即对map阶段的结果进行全局汇总。

MapReduce运行再Yarn集群上(资源调度的平台)

经典案列:wordcount

1、分析数据准备:

先启动hadoop:

start-dfs.sh
start-yarn.sh

新建一个新的文件:

cd /export/testdata
vim big.txt

向文件写入以下内容并保存(单词与单词之间用空格隔开)

Hello world hadoop
Hive sqoop flume hello
Kitty tom jerry world
hadoop Kitty tom jerry world

这些是要进行词频统计的数据

2、上传到HDFS

  1. 在HDFS上新建文件夹
hadoop fs -mkdir -p /wordcount/input
  1. 使用put上传数据到HDFS
hadoop fs -put big.txt /wordcount/input

(可以打开http://192.168.110.101:50070/explorer.html,并点击进入相应目录确认是否上传成功)

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_big data

3、编写程序

  1.  新建maven项目,导入项目所需的依赖

 

   2.pom文件:

<?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.chen.cn</groupId>
    <artifactId>mapreduce_wordcount</artifactId>
    <version>1.0-SNAPSHOT</version>


    <!--全局参数的设置-->
    <properties>
        <!--设置项目的编码为UTF-8-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--使用java8进行编码-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!--使用java8来进行源码编译-->
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--设置hadoop的版本-->
        <hadoop.version>3.1.2</hadoop.version>
    </properties>
    <!--jar包的依赖-->
    <dependencies>
        <!--测试的依赖坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--日志打印的依赖坐标-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <!--hadoop的通用模块的依赖坐标-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--hadoop的对HDFS分布式文件系统访问的技术支持的依赖坐标-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--hadoop的客户端访问的依赖坐标-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>

</project>

  3.在com.chen.cn包下新建类:

WcMapTask

package com.chen.cn;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

public class WcMapTask extends Mapper <LongWritable, Text,Text, IntWritable>{

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] words = line.split(" ");
        for (String word : words){
            context.write(new Text(word),new IntWritable(1));
        }
    }
}

WcReduceTask

package com.chen.cn;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

public class WcReduceTask extends Reducer <Text, IntWritable,Text,IntWritable>{

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int count = 0;
        for (IntWritable value : values){
            count += value.get();
        }
        context.write(key,new IntWritable(count));
    }
}

WcMrJob(Driver类/启动类,描述Job)

package com.chen.cn;

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 WcMrJob {
    public static void main(String[] args) throws Exception {
        Configuration configuration = new Configuration();
        Job job = Job.getInstance(configuration);

        //设置Driver类
        job.setJarByClass(WcMrJob.class);

        //设置运行哪个map Task
        job.setMapperClass(WcMapTask.class);

        //设置运行哪个reduce Task
        job.setReducerClass(WcReduceTask.class);

        //设置map Task的输出的(key,value)的数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //设置reduce Task的输出的(key,value)的数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //指定要处理的数据所在的位置
        FileInputFormat.setInputPaths(job,"hdfs://192.168.244.121:8020/wordcount/input/big.txt");
        //指定处理之后的结果数据保存位置
        FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.244.121:8020/wordcount/output"));

        //向yarn集群提交job,并且设置一直到执行结束
        boolean res = job.waitForCompletion(true);
        //运行成功,通过System.exit(0),退出虚拟机,结束任务
        System.exit(res?0:1);
    }
}

目录结构:

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_big data_02

 

4、项目打包

点击Maven->mapreduce_wordcount->Lifecycle->package,即可进行项目打包

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_hdfs_03

打包过程(等待一小会):

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_mapreduce_04

打包完成,最终会在target下生成jar包,复制到桌面

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_big data_05

5、上传jar包到集群

rz -E

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_hadoop_06

 

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_big data_07

上传完成,输入ll检查是否存在成功上传jar包:

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_big data_08

6、运行写好的wordcount代码

hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar com.chen.cn.WcMrJob

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_分布式_09

 (需要再等待一会)

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_mapreduce_10

 

 运行成功:

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_分布式_11

 访问yarn的资源调度平台 http://192.168.244.121:8088/cluster

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_hadoop_12

 

 查看在HDFS生成的文件:

hadoop fs -ls /wordcount/output

或者查看 http://192.168.244.121:50070/explorer.html#/wordcount 

 

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_hdfs_13

 

令人激动的时刻!!!

查看统计结果:

hadoop fs -cat /wordcount/output/part-r-00000

基于mapreduce的气象数据分析图片 mapreduce数据分析案例_mapreduce_14

 可以看到统计的结果! 自此完成wordcount案例~