pom.xml

    <properties>
        <hadoop.version>2.7.3</hadoop.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

    </dependencies>

Mapper.java

package mapreduce;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import java.io.IOException;

/**
 * 这部分的输入是由mapreduce自动读取进来的
 * 简单的统计单词出现次数<br>
 * KEYIN 默认情况下,是mapreduce所读取到的一行文本的起始偏移量,Long类型,在hadoop中有其自己的序列化类LongWriteable
 * VALUEIN 默认情况下,是mapreduce所读取到的一行文本的内容,hadoop中的序列化类型为Text
 * KEYOUT 是用户自定义逻辑处理完成后输出的KEY,在此处是单词,String
 * VALUEOUT 是用户自定义逻辑输出的value,这里是单词出现的次数,Long
 *
 */
public class Mapper extends org.apache.hadoop.mapreduce.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));
        }
    }
}

Reduce.java

package mapreduce;

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

import java.io.IOException;
/**
 * 第一个Text: 是传入的单词名称,是Mapper中传入的
 * 第二个:LongWritable 是该单词出现了多少次,这个是mapreduce计算出来的,比如 hello出现了11次
 * 第三个Text: 是输出单词的名称 ,这里是要输出到文本中的内容
 * 第四个LongWritable: 是输出时显示出现了多少次,这里也是要输出到文本中的内容
 *
 */
public class Reduce 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();
        }
        System.out.println(key+":"+count);
        context.write(key,new IntWritable(count));
    }
}

HelloWorld.java

package mapreduce;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.LocalJobRunner;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 相当于运行在yarn中的客户端
 *
 */
public class HelloWorld {

    public static void main(String[] args){
        try {
            Configuration conf = new Configuration();

            //设置job对象
            Job job = Job.getInstance(conf,"count");

            //设置运行job类
            job.setJarByClass(HelloWorld.class);

            //设置mapper类
            job.setMapperClass(Mapper.class);

            //设置reduce
            job.setReducerClass(Reduce.class);

            //设置mapper输出key value
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);

            //设置输入输出路径
            FileInputFormat.setInputPaths(job,new Path("C:\\Users\\Administrator\\Desktop\\word.txt"));
            FileOutputFormat.setOutputPath(job,new Path("C:\\Users\\Administrator\\Desktop\\outword.txt"));

            //提交job
            boolean b = job.waitForCompletion(true);
            
            if(!b){
                System.out.println("wordcount task fail!");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

输出结果

good:2
haha:1
many:2
what:2

更多推荐