5行代码怎么实现Hadoop的WordCount?
初学编程的人,都知道hello world的含义,当你第一次从控制台里打印出了hello world,就意味着,你已经开始步入了编程的大千世界,这和第一个吃螃蟹的人的意义有点类似,虽然这样比喻并不恰当。
如果说学会了使用hello world就代表着你踏入了单机编程的大门,那么学会在分布式环境下使用wordcount,则意味着你踏入了分布式编程的大门。试想一下,你的程序能够成百上千台机器的集群中运行,是不是一件很有纪念意义的事情呢?不管在Hadoop中,还是Spark中,初次学习这两个开源框架做的第一个例子无疑于wordcount了,只要我们的wordcount能够运行成功,那么我们就可以大胆的向后深入探究了。
扯多了,下面赶紧进入正题,看一下,如何使用5行代码来实现hadoop的wordcount,在Hadoop中如果使用Java写一个wordcount最少也得几十行代码,如果通过Hadoop Streaming的方式采用Python,PHP,或C++来写,差不多也得10行代码左右。如果是基于Spark的方式来操作HDFS,在采用Scala语言,来写wordcount,5行代码也能搞定,但是如果使用spark,基于Java的api来写,那么就臃肿了,没有几十行代码,也是搞不定的。
今天,散仙在这里既不采用spark的scala来写,也不采用hadoop streaming的python方式来写,看看如何使用我们的Pig脚本,来搞定这件事,测试数据如下:
- i am hadoop
- i am hadoop
- i am lucene
- i am hbase
- i am hive
- i am hive sql
- i am pig
Pig的全部脚本如下:
- --大数据交流群:376932160(广告勿入)
- --load文本的txt数据,并把每行作为一个文本
- a = load '$in' as (f1:chararray);
- --将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构
- b = foreach a generate flatten(TOKENIZE(f1, ' '));
- --对单词分组
- c = group b by $0;
- --统计每个单词出现的次数
- d = foreach c generate group ,COUNT($1);
- --存储结果数据
- stroe d into '$out'
处理结果如下:
- (i,7)
- (am,7)
- (pig,1)
- (sql,1)
- (hive,2)
- (hbase,1)
- (hadoop,2)
- (lucene,1)
是的,你没看错,就是5行代码,实现了数据的读取,分割,转换,分组,统计,存储等功能。非常简洁方便!
除了spark之外,没有比这更简洁的,但这仅仅只是一个作业而已,如果在需求里面,又加入了对结果排序,取topN,这时候在pig里面,还是非常简单,只需新加2行代码即可,但是在spark里面,可能就需要数行代码了。
我们看下,更改之后的pig代码,加入了排序,取topN的功能:
- --load文本的txt数据,并把每行作为一个文本
- a = load '$in' as (f1:chararray);
- --将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构
- b = foreach a generate flatten(TOKENIZE(f1, ' '));
- --对单词分组
- c = group b by $0;
- --统计每个单词出现的次数
- d = foreach c generate group ,COUNT($1);
- -- 按统计次数降序
- e = order d by $1 desc;
- --取top2
- f = limit e 2;
- --存储结果数据
- stroe f into '$out'
输出结果如下:
- (i,7)
- (am,7)
如果使用JAVA来编写这个MapReduce作业,后面的排序统计topn,必须得重新写一个job来执行,因为MapReduce干的事非常简单,一个job仅仅只处理一个功能,而在Pig中它会自动,帮我们分析语法树来构建多个依赖的MapReduce作业,而我们无须关心底层的代码实现,只需专注我们的业务即可。
除此之外,Pig还是一个非常灵活的批处理框架,通过自定义UDF模块,我们可以使用Pig来干很多事,看过散仙的上一篇文章的朋友们,应该就知道当初雅虎公司不仅仅使用Pig分析日志,搜索内容,PangeRank排名,而且还使用Pig来构建它们的web倒排索引等种种扩展功能,我们都可以通过Pig的UDF的方式来实现,它可以将我们的业务与MapReduce具体的实现解耦,而且复用性极强,我们写的任何一个工具类,都可以轻而易举的通过Pig稳定的运行在大规模的Hadoop集群之上。
扫码关注微信公众号:我是攻城师(woshigcs),如果有什么疑问,技术问题,职业问题等,欢迎在公众号上留言与我探讨!让我们做不一样的攻城师!谢谢大家!
转载请注明原创地址,谢谢配合!http://qindongliang.iteye.com/
5行代码怎么实现Hadoop的WordCount?的更多相关文章
- 伪分布式环境下命令行正确运行hadoop示例wordcount
首先确保hadoop已经正确安装.配置以及运行. 1. 首先将wordcount源代码从hadoop目录中拷贝出来. [root@cluster2 logs]# cp /usr/local/h ...
- hadoop从wordCount开始
最近一段时间大数据很火,我有稍微有点java基础,自然选择了由java编写的hadoop框架,wordCount是hadoop中类似于java中helloWorld的存在,自然不能错过. packag ...
- Hadoop下面WordCount运行详解
单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/ ...
- 通过 Mesos、Docker 和 Go,使用 300 行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
- 【hadoop代码笔记】hadoop作业提交之汇总
一.概述 在本篇博文中,试图通过代码了解hadoop job执行的整个流程.即用户提交的mapreduce的jar文件.输入提交到hadoop的集群,并在集群中运行.重点在代码的角度描述整个流程,有些 ...
- 【Hadoop代码笔记】Hadoop作业提交之TaskTracker 启动task
一.概要描述 在上篇博文描述了TaskTracker从Jobtracker如何从JobTracker获取到要执行的Task.在从JobTracker获取到LaunchTaskAction后,执行add ...
- hadoop的wordcount例子运行
可以通过一个简单的例子来说明MapReduce到底是什么: 我们要统计一个大文件中的各个单词出现的次数.由于文件太大.我们把这个文件切分成如果小文件,然后安排多个人去统计.这个过程就是”Map”.然后 ...
- hadoop执行wordcount例子
1:下载hadoop.http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz 2:解压. tar - ...
- 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
随机推荐
- C++之constexpr
一.常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.一个对象是不是常量表达式是由它的数据类型和初始值共同决定. ;//虽然初始值是字面值常量,但是它的数据类型只是普通int. con ...
- Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解
前言 java 8 中引入的两个与日期相关的新类:Period 和 Duration.两个类看表示时间量或两个日期之间的差,两者之间的差异为:Period基于日期值,而Duration基于时间值.他们 ...
- 解决vagrant上使用Homestead很慢(响应速度10s+)
说明: 使用vagrant和Homestead 在vBox上面跑laravel, 响应速度非常缓慢(大概在10+s), 尝试过增加虚拟机配置, 但是没有任何效果, 经验证也不是数据库的原因 . 通过网 ...
- css3技巧——产品列表之鼠标滑过效果translateY(三)
<div class="main"> <div class="view view-tenth"> <figure> < ...
- 费用流模板(带权二分图匹配)——hdu1533
/* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include<bits/stdc++.h> using namespace std; #define maxn 1000 ...
- duilib教程之duilib入门简明教程15.自绘控件
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如菜单控件 ...
- ZJOI 2006 物流运输 bzoj1003
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- 杂项-Maven-jna:JNA(Java Native Access)
ylbtech-杂项-Maven-jna:JNA(Java Native Access) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(nat ...
- windows 映射samba Linux服务器,输入正确的账号密码却提示“ 指定的网络密码不正确
重启Linux samba服务也没用,重启Linux和windows系统也没用,急!!! 最佳答案 linux中要添加对应的系统用户和samba用户useradd titiansmbpasswd -a ...
- Spring MVC(十四)--SpringMVC验证表单
在Spring MVC中提供了验证器可以进行服务端校验,所有的验证都必须先注册校验器,不过校验器也是Spring MVC自动加载的,在使用Spring MVC校验器之前首先要下载相关的jar包,下面是 ...