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