个人随笔
目录
Hadoop实战之单词计数程序wordcount
2019-10-18 23:21:22

我们搭建好集群后,也运行了hadoop本身自带提供的单词测试程序,现在我们用Eclipse和mavenlai8手动编写一下单词计数程序并提交到hadoop上运行。

一、环境准备

参考我之前的博文搭建好hadoop完全分布式环境并且启动。主备eclipse和maven.

二、新建一个maven项目

用eclipse新建一个maven羡慕,在pom.xml中添加如下依赖:

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-common</artifactId>
  4. <version>2.8.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hadoop</groupId>
  8. <artifactId>hadoop-hdfs</artifactId>
  9. <version>2.8.5</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.hadoop</groupId>
  13. <artifactId>hadoop-mapreduce-client-core</artifactId>
  14. <version>2.8.5</version>
  15. </dependency>

因为要打包成可执行jar并且有第三方依赖,需要添加如下build

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <artifactId>maven-compiler-plugin</artifactId>
  5. <configuration>
  6. <source>1.6</source>
  7. <target>1.6</target>
  8. </configuration>
  9. </plugin>
  10. <plugin>
  11. <groupId>org.apache.maven.plugins</groupId>
  12. <artifactId>maven-shade-plugin</artifactId>
  13. <version>1.4</version>
  14. <configuration>
  15. <createDependencyReducedPom>false</createDependencyReducedPom>
  16. </configuration>
  17. <executions>
  18. <execution>
  19. <!-- 执行package的phase -->
  20. <phase>package</phase>
  21. <!-- 为这个phase绑定goal -->
  22. <goals>
  23. <goal>shade</goal>
  24. </goals>
  25. <configuration>
  26. <!-- 过滤掉以下文件,不打包 :解决包重复引用导致的打包错误-->
  27. <filters>
  28. <filter>
  29. <artifact>*:*</artifact>
  30. <excludes>
  31. <exclude>META-INF/*.SF</exclude>
  32. <exclude>META-INF/*.DSA</exclude>
  33. <exclude>META-INF/*.RSA</exclude>
  34. </excludes>
  35. </filter>
  36. </filters>
  37. <transformers>
  38. <transformer
  39. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  40. <resource>META-INF/spring.handlers</resource>
  41. </transformer>
  42. <!-- 打成可执行的jar包 的主方法入口-->
  43. <transformer
  44. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  45. <mainClass>com.suibibk.App</mainClass>
  46. </transformer>
  47. <transformer
  48. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  49. <resource>META-INF/spring.schemas</resource>
  50. </transformer>
  51. </transformers>
  52. </configuration>
  53. </execution>
  54. </executions>
  55. </plugin>
  56. </plugins>
  57. </build>

注意修改主方法入口,也就是main方法所在类,这样子程序就可以直接maven install打包了。

三、编写Mapper、Reducer和启动类

Mapreduce程序围绕着分而治之的思想来的,分就是Mapper程序,治就是Reducer程序,然后用一个启动类将job提交给集群运行即可。

1、项目结构

2、启动类
  1. package com.suibibk;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.FileSystem;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  10. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  11. public class App {
  12. /**
  13. * 1. 业务逻辑相关信息通过job对象定义与实现 2. 将绑定好的job提交给集群去运行
  14. */
  15. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  16. Configuration conf = new Configuration();
  17. Job job = Job.getInstance(conf);
  18. job.setJarByClass(App.class);
  19. job.setMapperClass(MyMapper.class);
  20. job.setReducerClass(MyReducer.class);
  21. // 设置业务逻辑Mapper类的输出key和value的数据类型
  22. job.setMapOutputKeyClass(Text.class);
  23. job.setMapOutputValueClass(IntWritable.class);
  24. job.setOutputKeyClass(Text.class);
  25. job.setOutputValueClass(IntWritable.class);
  26. // 指定要处理的数据所在的位置
  27. FileSystem fs = FileSystem.get(conf);
  28. String inputPath = args[0];
  29. Path input = new Path(inputPath);
  30. if(fs.exists(input)) {
  31. FileInputFormat.addInputPath(job, input);
  32. }
  33. // 指定处理完成之后的结果所保存的位置
  34. String outputPath = args[1];
  35. Path output = new Path(outputPath);
  36. //需要先删除,不然第二次执行会报错
  37. fs.delete(output, true);
  38. FileOutputFormat.setOutputPath(job, output);
  39. // 向yarn集群提交这个job
  40. boolean res = job.waitForCompletion(true);
  41. System.exit(res ? 0 : 1);
  42. }
  43. }

注意在hadoop2中FileInputFormat所属的包为: org.apache.hadoop.mapreduce.lib.input.FileInputFormat。out也一样,不要搞错了,我这里直接把导入的包也黏贴上来。

3、Mapper
  1. package com.suibibk;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.LongWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
  8. // map方法的生命周期: 框架每传一行数据就被调用一次
  9. protected void map(LongWritable key, Text value,Context context) throws IOException ,InterruptedException {
  10. String line = value.toString(); // 行数据转换为string
  11. String[] words = line.split(" "); // 行数据分隔单词
  12. for (String word : words) { // 遍历数组,输出<单词,1>
  13. context.write(new Text(word), new IntWritable(1));
  14. }
  15. }
  16. }
4、Reducer
  1. package com.suibibk;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Reducer;
  6. public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
  7. // 生命周期:框架每传递进来一个kv 组,reduce方法被调用一次
  8. @Override
  9. protected void reduce(Text key, Iterable<IntWritable> values,
  10. Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
  11. int count = 0; // 定义一个计数器
  12. for (IntWritable value : values) { // 遍历所有v,并累加到count中
  13. count += value.get();
  14. }
  15. context.write(key, new IntWritable(count));
  16. }
  17. }

四、提交测试

1、项目右键执行maven install(package也可以)

然后再target中获得jar包。

2、上传到hadoop集群的一台机中

我这里是上传到worker1中。

4、执行测试

测试之前得先准备一下输入文件,这里用file2.txt来,然后执行如下命令:

  1. hadoop jar wordcount-0.0.1-SNAPSHOT.jar /input/file2.txt /output

执行成功后查看结果:

  1. hadoop hdfs -cat /output/*

会发现跟hadoop提供的例子结果一样。

完成。

 163

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2