编写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
即可完成。