Mapreduce 模式中的 Pig
对于 MapReduce 模式,必须首先确保 Hadoop 正在运行。要做到这一点,最简单的方法是在 Hadoop 文件系统树的根上执行文件列表操作,如 清单 3 所示。
清单 3. 测试 Hadoop 可用性
$ hadoop dfs -ls / Found 3 items drwxrwxrwx - hue supergroup 0 2011-12-08 05:20 /tmp drwxr-xr-x - hue supergroup 0 2011-12-08 05:20 /user drwxr-xr-x - mapred supergroup 0 2011-12-08 05:20 /var $
启动 Pig 开始,然后将目录更改为您的 HDFS 根,以确定在 HDFS 中是否可以看到外部所看到的结果(参见 清单 4)。
清单 4. 测试 Pig
$ pig 2011-12-10 06:39:44,276 [main] INFO org.apache.pig.Main - Logging error messages to... 2011-12-10 06:39:44,601 [main] INFO org.apache.pig.... Connecting to hadoop file system at: hdfs://0.0.0.0:8020 2011-12-10 06:39:44,988 [main] INFO org.apache.pig.... connecting to map-reduce job tracker at: 0.0.0.0:8021 grunt> cd hdfs:/// grunt> ls hdfs://hadoop:9000/hbase <dir>hdfs://hadoop:9000/input <dir>hdfs://hadoop:9000/output <dir>hdfs://hadoop:9000/tmp <dir>hdfs://hadoop:9000/user <dir>hdfs://hadoop:9000/usr <dir> grunt>
到目前为止,一切都很好。您可以在 Pig 中看到您的 Hadoop 文件系统,所以,现在请尝试从您的本地主机文件系统将一些数据读取到 HDFS 中。可以通过 Pig 将某个文件从本地复制到 HDFS(参见 清单 5)。
清单 5. 获得一些测试数据
grunt> copyFromLocal /etc/passwd /input
要开始执行该操作,需要从 HDFS 将您的 passwd 文件载入一个 Pig 关系中。在使用 LOAD
运算符之前就要完成该操作,但在这种情况下,您可能希望将密码文件的字段解析为多个独立的字段。在本例中,我们指定了 PigStorage
函数,您可以使用它来显示文件的分隔符(本例中,是冒号 [:
] 字符)。您也可以用 AS
关键字指定独立字段(或架构),包括它们的独立类型(参见 清单 6)。
清单 6. 将文件读入一个关系中
grunt> passwd = LOAD ‘/input/passwd‘ USING PigStorage(‘:‘) AS (user:chararray, \ 注意这里写一句话,我使用\不行 passwd:chararray, uid:int, gid:int, userinfo:chararray, home:chararray, \使用这句:passwd = load ‘/input/passwd‘ using PigStorage(‘:‘)as (user:chararray,passwd:chararray,uid:int,gid:int,userinfo:chararray,home:chararray,shell:chararray); shell:chararray); grunt> DUMP passwd; (root,x,0,0,root,/root,/bin/bash) (bin,x,1,1,bin,/bin,/sbin/nologin) ... (cloudera,x,500,500,,/home/cloudera,/bin/bash) grunt>
接下来,使用 GROUP
运算符根据元组的bash将元组分组到该关系中(参见 清单 7)。
清单 7. 将元组分组为其外壳的一个函数
grunt> grp_shell = GROUP passwd BY shell; grunt> DUMP grp_shell; (/bin/bash,{(cloudera,x,500,500,,/home/cloudera,/bin/bash),(root,x,0,0,...), ...}) (/bin/sync,{(sync,x,5,0,sync,/sbin,/bin/sync)}) (/sbin/shutdown,{(shutdown,x,6,0,shutdown,/sbin,/sbin/shutdown)}) grunt>
但是,您想要的是在 passwd 文件中指定的独特bash的计数。所以,需要使用 FOREACH
运算符来遍历分组中的每个元组,COUNT
出现的数量(参见 清单 8)。
清单 8. 利用每个外壳的计数对结果进行分组
grunt> counts = FOREACH grp_shell GENERATE group, COUNT(passwd); 注意在这里COUNT必须大写,小写报错 grunt> DUMP counts; ... (/bin/bash,5) (/bin/sync,1) (/bin/false,1) (/bin/halt,1) (/bin/nologin,27) (/bin/shutdown,1) grunt>
备注:如果要将该代码作为一个脚本来执行,只需将脚本输入到某个文件中,然后使用 pig myscript.pig
来执行它。
诊断运算符
Pig 支持大量诊断运算符,您可以用它们来调试 Pig 脚本。正如您在之前的脚本示例中所看到的,DUMP
运算符是无价的,它不仅可以查看数据,还可以查看数据架构。您还可以使用 DESCRIBE
运算符来生成一个关系架构的详细格式(字段和类型)。
EXPLAIN
运算符更复杂一些,但也很有用。对于某个给定的关系,您可以使用 EXPLAIN
来查看如何将物理运算符分组为 Map 和 Reduce 任务(也就是说,如何推导出数据)。
表 2 对 Pig Latin 中的诊断运算符及其描述提供了一个列表。
表 2. Pig Latin 诊断运算符
运算符 | 描述 |
---|---|
DESCRIBE |
返回关系的架构。 |
DUMP |
将关系的内容转储到屏幕。 |
EXPLAIN |
显示 MapReduce 执行计划。 |
用户定义的函数
虽然 Pig 在本文探讨的范围内是强大且有用的,但是通过用户定义的函数 (UDF) 可以使它变得更强大。Pig 脚本可以使用您为解析输入数据、格式化输出数据甚至运算符等定义的函数。UDF 是用 Java 语言编写的,允许 Pig 支持自定义处理。UDF 是将 Pig 扩展到您的特定应用程序领域的一种方式。您可以在 参考资料 中了解有关 UDF 开发的更多信息。
Pig 用户
正如您从这篇短文中可以看到的,Pig 是一个强大的工具,可以在 Hadoop 集群中查询数据。它是如此强大,Yahoo! 估计,其 Hadoop 工作负载中有 40% 至 60% 由 Pig Latin 脚本产生。在 Yahoo! 的 100,000 个 CPU 中,大约有 50% 的 CPU 仍在运行 Hadoop。
但 Yahoo! 并不是利用 Pig 的惟一组织。您在 Twitter 中也会发现 Pig(用于处理日志和挖掘微博数据);在 AOL 和 MapQuest 上也会发现它(用于分析和批量数据处理);而在 LinkedIn 上,Pig 用于发现您可能认识的人。据报道,Ebay 使用 Pig 来实现搜索优化,而 adyard 的推荐工具系统有大约一半都使用了 Pig。
展望未来
没有一本书可以完全列举 Pig 背后处理大数据的强大功能。即使对于非开发人员而言,Pig 也可以使得执行 Hadoop 集群上的大数据处理变得很容易。Pig 最初是由 Yahoo! 于 2006 年开发,并且此后不久被迁移到 Apache Software Foundation,使得它在全球范围得到广泛应用。进行这种迁移是因为 Yahoo! 研究人员意识到 Pig 能为非开发人员提供强大的功能。Hadoop 作为一个基础架构已经逐渐开始普及,Hadoop 生态系统将会改变大数据的外观及其日益增长的使用情况。
参考: http://www.ibm.com/developerworks/cn/linux/l-apachepigdataquery/index.html
使用 Apache Pig 处理数据7,布布扣,bubuko.com