前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每周学点大数据 | No.65 “Hello World”程序—— WordCount(上)

每周学点大数据 | No.65 “Hello World”程序—— WordCount(上)

作者头像
灯塔大数据
发布2018-04-03 16:17:07
5600
发布2018-04-03 16:17:07
举报
文章被收录于专栏:灯塔大数据灯塔大数据

编者按:灯塔大数据将每周持续推出《从零开始学大数据算法》的连载,本书为哈尔滨工业大学著名教授王宏志老师的扛鼎力作,以对话的形式深入浅出的从何为大数据说到大数据算法再到大数据技术的应用,带我们在大数据技术的海洋里徜徉~每周五定期更新

上期回顾&查看方式

在上一期,我们学习了配置Hadoop的相关内容。PS:了解了上期详细内容,请在自定义菜单栏中点击“灯塔数据”—“技术连载”进行查看;或者滑到文末【往期推荐】查看。

NO.65

“Hello World”程序—WordCount

Mr. 王 :你知道“Hello World”吗?

小可 :嗯,我在学习 C 语言时,学会的第一个程序就是向屏幕输出一行“Hello World!”。后来程序员们就喜欢用 Hello World 来代指学习每一种语言的第一个程序。

Mr. 王 :今天我们就来学习 Hadoop 的“Hello World”。

小可 :它不会也是向屏幕输出一行 Hello World 吧?

Mr. 王笑着说 :当然不是了,这样简单的任务如何能够体现一个并行计算系统的效果呢?前面我们讲过关于 WordCount 的内容。WordCount 是 Hadoop 最基本的一种应用,有很多人说WordCount 就是 Hadoop 的“Hello World”。

小可 :嗯,WordCount 就是统计文章中单词出现的个数。那么应该怎么去实现它呢?

Mr. 王 :我们先来看看代码是如何实现的。我们知道 Hadoop 的原生开发语言是 Java,所以这个程序也使用 Java 来编写。程序清单如下 :

我们来分析一下这个程序。

程序的第一部分是包的引用,这里包括一些我们会用到的常见的 Java 包,也包括一些Hadoop 中的包。

第二部分,在类中定义内嵌类 Map,也就是 MapReduce 中的 Map 部分,首先,Map 是MapReduceBase 基类的派生类,这个类定义在 Hadoop 的包中 ;其次,它也是对接口 Mapper的实现,其中要对 Mapper 接口的模板类型进行指定。

小可:我以前从来没见过 LongWritable、Text、IntWritable 这几种类型,它们有什么用呢?

Mr. 王 :这几种类型是 Hadoop 中定义的,它们用于封装 Java 中的 long、int、string 等类型。Hadoop 对这些类型进行了重新设计和定义,使之更适合于分布式、并行的环境。读代码时,只要把它们看作 long string 和 int,写代码时,记得用它们替换 Java 中的基本类型就可以了。

Mr. 王 :这是对 Map 类中 map 方法的定义,由它来完成 Map 的主要工作。在参数列表中,key 和 value 两个变量对应着 MapReduce 中的 key-value 对 ;而OutputCollector<Text,IntWritable> 对 Mapper 的输出类型进行了定义,在 WordCount 的设计中,Mapper 要输出的就是word,1 这样的键值对,所以我们定义的 OutputCollector 就应当匹配 word 的类型 Text 和 1 的类型 IntWritable。

小可 :嗯,下面这部分就比较好理解了,使用一个 StringTokenizer 类将原文中连起来的长字符串内容切分成一个个单词,然后将单词逐个地和 1 组合并发送出去。这是符合我们对Mapper1 的定义的。

Mr. 王 :Reducer 和 Mapper 的定义是相类似的。我们也要定义内嵌类 Reduce,并且它也是MapReduceBase 基类的派生类,这一次要实现的接口是 Reducer。

小可 :嗯,下面这部分也是比较好理解的,Reducer 会对收集来的 word,1 进行统计,将相同的单词的值累加起来。

Mr. 王:主函数是其中的 Hadoop 的运行进行一些配置,顾名思义,可以通过直接阅读这些英文单词来了解它们的意义。比如setOutputValueClass 就是设定输出值的类型,setMapperClass就是设置 Mapper 的类型等。

我们将 MapReduce 执行的一个工作称作一个 Job,在完成了所有的定义和配置之后,我们要让 Job 运行起来,用的就是最后一句代码 :

小可 :我觉得这个程序挺简单的,除了和 MapReduce 接口相关的一些内容以外,就像我们平时写的单机程序一样。

Mr. 王 :这就是 MapReduce 平台的强大之处,内部处理的很多问题,比如网络的连接、通信、具体的任务分配等都不需要开发者去规定和设计,只要基于 MapReduce 这个框架,就可以免去使用者的很多麻烦。

小可 :的确,那我们来看看运行结果吧。直接运行这个 Java 程序就可以了吗?

Mr. 王 :这是不行的,至少要给这个程序输入输出吧。想一想,这个程序的输出应该保存在哪里?

小可 :我记得 Hadoop 的两个核心组件是 MapReduce 和 HDFS,HDFS 是用来保存文件的,对于这种大规模的输入量,应该是以文件形式存储的吧,所以应该放在 HDFS 里面。

Mr. 王 :没错,我们来看看具体是怎么做的。

首先我们要把程序变成一个 jar 包。

将程序文件放入 Hadoop 文件夹,并且进入 Hadoop 文件夹。

接下来编译 WordCount.java。

在这里不同的版本可能会略有不同,形如 hadoop-core-1.0.1.jar 这样的包名可以去 Hadoop文件夹下查看实际的名字。

打包刚才生成的类文件。

注意不要丢掉最后的点号。

小可:这一步就是把 WordCount 和一些依赖的 Hadoop 部分编译到一起,封装成一个 jar 包。

Mr. 王 :接下来我们试试在 Hadoop 框架下运行一下已经编译好的 WordCount。

别忘了格式化 HDFS,使用我们前面说过的命令 :

屏幕上会出现一些 NameNode 的状态信息。如果出现了是否重新进行格式化的提示,则说明你的 HDFS 已经进行过格式化了,可以重新格式化或者放弃。

格式化完成之后,我们就可以启动 Hadoop 了。使用脚本文件 start-all.sh :

屏幕上会出现大量的提示信息 :

可以看出,Hadoop 依次启动了 NameNode、DataNode、JobTracker 和TaskTracker,在一些Hadoop 版本中还有可能包含形如 secondarynamenode 这样的部分。

下期精彩预告

经过学习,我们研究了 WordCount涉及到的一些具体问题。在下一期中,我们将进一步了解“Hello World”程序—— WordCount的相关内容。更多精彩内容,敬请关注灯塔大数据,每周五不见不散呦!

文章作者:王宏志

文章编辑:田芳

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灯塔大数据 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档