内容简介:对于 MapReduce 模式,必须首先确保 Hadoop 正在运行。要做到这一点,最简单的方法是在 Hadoop 文件系统树的根上执行文件列表操作,如清单 3. 测试 Hadoop 可用性启动
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用 ES2015 处理数组
- 使用Python进行异常处理
- 使用 canvas 对图像进行处理
- 使用 Canvas 对图像进行处理
- 使用 canvas 对图像进行处理
- 使用 Canvas 对图像进行处理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。