当前位置:   article > 正文

实验三-MapReduce编程_mapreduce代码

mapreduce代码

前提:安装好Hadoop

参考文章:

MapReduce编程实践(Hadoop3.1.3)_厦大数据库实验室博客

实验要求

基于MapReduce执行“词频统计”任务。 将提供的A,B,C文件上传到HDFS上,之后编写MapReduce代码并将其部署到hadoop,实现文件A,B,C中的词频统计。对实验过程进行详细阐述。

实验步骤

        1. 启动Hadoop

        

         2. 上传本地文件至hdfs

  •         在hdfs中创建存放本地文件的文件夹
  1. $./bin/hdfs dfs -mkdir -p -mkdir /user/hadoop/input
  2. $./bin/hdfs dfs -mkdir -p -mkdir /user/hadoop/input

  •         将文件上传至hdfs中

        

 (上传结果)

        

        3. 在eclipse中创建java代码

  •         创建java project,并导入Hadoop相关包
  1. 1)“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;
  2. 2)“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
  3. 3)“/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有JAR包;
  4. 4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有JAR包。

  •         编写MapReduce代码

  1. //java类相关包
  2. import java.io.IOException;
  3. import java.util.Iterator;
  4. import java.util.StringTokenizer;
  5. import org.apache.hadoop.conf.Configuration;//这个包是专门管理配置文件的,包含了hadoop中所有关于文件管理的类,所有的都是继承它
  6. import org.apache.hadoop.fs.Path;//可以读取url路径
  7. import org.apache.hadoop.io.IntWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;//调用MapReduce的job
  10. import org.apache.hadoop.mapreduce.Mapper;
  11. import org.apache.hadoop.mapreduce.Reducer;
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  14. import org.apache.hadoop.util.GenericOptionsParser;
  15. public class WordCount {
  16. //map 处理逻辑
  17. public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
  18. private static final IntWritable one = new IntWritable(1);//声明输出类型变量
  19. private Text word = new Text();//声明输出类型变量
  20. //重写Mapper框架逻辑,加入本身项目的处理逻辑
  21. //定义输出的文本类型,输出格式,上下文环境变量
  22. public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
  23. StringTokenizer itr = new StringTokenizer(value.toString()); //定义分词器,切分文本,默认划分
  24. while(itr.hasMoreTokens()) {
  25. this.word.set(itr.nextToken());//从分词器中取出
  26. context.write(this.word, one);//输出格式为:<word,one>
  27. }
  28. }
  29. }
  30. //reduce 处理逻辑
  31. //输入形式 <key,value-list>
  32. public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  33. private IntWritable result = new IntWritable();//声明输出类型变量
  34. //重写Mapper框架逻辑,加入本身项目的处理逻辑
  35. public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
  36. int sum = 0;//sum统计单个单词的词频结果
  37. IntWritable val;
  38. for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {//遍历循环
  39. val = (IntWritable)i$.next();
  40. }
  41. this.result.set(sum);//将得到的词频数量写入result中
  42. context.write(key, this.result);//输出格式为:<key,result>
  43. }
  44. }
  45. //编写主函数
  46. public static void main(String[] args) throws Exception {
  47. Configuration conf = new Configuration();//初始化配置
  48. String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
  49. if(otherArgs.length < 2) {
  50. System.err.println("Usage: wordcount <in> [<in>...] <out>");
  51. System.exit(2);
  52. }
  53. Job job = Job.getInstance(conf, "word count");//设置环境参数
  54. job.setJarByClass(WordCount.class);//设置整个程序的类名
  55. job.setMapperClass(WordCount.TokenizerMapper.class);//添加MyMapper类
  56. job.setCombinerClass(WordCount.IntSumReducer.class);
  57. job.setReducerClass(WordCount.IntSumReducer.class);//添加IntSumReducer类
  58. job.setOutputKeyClass(Text.class);//设置输出类型
  59. job.setOutputValueClass(IntWritable.class); //设置输出类型
  60. //将文件夹中所有文件作为输入文件
  61. for(int i = 0; i < otherArgs.length - 1; ++i) {
  62. FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
  63. }
  64. //设置输出文件
  65. FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
  66. System.exit(job.waitForCompletion(true)?0:1);//完成词频统计任务
  67. }
  68. }

         

        4. java代码打包成jar包并部署到Hadoop上

        5. 对文件实现词频统计

        在终端运行java 代码实现词频统计


小贴士

 在终端运行java 代码实现词频统计时一定要确保输出的路径也就是output,不存在,要不然会报错的。

实验中遇到的问题及解决方法

The class file Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT> contains a signature'(Lorg/apache/hadoop/mapreduce/Mapper<TKEYIN;TVALUEIN;TKEYOUT;TVALUEOUT;>.Context;)V' ill-formed at position 74

 

 解决方法:因为在创建java project时没有选择当前的Linux系统中已经安装好的JDK而出现的问题

修改前

 

修改后


实验参考厦门大学老师的hdfs编程教程

如果有什么错漏的地方,请各位大佬指教[抱拳]

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

闽ICP备14008679号