尚硅谷 mapreduce wordcount案例


1.7 MapReduce编程规范

用户编写的程序分成三个部分:MapperReducerDriver

1.8 WordCount案例实操

1.8.1 本地测试

1)需求

在给定的文本文件中统计输出每一个单词出现的总次数

1)输入数据

2)期望输出数据

atguigu 2

banzhang 1

cls 2

hadoop 1

jiao 1

ss 2

xue 1

2)需求分析

按照MapReduce编程规范,分别编写MapperReducerDriver

3)环境准备

1)创建maven工程MapReduceDemo

2)在pom.xml文件添加如下依赖

    

        org.apache.hadoop

        hadoop-client

        3.1.3

    

    

        junit

        junit

        4.12

    

    

        org.slf4j

        slf4j-log4j12

        1.7.30

    

2)在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。

log4j.rootLogger=INFO, stdout  

log4j.appender.stdout=org.apache.log4j.ConsoleAppender  

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  

log4j.appender.logfile=org.apache.log4j.FileAppender  

log4j.appender.logfile.File=target/spring.log  

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

3)创建包名:com.atguigu.mapreduce.wordcount

4)编写程序

1)编写Mapper

package com.atguigu.mapreduce.wordcount;

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 WordCountMapper extends Mapper{

 

Text k = new Text();

IntWritable v = new IntWritable(1);

 

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

 

// 1 获取一行

String line = value.toString();

 

// 2 切割

String[] words = line.split(" ");

 

// 3 输出

for (String word : words) {

 

k.set(word);

context.write(k, v);

}

}

}

2)编写Reducer

package com.atguigu.mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Reducer;

 

public class WordCountReducer extends Reducer{

 

int sum;

IntWritable v = new IntWritable();

 

@Override

protected void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {

 

// 1 累加求和

sum = 0;

for (IntWritable count : values) {

sum += count.get();

}

 

// 2 输出

         v.set(sum);

context.write(key,v);

}

}

3)编写Driver驱动类

package com.atguigu.mapreduce.wordcount;

import java.io.IOException;

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 WordCountDriver {

 

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

 

// 1 获取配置信息以及获取job对象

Configuration conf = new Configuration();

Job job = Job.getInstance(conf);

 

// 2 关联本Driver程序的jar

job.setJarByClass(WordCountDriver.class);

 

// 3 关联MapperReducerjar

job.setMapperClass(WordCountMapper.class);

job.setReducerClass(WordCountReducer.class);

 

// 4 设置Mapper输出的kv类型

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

 

// 5 设置最终输出kv类型

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

 

// 6 设置输入和输出路径

FileInputFormat.setInputPaths(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

 

// 7 提交job

boolean result = job.waitForCompletion(true);

System.exit(result ? 0 : 1);

}

}

5)本地测试

1)需要首先配置好HADOOP_HOME变量以及Windows运行依赖

2)在IDEA/Eclipse上运行程序

1.8.2 提交到集群测试

集群上测试

1)用mavenjar需要添加的打包插件依赖

    

        

            maven-compiler-plugin

            3.6.1

            

                1.8

                1.8

            

        

        

            maven-assembly-plugin

            

                

                    jar-with-dependencies

                

            

            

                

                    make-assembly

                    package

                    

                        single

                    

                

            

        

    

注意:如果工程上显示红叉。项目上右键->maven->Reimport刷新即可。

2)将程序打成jar

3)修改不带依赖的jar包名称wc.jar,并拷贝该jar包到Hadoop集群/opt/module/hadoop-3.1.3路径

4)启动Hadoop集群

[atguigu@hadoop102 hadoop-3.1.3]sbin/start-dfs.sh

[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

5)执行WordCount程序

[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar  wc.jar

 com.atguigu.mapreduce.wordcount.WordCountDriver /user/atguigu/input /user/atguigu/output