前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >7.0 MapReduce 编程

7.0 MapReduce 编程

作者头像
皮卡苏
发布2021-08-12 10:58:55
3050
发布2021-08-12 10:58:55
举报
文章被收录于专栏:用户1343320的专栏

在学习了 MapReduce 的使用之后,我们已经可以处理 Word Count 这类统计和检索任务,但是客观上 MapReduce 可以做的事情还有很多。

MapReduce 主要是依靠开发者通过编程来实现功能的,开发者可以通过实现 Map 和 Reduce 相关的方法来进行数据处理。

为了简单的展示这一过程,我们将手工编写一个 Word Count 程序。

注意:MapReduce 依赖 Hadoop 的库,但由于本教程使用的 Hadoop 运行环境是 Docker 容器,难以部署开发环境,所以真实的开发工作(包含调试)将需要一个运行 Hadoop 的计算机。在这里我们仅学习已完成程序的部署。

MyWordCount.java 文件代码

/**  * 引用声明  * 本程序引用自 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html  */ package com.runoob.hadoop ; import java.io.IOException ; import java.util.* ; import org.apache.hadoop.fs.Path ; import org.apache.hadoop.io.* ; import org.apache.hadoop.mapred.* ; /**  * 与 `Map` 相关的方法  */ class Map extends MapReduceBase implements Mapper <LongWritable, Text, Text, IntWritable > { private final static IntWritable one = new IntWritable ( 1 ) ; private Text word = new Text ( ) ; public void map (LongWritable key,                Text value,                OutputCollector <Text, IntWritable > output,                Reporter reporter ) throws IOException { String line = value. toString ( ) ; StringTokenizer tokenizer = new StringTokenizer (line ) ; while (tokenizer. hasMoreTokens ( ) ) {          word. set (tokenizer. nextToken ( ) ) ;          output. collect (word, one ) ; } } } /**  * 与 `Reduce` 相关的方法  */ class Reduce extends MapReduceBase implements Reducer <Text, IntWritable, Text, IntWritable > { public void reduce (Text key,                   Iterator <IntWritable > values,                   OutputCollector <Text, IntWritable > output,                   Reporter reporter ) throws IOException { int sum = 0 ; while (values. hasNext ( ) ) {          sum += values. next ( ). get ( ) ; }       output. collect (key, new IntWritable (sum ) ) ; } } public class MyWordCount { public static void main ( String [ ] args ) throws Exception {       JobConf conf = new JobConf (MyWordCount. class ) ;       conf. setJobName ( “my_word_count” ) ;       conf. setOutputKeyClass (Text. class ) ;       conf. setOutputValueClass (IntWritable. class ) ;       conf. setMapperClass ( Map. class ) ;       conf. setCombinerClass (Reduce. class ) ;       conf. setReducerClass (Reduce. class ) ;       conf. setInputFormat (TextInputFormat. class ) ;       conf. setOutputFormat (TextOutputFormat. class ) ; // 第一个参数表示输入       FileInputFormat. setInputPaths (conf, new Path (args [ 0 ] ) ) ; // 第二个输入参数表示输出       FileOutputFormat. setOutputPath (conf, new Path (args [ 1 ] ) ) ;       JobClient. runJob (conf ) ; } }

请将此 Java 文件的内容保存到 NameNode 容器中去,建议位置:

代码语言:javascript
复制
/home/hadoop/MyWordCount/com/runoob/hadoop/MyWordCount.java

注意:根据当前情况,有的 Docker 环境中安装的 JDK 不支持中文,所以保险起见,请去掉以上代码中的中文注释。

进入目录:

代码语言:javascript
复制
cd /home/hadoop/MyWordCount

编译:

代码语言:javascript
复制
javac -classpath ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.4.jar -classpath ${HADOOP_HOME}/share/hadoop/client/hadoop-client-api-3.1.4.jar com/runoob/hadoop/MyWordCount.java

打包:

代码语言:javascript
复制
jar -cf my-word-count.jar com

执行:

代码语言:javascript
复制
hadoop jar my-word-count.jar com.runoob.hadoop.MyWordCount /wordcount/input /wordcount/output2

查看结果:

代码语言:javascript
复制
hadoop fs -cat /wordcount/output2/part-00000

输出:

代码语言:javascript
复制
I       4
hadoop  2
like    2
love    2
runoob  2

声明:版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MyWordCount.java 文件代码
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档