MapReduce代码编写--WordCount、运行WordCount程序、查看yarn的运行日志、杀死yarn任务

导入依赖--Maven仓库的官网(mvnrepository.com)

<!-- 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>

三大步骤

// Map阶段
定义静态类继承Mapper类,重写map()
    
// Reduce阶段
定义静态类继承Reducer类,重写reduce()
    
// Driver端(将Map、Reduce进行组装)
创建配置文件
创建一个Job实例并对Job进行配置// MapReduce在运行的时候我们把它称为Job
对Map端进行配置
对Reduce端进行配置
配置输入输出路径
等待job运行完成

WordCount程序示例

/*
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
*/

package com.shujia.MapReduce;

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 Demo1WordCount {
    // Map阶段
    public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        //LongWritable -- Long类型实现了序列化接口 IntWritable同理
        //Text -- String
        
        /**
         * @param key     输入Map端的key->偏移量
         * @param value   输入Map端的value->words.txt上一行数据
         * @param context MapReduce整个过程的上下文环境->可以获取MapReduce程序运行时的一些参数、状态,可以将Map的输出发送到Reduce
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            // 实现自己的map端逻辑
            String vStr = value.toString();
            // 按照空格进行切分,将每个单词切分出来
            String[] words = vStr.split(" ");

            // 遍历String[]获取每一个单词,构造成k-v格式
            /**
             * hadoop hive hbase spark flink
             * ====>
             * hadoop 1
             * hive 1
             * hbase 1
             * spark 1
             * flink 1
             */
            for (String word : words) {
                Text keyOut = new Text(word);
                IntWritable valueOut = new IntWritable(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, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            // 实现自己的Reduce逻辑
            int sum = 0; // 保存每个单词的数量
            for (IntWritable value : values) {
                // 遍历values迭代器
                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进行一些简单的配置
        // 这个名字在yarn的web界面上可以看到
        job.setJobName("Demo1WordCount");
        // 通过class类设置运行Job时该执行哪一个类
        job.setJarByClass(Demo1WordCount.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"));
        // 输出路径不需要提前创建,如果该目录已存在则会报错
        // 通过HDFS的JavaAPI判断输出路径是否存在
        Path outPath = new Path("/wordCount/output");
        FileSystem fs = FileSystem.get(conf);
        if (fs.exists(outPath)) {
            fs.delete(outPath, true);
        }

        FileOutputFormat.setOutputPath(job, outPath);

        // 等待job运行完成
        // waitForCompletion()方法中含有submit()提交job
        job.waitForCompletion(true);

    }
}

运行WordCount程序

1、准备数据,将words.txt上传至HDFS的/wordCount/input目录下面
hdfs dfs -mkdir -p /wordCount/input
hdfs dfs -put words.txt /wordCount/input

2、将上面写好的程序打成jar包,并通过xftp上传至Linux
IDEA最右侧侧边栏(Maven模块)-->选择程序所在项目-->Lifecycle-->clean-->package  之后会在target目录下生成一个jar包

3、提交MapReduce任务
hadoop jar Hadoop-1.0.jar com.shujia.MapReduce.Demo1WordCount

命令解释:
hadoop -- 该命令以其开头
jar -- 运行的是jar包
Hadoop-1.0.jar -- jar包的名字
com.shujia.MapReduce.Demo1WordCount -- jar包中的主类名
后面不需要加输入输出路径,因为自己写的程序中已经配置好了

查看yarn的运行日志、杀死yarn任务

查看
yarn logs -applicationId 程序运行id

程序运行id:以 application_ 开头

例如
yarn logs -applicationId application_1644480440500_0006

杀死
yarn application -kill 程序运行id

例如
yarn application -kill application_1644480440500_0007
posted @ 2022-02-13 00:17  赤兔胭脂小吕布  阅读(98)  评论(0编辑  收藏  举报