MapReduce的代码编写----wordCount示例

MR的代码编写

1、导入依赖

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

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
  <dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.7.6</version>
</dependency>

2、程序示例

words.txt文件:

hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
java scala python
java scala python
java scala python
java scala python
java scala python
在HDFS创建目录:
先创建目录wordCount
hdfs dfs -mkdir hdfs://master:9000/wordCount
在目录wordCount下再创建目录input
hdfs dfs -mkdir hdfs://master:9000/wordCount/input

或者迭代创建目录:
hdfs dfs -mkdir -p hdfs://master:9000/wordCount/input
将数据文件上传到虚拟机(将words.txt文件复制到Xftp中)
将数据文件上传到HDFS中
hdfs dfs -put words.txt hdfs://master:9000/wordCount/input
在IDEA中编写代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


import java.io.IOException;


//统计每个单词的个数
public class DemoWordCount {
    //Map阶段(通过静态类定义Map端输入和输出的key的类型)
    //定义4个泛型,泛型类型根据数据而定
    public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        /**
         * @param key     Map端输入的key->偏移量
         * @param value   Map端输入的value->一行数据
         * @param context MapReduce整个过程的上下文环境->可以获取MapReduce程序运行时的一些参数/状态,可以将Map端的输出发送到Reduce
         * @throws IOException
         * @throws InterruptedException
         *
         */
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //实现自己的Map端逻辑
            String vStr = value.toString();
            //按照空格进行切分,将每个单词切分出来
            String[] words = vStr.split(" ");
            //遍历每一个单词,构造k-v格式
            /**
             * hadoop hive hbase spark flink
             * ====>变成k-v格式
             * hadoop  1
             * hive 1
             * hbase 1
             * spark 1
             * flink 1
             */
            for (String word : words) {
                //将String变成txt
                Text keyOut = new Text(word);//代表key
                IntWritable valueOut = new IntWritable(1);//代表value--1
                //通过context将构建好的k-v发送出去
                context.write(keyOut, valueOut);
            }
        }
    }

    //Reduce阶段
    public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        /**
         * @param key     Map端输出的数据按照key进行分组过后的数据中的key,在这里相当于每个单词
         * @param values  Map端输出的数据按照key进行分组过后,相同key的所有的value组成的集合(迭代器)
         * @param context MapReduce的上下文环境,主要用于输出数据到HDFS
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            //实现自己的Reduce逻辑
            int sum = 0; // 保存每个单词的数量
            for (IntWritable value : values) {
                // 遍历values迭代器
                sum = sum + value.get();
            }

            // 将Reduce统计得到的结果输出到HDFS
            context.write(key, new IntWritable(sum));

        }
    }
        //Driver端(将Map、Reduce进行组装)
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
            Configuration conf = new Configuration();

            // 创建一个Job实例
            // MapReduce在运行的时候我们把它称为Job
            Job job = Job.getInstance(conf);
            // 对Job进行一些简单的配置
            job.setJobName("DemoWordCount");
            // 通过class类设置运行Job时该执行哪一个类
            job.setJarByClass(DemoWordCount.class);

            // 对Map端进行配置
            // 对Map端输出的Key的类型进行配置
            job.setMapOutputKeyClass(Text.class);
            // 对Map端输出的Value的类型进行配置
            job.setMapOutputValueClass(IntWritable.class);
            // 配置Map任务该运行哪一个类
            job.setMapperClass(MyMapper.class);

            // 对Reduce端进行配置
            // 对Reduce端输出的Key的类型进行配置
            job.setOutputKeyClass(Text.class);
            // 对Reduce端输出的Value的类型进行配置
            job.setOutputValueClass(IntWritable.class);
            // 配置Reduce任务该运行哪一个类
            job.setReducerClass(MyReducer.class);

            // 配置输入输出路径
            FileInputFormat.addInputPath(job,new Path("/wordCount/input"));
            //输出路径不需要提前创建,如果该目录已存在则会报错,加个if语句判断
        FileSystem fs = FileSystem.get(conf);
        if(fs.exists(new Path("/wordCount/output"))){
            fs.delete(new Path("/wordCount/output"),true);
        }
        FileOutputFormat.setOutputPath(job,new Path("/wordCount/output"));

            // 等待job运行完成
            job.waitForCompletion(true);
        }
}
通过maven中的package,将代码打包;
将打包好的jar包上传到Xstp中(直接拖进去)
在Xshell中运行jar包(运行之前要切换到jar包所在的目录内)
hadoop jar jar包的名称 代码中类的路径

hadoop jar Hadoop-1.0.jar com.shujia.MapReduce.DemoWordCount 
查看运行结果:
hdfs dfs -cat /wordCount/output/part-r-00000
或者
hadoop fs -cat /wordCount/output/part-r-00000

运行结果为:
            flink	5
            hadoop	5
            hbase	5
            hive	5
            java	5
            python	5
            scala	5
            spark	5
查看运行日志(非必要不看)
yarn logs -applicationId application_1644761997516_0002

application_1644761997516_0002在运行任务期间的前端可以找到
posted @   阿伟宝座  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示