编写第一个MapReduce程序(WordCount)

末蓝、 2022-12-15 06:30 323阅读 0赞

一、数据格式准备

  1. 创建一个新的文件
    【在master节点中】

    1. vim wordcount.txt
  2. 向其中放入内容并保存

    1. hello,world,hadoop
    2. hive,sqoop,flume,hello
    3. kitty,tom,jerry,world
    4. hadoop
  3. 上传到HDFS

    1. hdfs dfs -mkdir /wordcount/ #创建文件夹
    2. hdfs dfs -put wordcount.txt /wordcount/ #上传文件

二、创建Maven项目

pom.xml文件

  1. <packaging>jar</packaging>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.apache.hadoop</groupId>
  5. <artifactId>hadoop-common</artifactId>
  6. <version>2.9.2</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.hadoop</groupId>
  10. <artifactId>hadoop-client</artifactId>
  11. <version>2.9.2</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.hadoop</groupId>
  15. <artifactId>hadoop-hdfs</artifactId>
  16. <version>2.9.2</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.hadoop</groupId>
  20. <artifactId>hadoop-mapreduce-client-core</artifactId>
  21. <version>2.9.2</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>junit</groupId>
  25. <artifactId>junit</artifactId>
  26. <version>RELEASE</version>
  27. </dependency>
  28. </dependencies>

二、编写Mapper类

  1. package com.ly;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. public class WordCountMapper extends Mapper<LongWritable, Text,Text,LongWritable> {
  7. //map方法就是将K1和V1转为K2和V2
  8. /* 参数: key :K1 行偏移量 value :V1 每一行的文本数据 context : 表示上下文对象 */
  9. @Override
  10. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  11. //1:将一行的文本数据进行拆分
  12. String line = value.toString();
  13. String[] split = line.split(",");
  14. //2:遍历数组,组装K2和V2
  15. for (String word : split){
  16. //3:将K2和V2写入上下文
  17. context.write(new Text(word),new LongWritable(1));
  18. }
  19. }
  20. }

Mapper继承Mapper抽象类,重写map方法

三、编写Reducer类

  1. package com.ly;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5. import java.io.IOException;
  6. public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {
  7. @Override
  8. protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
  9. long count = 0;
  10. //1:遍历集合,将集合中的数字相加,得到V3
  11. for(LongWritable value : values){
  12. count += value.get();
  13. }
  14. //2:将K3和V3写入上下文中
  15. context.write(key, new LongWritable(count));
  16. }
  17. }

四、编写主类

  1. package com.ly;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.conf.Configured;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.LongWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  10. import org.apache.hadoop.util.Tool;
  11. import org.apache.hadoop.util.ToolRunner;
  12. public class JobMain extends Configured implements Tool {
  13. @Override
  14. public int run(String[] strings) throws Exception {
  15. //创建一个job任务对象
  16. Job job = Job.getInstance(super.getConf(),JobMain.class.getSimpleName());
  17. //配置job任务对象
  18. job.setJarByClass(JobMain.class); //主类
  19. //第一步:指定文件的读取方式和读取路径
  20. job.setInputFormatClass(TextInputFormat.class);
  21. TextInputFormat.addInputPath(job,new Path("hdfs://192.168.239.164:9000/wordcount"));
  22. //第二步:设置Mapper类
  23. job.setMapperClass(WordCountMapper.class);
  24. job.setMapOutputKeyClass(Text.class);
  25. job.setMapOutputValueClass(LongWritable.class);
  26. job.setReducerClass(WordCountReducer.class);
  27. job.setOutputKeyClass(Text.class);
  28. job.setOutputValueClass(LongWritable.class);
  29. job.setOutputFormatClass(TextOutputFormat.class);
  30. TextOutputFormat.setOutputPath(job,new Path("hdfs://192.168.239.164:9000/wordcount_out"));
  31. boolean b1 = job.waitForCompletion(true);
  32. return b1 ? 0 : 1;
  33. }
  34. public static void main(String[] args) throws Exception {
  35. Configuration configuration = new Configuration();
  36. int run = ToolRunner.run(configuration, new JobMain(), args);
  37. System.exit(run);
  38. }
  39. }

使用命令进行打包或IDEA的maven插件进行打包

  1. mvn clean package

将生成的jar包上传至主机节点中的\opt目录下,放在\root路径下可能会引发权限读取问题。

五、验证结果

在上传的jar包所在路径执行以下命令:

  1. hadoop jar wordcount-hadoop-1.0-SNAPSHOT.jar com.ly.JobMain

hadoop jar jar包名称 主类的完整类名

在这里插入图片描述
可以通过web页面查看并下载结果
通过浏览器访问master节点地址:http://192.168.239.164:50070/
在这里插入图片描述
在选项栏选择Utilities→Browse the file system
在这里插入图片描述
点击wordcount_count,查看结果输出文件夹中的结果
在这里插入图片描述
点击part-r-00000链接在弹出的窗口中可以选择下载结果文件
在这里插入图片描述
输出结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读