当前位置:   article > 正文

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

mapreduce词频统计

      MapRdeuce编程示例——词频统计

一、MapRdeuce的词频统计的过程

二、编程过程

      以下操作是对报错进行改进,让人能看出代码出现什么错误

  •  *对pom.xml添加内容

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-log4j12</artifactId>
  4. <version>1.7.30</version>
  5. </dependency>
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <version>3.6.1</version>
  7. <configuration>
  8. <source>1.8</source>
  9. <target>1.8</target>
  10. </configuration>
  11. </plugin>
  12. <!-- 把依赖的所有 jar 包打包到可执行 jar 中 -->
  13. <plugin>
  14. <artifactId>maven-assembly-plugin</artifactId>
  15. <configuration>
  16. <descriptorRefs>
  17. <descriptorRef>jar-with-dependencies</descriptorRef>
  18. </descriptorRefs>
  19. </configuration>
  20. <executions>
  21. <execution>
  22. <id>make-assembly</id>
  23. <phase>package</phase>
  24. <goals>
  25. <goal>single</goal>
  26. </goals>
  27. </execution>
  28. </executions>
  29. </plugin>
  30. </plugins>
  31. </build>

 在这个位置进行添加

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

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<LongWritable, Text,Text,IntWritable> {
  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<Text,IntWritable,Text,IntWritable> {
  13. @Override
  14. protected void reduce(Text key, Iterable<IntWritable> 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. }
  • *打包成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

解决方法二

输入指定文本路径

然后运行

解决方法三

//{input2\*} 表示读取该路径下所有的文件

然后运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/663388
推荐阅读
相关标签
  

闽ICP备14008679号