• Hadoop学习总结(MapRdeuce的词频统计)


          MapRdeuce编程示例——词频统计

    一、MapRdeuce的词频统计的过程

    二、编程过程

    1、Mapper 组件

    WordcountMapper.java

    1. package com.itcast.mrdemo;
    2. import org.apache.hadoop.io.IntWritable;
    3. import org.apache.hadoop.io.LongWritable;
    4. import org.apache.hadoop.io.Text;
    5. import org.apache.hadoop.mapreduce.Mapper;
    6. import java.io.IOException;
    7. /**
    8. * Map 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
    9. *
    10. * hadoop 有自己的数据类型,不使用 java 的数据类型,对应的 java 类型名字后面 + Writable 就是 hadoop 类型
    11. * String 除外,String 对于的 hadoop 类型叫做 Text
    12. * <2, "java">
    13. * */
    14. public class WordcountMapper extends Mapper {
    15. //重写Ctrl+o
    16. @Override
    17. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    18. /**
    19. * 1、把一行字符串拆分成单词 "hello java"
    20. * 2、把单词、数字每一个按照 map 规定的格式输出
    21. */
    22. // 把 hadoop 类型转换为 java 类型(接收传入进来的一行文本,把数据类型转换为 String 类型)
    23. String line = value.toString();
    24. // 把字符串拆分为单词
    25. String[] words = line.split(" ");
    26. //使用 for 循环把单词数组胡每个单词输出
    27. for (String word : words){
    28. context.write(new Text(word), new IntWritable(1));
    29. }
    30. }
    31. }

    2、Reducer 组件

    WordcountReducer.java

    1. package com.itcast.mrdemo;
    2. import org.apache.hadoop.io.IntWritable;
    3. //import org.apache.hadoop.io.LongWritable;
    4. import org.apache.hadoop.io.Text;
    5. import org.apache.hadoop.mapreduce.Reducer;
    6. import java.io.IOException;
    7. /**
    8. * Reduce 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
    9. * 1、Map 的输出就是 Reduce 的输入
    10. * 2、Reduce 的输出是 <"java", 2>
    11. */
    12. public class WordcountReducer extends Reducer {
    13. @Override
    14. protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
    15. int sum = 0;
    16. for (IntWritable value : values){
    17. sum ++;
    18. }
    19. context.write(key,new IntWritable(sum));
    20. }
    21. }

    3、MapRdeuce 运行模式

    MapRdeuce 程序的运行模式主要有两种

    (1)本地运行模式

          在当前的开发环境模拟 MapRdeuce 执行环境,处理的数据及输出结果在本地操作系统WordcountDriver.java

    1. package com.itcast.mrdemo;
    2. import org.apache.hadoop.conf.Configuration;
    3. import org.apache.hadoop.fs.Path;
    4. import org.apache.hadoop.io.IntWritable;
    5. import org.apache.hadoop.io.Text;
    6. import org.apache.hadoop.mapreduce.Job;
    7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    9. import java.io.IOException;
    10. public class WordcountDriver{
    11. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    12. //通过 Job 来封装本次 MR 的相关信息
    13. Configuration conf = new Configuration();
    14. //System.setProperty("HADOOP_USER_NAME","root");
    15. //配置 MR 运行模式,使用 local 表示本地模式,可以省略
    16. conf.set("mapreduce.framework.name","local");
    17. Job job = Job.getInstance(conf);
    18. //指定 MR Job jar 包运行主类
    19. job.setJarByClass(WordcountDriver.class);
    20. //指定本次 MR 所有的 Mapper Reducer 类
    21. job.setMapperClass(WordcountMapper.class);
    22. job.setReducerClass(WordcountReducer.class);
    23. //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
    24. job.setMapOutputKeyClass(Text.class);
    25. job.setMapOutputValueClass(IntWritable.class);
    26. //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
    27. job.setOutputKeyClass(Text.class);
    28. job.setOutputValueClass(IntWritable.class);
    29. //使用本地模式指定处理的数据所在的位置
    30. FileInputFormat.setInputPaths(job,"D:/homework2/Hadoop/mr/input");
    31. //使用本地模式指定处理完成之后的结果所保存的位置
    32. FileOutputFormat.setOutputPath(job, new Path("D:/homework2/Hadoop/mr/output"));
    33. //提交程序并且监控打印程序执行情况
    34. boolean res = job.waitForCompletion(true);
    35. //执行成功输出 0 ,不成功输出 1
    36. System.exit(res ? 0 : 1);
    37. }
    38. }

    运行结果为:

    (2)集群运行模式

    • *在HDFS中创建文件

    在HDFS中的/input目录下有word.txt文件,且文件中编写有内容(内容随意编写)

    • *对 WordcountDriver.java 修改

     修改WordcountDriver.java中的路径为HDFS上的路径

    1. package com.itcast.mrdemo;
    2. import org.apache.hadoop.conf.Configuration;
    3. import org.apache.hadoop.fs.Path;
    4. import org.apache.hadoop.io.IntWritable;
    5. import org.apache.hadoop.io.Text;
    6. import org.apache.hadoop.mapreduce.Job;
    7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    9. import java.io.IOException;
    10. public class WordcountDriver{
    11. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    12. //通过 Job 来封装本次 MR 的相关信息
    13. Configuration conf = new Configuration();
    14. //System.setProperty("HADOOP_USER_NAME","root");
    15. //配置 MR 运行模式,使用 local 表示本地模式,可以省略
    16. conf.set("mapreduce.framework.name","local");
    17. Job job = Job.getInstance(conf);
    18. //指定 MR Job jar 包运行主类
    19. job.setJarByClass(WordcountDriver.class);
    20. //指定本次 MR 所有的 Mapper Reducer 类
    21. job.setMapperClass(WordcountMapper.class);
    22. job.setReducerClass(WordcountReducer.class);
    23. //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
    24. job.setMapOutputKeyClass(Text.class);
    25. job.setMapOutputValueClass(IntWritable.class);
    26. //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
    27. job.setOutputKeyClass(Text.class);
    28. job.setOutputValueClass(IntWritable.class);
    29. //使用本地模式指定处理的数据所在的位置
    30. FileInputFormat.setInputPaths(job,"/input");
    31. //使用本地模式指定处理完成之后的结果所保存的位置
    32. FileOutputFormat.setOutputPath(job, new Path("/output"));
    33. //提交程序并且监控打印程序执行情况
    34. boolean res = job.waitForCompletion(true);
    35. //执行成功输出 0 ,不成功输出 1
    36. System.exit(res ? 0 : 1);
    37. }
    38. }
    • *对pom.xml添加内容

    1. org.slf4j
    2. slf4j-log4j12
    3. 1.7.30
    1. org.apache.maven.plugins
    2. maven-compiler-plugin
    3. 3.6.1
    4. 1.8
    5. 1.8
    6. maven-assembly-plugin
    7. jar-with-dependencies
    8. make-assembly
    9. package
    10. single

     在这个位置进行添加

    *在resources创建文件

    在resources创建文件log4j.properties

    添加以下内容

    1. log4j.rootLogger=INFO, stdout
    2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    5. log4j.appender.logfile=org.apache.log4j.FileAppender
    6. log4j.appender.logfile.File=target/spring.log
    7. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    8. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

    • *打包成jar包

     双击,进行打包

     结果出现以下字段则打包成功

    • *上传到虚拟机的home目录下

    右键打开

    重命名为wc 

     随便复制到一个目录下

    使用远程连接工具(Xshell或者SecurityCRT)进行上传

    • *进行集群运行

    进入home目录

    1. cd /home
    2. ll

     在 WordcountDriver.java下复制路径

    hadoop jar wc.jar com.itcast.mrdemo.WordcountDriver

    运行结果 

    • *查看HDFS 集群

    进行查看

          集群运行成功

    4、运行前准备操作

    现在目录下创建一个文本

    编写内容(随意编写)

    5、Error while running command to get file permissions : java.io.IOException: (null) entry in command string: null ls -F D:\homework2\Hadoop\mr\input\word.txt

    出现以下错误

    解决方法一

    下载winutils.exe和hadoop.dll放到C:\Windows\System32

    链接:https://pan.baidu.com/s/1XwwUD9j3YT2AJMUNHmyzhw 
    提取码:q7i7

    解决方法二

    输入指定文本路径

    然后运行

  • 相关阅读:
    IB物理应该怎么学?
    dbeaver 1064 42000 错误 query execution failed
    利用dom4j组装xml
    操作系统期末复习题版详解(含解析)
    【Redis】关于过期数据清除的一些策略
    全球价值链GVC总出口分解(2011-2014年)
    人计与机算:为什么AI距离智能越来越远?
    【动画进阶】类 ChatGpt 多行文本打字效果
    git修改远程分支名称
    【Vue】vue项目目录介绍 es6的导入导出语法 vue项目开发规范 Vue项目编写步骤
  • 原文地址:https://blog.csdn.net/2202_75688394/article/details/134465070