• MapReduce之WordCount程序打包


    目录

    1. 代码

    2. pom.xml

    3. maven打jar包

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

    3.2 打包方式有两种:

     4. 提交任务到集群

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


    1. 代码

    1. package com.sanqian.mr;
    2. import org.apache.hadoop.conf.Configuration;
    3. import org.apache.hadoop.fs.Path;
    4. import org.apache.hadoop.io.LongWritable;
    5. import org.apache.hadoop.io.Text;
    6. import org.apache.hadoop.mapreduce.Job;
    7. import org.apache.hadoop.mapreduce.Mapper;
    8. import org.apache.hadoop.mapreduce.Reducer;
    9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    10. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    11. import java.io.IOException;
    12. /**
    13. * 需求: 读取HDFS上hello.txt为念,计算文件中每个单词出现的次数
    14. */
    15. public class WorldCountJob {
    16. /**
    17. * Map阶段
    18. */
    19. public static class MyMapper extends Mapper{
    20. /**
    21. * 需要实现map函数
    22. * 这个map函数可以接收,产生
    23. * @param k1
    24. * @param v1
    25. * @param context
    26. * @throws IOException
    27. * @throws InterruptedException
    28. */
    29. @Override
    30. protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
    31. //k1 代表的是每一行数据的行首偏移量,va1代表的是每一行内容
    32. //对每一行的内容进行切分,把单词切出来
    33. String[] words = v1.toString().split(" ");
    34. //迭代切割出来的单词数据
    35. for (String word: words){
    36. // 把迭代出来的单词封装称的形式
    37. Text k2 = new Text(word);
    38. LongWritable v2 = new LongWritable(1L);
    39. // 把写出去
    40. context.write(k2, v2);
    41. }
    42. }
    43. }
    44. /**
    45. * Reduce阶段
    46. */
    47. public static class MyReduce extends Reducer{
    48. /**
    49. * 针对的数据进行累加求和,并且把数据转换成k3,v3写出去
    50. * @param k2
    51. * @param v2s
    52. * @param context
    53. * @throws IOException
    54. * @throws InterruptedException
    55. */
    56. @Override
    57. protected void reduce(Text k2, Iterable v2s, Context context) throws IOException, InterruptedException {
    58. // 创建sum变量,保存v2s的和
    59. long sum = 0L;
    60. // 对v2s中的数据进行累加求和
    61. for (LongWritable v2: v2s){
    62. sum += v2.get();
    63. }
    64. // 组装k3, v3
    65. Text k3 = k2;
    66. LongWritable v3 = new LongWritable(sum);
    67. //把结果写出去
    68. context.write(k3, v3);
    69. }
    70. }
    71. /**
    72. * 组装job : map + reduce
    73. */
    74. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    75. /**
    76. * args[0]: 全类名, args[1]: HDFS 输入路径, args[2]: HDFS 输出路径
    77. */
    78. if (args.length != 3){
    79. //如果传递的参数不够,直接退出
    80. System.out.println("参数的长度为:" + args.length);
    81. System.exit(100);
    82. }
    83. // 创建一个job
    84. Configuration conf = new Configuration();
    85. Job job = Job.getInstance(conf);
    86. // 注意了:这一行必须设置,否则在集群中执行的时候找不到WordCountJob这个类
    87. job.setJarByClass(WorldCountJob.class);
    88. // 指定输入路径(可以是文件,也可以是目录)
    89. FileInputFormat.setInputPaths(job, new Path(args[1]));
    90. // 指定输出路径(只能指定一个不存在的目录)
    91. FileOutputFormat.setOutputPath(job, new Path(args[2]));
    92. //指定map相关代码
    93. job.setMapperClass(MyMapper.class);
    94. // 指定k2的类型
    95. job.setMapOutputKeyClass(Text.class);
    96. // 指定v2的类型
    97. job.setMapOutputValueClass(LongWritable.class);
    98. //指定reduce相关的代码
    99. job.setReducerClass(MyReduce.class);
    100. //指定k3的类型
    101. job.setOutputKeyClass(Text.class);
    102. //指定v3的类型
    103. job.setOutputValueClass(LongWritable.class);
    104. //提交job
    105. job.waitForCompletion(true);
    106. }
    107. }

    2. pom.xml

    说明:

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

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>db_bigdataartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <dependencies>
    10. <dependency>
    11. <groupId>org.apache.hadoopgroupId>
    12. <artifactId>hadoop-clientartifactId>
    13. <version>2.7.2version>
    14. <scope>providedscope>
    15. dependency>
    16. <dependency>
    17. <groupId>org.apache.hadoopgroupId>
    18. <artifactId>hadoop-commonartifactId>
    19. <version>2.7.2version>
    20. <scope>providedscope>
    21. dependency>
    22. <dependency>
    23. <groupId>org.apache.hadoopgroupId>
    24. <artifactId>hadoop-hdfsartifactId>
    25. <version>2.7.2version>
    26. <scope>providedscope>
    27. dependency>
    28. dependencies>
    29. project>

    3. maven打jar包

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

    说明:

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

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

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <artifactId>maven-compiler-pluginartifactId>
    5. <version>2.3.2version>
    6. <configuration>
    7. <source>1.8source>
    8. <target>1.8target>
    9. <encoding>UTF-8encoding>
    10. configuration>
    11. plugin>
    12. <plugin>
    13. <artifactId>maven-assembly-plugin artifactId>
    14. <configuration>
    15. <descriptorRefs>
    16. <descriptorRef>jar-with-dependenciesdescriptorRef>
    17. descriptorRefs>
    18. <archive>
    19. <manifest>
    20. <mainClass>com.sanqian.mr.WorldCountJobmainClass>
    21. manifest>
    22. archive>
    23. configuration>
    24. <executions>
    25. <execution>
    26. <id>make-assemblyid>
    27. <phase>packagephase>
    28. <goals>
    29. <goal>singlegoal>
    30. goals>
    31. execution>
    32. executions>
    33. plugin>
    34. plugins>
    35. build>

    3.2 打包方式有两种:

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

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

     参数说明:

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

    • 方式二: 使用IDEA打包

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

    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的不可映射字符

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

  • 相关阅读:
    Pycharm无法完整运行django设计的网页
    Web3项目灵魂所在之智能合约编写(Web3项目一实战之二)
    充电桩高压安全测量方案
    JavaScript面向对象动态添加标签页 (ES6)
    IDC第一的背后,阿里云在打造怎样的一朵“视频云”?
    期货价值计算方法(期货的价值怎么计算)
    Compression-Resistant Backdoor Attack against Deep Neural Networks 论文笔记
    学习JAVA如何更快高效的掌握
    深入了解接口测试:Postman 接口测试指南
    Linux-Linux启动过程
  • 原文地址:https://blog.csdn.net/anglemanyi/article/details/127138222