编写hadoop应用程序的map与reduce并不难,但是要完整控制整个框架的编写,需要对Java语言非常非常熟悉。而我一直做Linux下C编程的人,只能寻找更加适合我的方式。Apache项目下给出了一个可以较简单地操作hadoop的MapReduce的工具,这就是pig。它在 MapReduce的基础上创建了更简单的过程语言抽象,为 Hadoop应用程序提供了一种更加接近结构化查询语言 (SQL)的接口。不需要编写一个单独的 MapReduce应用程序,可以用 Pig Latin语言写一个脚本,在集群中自动并行处理与分发该脚本。

Pig使用的两种模式:

第一种是 Local(本地)模式,它不需要依赖 Hadoop或 Hadoop分布式文件系统 (HDFS),在该模式中,所有操作都在本地文件系统上下文中的单一 Java虚拟机 (JVM)上执行。另一种模式是 MapReduce模式,它使用了 Hadoop文件系统和集群。我主要是利用hadoop集群对数据进行分析,所以只关注MapReduce模式。

另外,pig与hive的安装及其注意的问题,前面的博客中已经提及。

在master节点上安装pig之后,终端键入:

pig

或者

pig -x mapreduce

如果想以local模式启动,输入:


pig -x local

接下来测试数据,统计Linux系统下passwd的信息,先复制文件到hdfs

grunt> cd hdfs:///
grunt> cd /test
grunt> copyFromLocal /etc/passwd  passwd

然后执行Pig语句:

grunt> passwd = LOAD '/test/passwd' USING PigStorage(':') AS (user:chararray,passwd:chararray, uid:int, gid:int, userinfo:chararray, home:chararray,shell:chararray);
grunt> DUMP passwd

出现了下面的问题:

[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias passwd. Backend error : javadoop/192.168.0.2 to master.hadoop:10020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more deta
Details at logfile: /usr/local/pig/pig_1433189043690.log

查看错误信息可知,10020号端口可能没开,利用下面命令进行查看:

lsof | grep 10020

果然没开,然后查看这篇博客

hadoop常用端口及定义方法,发现这个10020号端口是

mapreduce.jobhistory.address。查看hadoop配置文件mapred-site.xml中已经有了这个定义:

<property>  
          <name>mapreduce.jobhistory.address</name>  
          <value>master.hadoop:10020</value>  
     </property>

那么服务还没有起来,只可能是在启动hadoop集群时候start-all.sh里面没有包含这一项?那么进行手动启动。

mr-jobhistory-daemon.sh start historyserver

启动pig再次执行上面的过程,即可成功执行。为了方便执行可以将pig命令放入一个脚本,命名为passwd.pig:

passwd = LOAD '/test/passwd' USING PigStorage(':') AS (user:chararray,passwd:chararray, uid:int, gid:int, userinfo:chararray, home:chararray,shell:chararray);
grp_shell = GROUP passwd BY shell;
counts = FOREACH grp_shell GENERATE group, COUNT(passwd);
DUMP counts;

然后在终端中键入:


pig passwd.pig

即可完成。