MapReduce之WordCount程序打包

目录

1. 代码

2. pom.xml

3. maven打jar包

3. 1 在pom中添加打包插件依赖

3.2 打包方式有两种:

 4. 提交任务到集群

5. 可能会遇到的问题: 错误:编码GBK的不可映射字符


1. 代码

package com.sanqian.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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;

/**
 * 需求: 读取HDFS上hello.txt为念,计算文件中每个单词出现的次数
 */
public class WorldCountJob {
    /**
     * Map阶段
     */
    public static  class MyMapper extends Mapper{
        /**
         * 需要实现map函数
         * 这个map函数可以接收,产生
         * @param k1
         * @param v1
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
            //k1 代表的是每一行数据的行首偏移量,va1代表的是每一行内容
            //对每一行的内容进行切分,把单词切出来
            String[] words = v1.toString().split(" ");
            //迭代切割出来的单词数据
            for (String word: words){
                // 把迭代出来的单词封装称的形式
                Text k2 = new Text(word);
                LongWritable v2 = new LongWritable(1L);
                // 把写出去
                context.write(k2, v2);
            }

        }
    }

    /**
     * Reduce阶段
     */
    public static class MyReduce extends Reducer{
        /**
         * 针对的数据进行累加求和,并且把数据转换成k3,v3写出去
         * @param k2
         * @param v2s
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void reduce(Text k2, Iterable v2s, Context context) throws IOException, InterruptedException {
            // 创建sum变量,保存v2s的和
            long sum = 0L;
            // 对v2s中的数据进行累加求和
            for (LongWritable v2:  v2s){
                sum += v2.get();
            }

            // 组装k3, v3
            Text k3 = k2;
            LongWritable v3 = new LongWritable(sum);
            //把结果写出去
            context.write(k3, v3);
        }
    }

    /**
     * 组装job : map + reduce
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        /**
         * args[0]: 全类名, args[1]: HDFS 输入路径, args[2]: HDFS 输出路径
         */
        if (args.length != 3){
            //如果传递的参数不够,直接退出
            System.out.println("参数的长度为:" + args.length);
            System.exit(100);
        }
        // 创建一个job
        Configuration conf =  new Configuration();
        Job job = Job.getInstance(conf);

        // 注意了:这一行必须设置,否则在集群中执行的时候找不到WordCountJob这个类
        job.setJarByClass(WorldCountJob.class);

        // 指定输入路径(可以是文件,也可以是目录)
        FileInputFormat.setInputPaths(job, new Path(args[1]));
        // 指定输出路径(只能指定一个不存在的目录)
        FileOutputFormat.setOutputPath(job, new Path(args[2]));

        //指定map相关代码
        job.setMapperClass(MyMapper.class);
        // 指定k2的类型
        job.setMapOutputKeyClass(Text.class);
        // 指定v2的类型
        job.setMapOutputValueClass(LongWritable.class);

        //指定reduce相关的代码
        job.setReducerClass(MyReduce.class);
        //指定k3的类型
        job.setOutputKeyClass(Text.class);
        //指定v3的类型
        job.setOutputValueClass(LongWritable.class);

        //提交job
        job.waitForCompletion(true);
    }
}

2. pom.xml

说明:

1. provided   表示这个依赖只在编译的时候使用,在执行或打jar包的时候不适用;集群已有的jar包,这里可以不用再次打包



    4.0.0

    org.example
    db_bigdata
    1.0-SNAPSHOT


    
        
        
            org.apache.hadoop
            hadoop-client
            2.7.2
            
            provided
        
        
        
            org.apache.hadoop
            hadoop-common
            2.7.2
            provided
        
        
            org.apache.hadoop
            hadoop-hdfs
            2.7.2
            provided
        
    

3. maven打jar包

3. 1 在pom中添加打包插件依赖

说明:

1.  在pom.xml中 需要添加的打包插件依赖, 包括两个:编译插件和打包插件

2.  mainClass  全类名可以置空,提交任务时动态指定

    
        
            
                maven-compiler-plugin
                2.3.2
                
                    1.8
                    1.8
                    UTF-8
                
            
            
                maven-assembly-plugin 
                
                    
                        jar-with-dependencies
                    
                    
                        
                            
                            com.sanqian.mr.WorldCountJob
                        
                    
                
                
                    
                        make-assembly
                        package
                        
                            single
                        
                    
                
            
        
    

3.2 打包方式有两种:

使用maven进行打包会生成两个jar包,一个不包含依赖,一个包含依赖

  • 方式一:直接使用mvn命令打包
mvn clean package -DskipTests

 参数说明:

       a. clean package: 表示打包之前清除掉target 目录下的jar包
       b. -DskipTest : 忽略测试代码

MapReduce之WordCount程序打包_第1张图片

  • 方式二: 使用IDEA打包

打包之前先使用clean一下清除旧的jar包,然后再使用package进行打包

MapReduce之WordCount程序打包_第2张图片

MapReduce之WordCount程序打包_第3张图片

4. 提交任务到集群

 将jar包拷贝到集群中, 提交命令

hadoop jar db_bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar com.sanqian.mr.WorldCountJob /data/xxx/words.txt /data/xxx/wc_output3

 参数说明:

        第一个参数: 全类名,程序入口

        第二个参数:HDFS输入路径

        第三个参数:HDFS输出路径

5. 可能会遇到的问题: 错误:编码GBK的不可映射字符

MapReduce之WordCount程序打包_第4张图片

 解决参考:maven项目编译时提示“编码GBK的不可映射字符”_冰块的旅行的博客-CSDN博客_maven 编码gbk的不可映射字符

你可能感兴趣的:(Hadoop,mapreduce,hadoop,java)