练习 4 的解决方案:编写一个简单的 Pig 查询
在 练习 4 中,您提取了 /var/log/messages 日志条目,该条目同时包含了单词 kernel: 和单词 terminating。在这种情况下,您可以在本地模式下使用 Pig 查询本地文件(参见 清单 6)。将文件加载到一个 Pig 关系(日志)中,过滤其内容,直到只剩下内核消息,然后过滤结果关系,以便获得终止消息。
清单 6. 提取所有的内核日志消息 + 终止日志消息
$ pig -x local
grunt> log = LOAD '/var/log/messages';
grunt> logkern = FILTER log BY $0 MATCHES '.*kernel:.*';
grunt> logkernterm = FILTER logkern BY $0 MATCHES '.*terminating.*';
grunt> dump logkernterm
...
(Dec 8 11:08:48 localhost kernel: Kernel log daemon terminating.)
grunt>
练习 5 的解决方案:编写一个聚合 Pig 查询
在 练习 5 中,提取日志来源和根据 /var/log/messages 获得的日志消息计数。在这种情况下,需要为查询创建一个脚本,并在 Pig 的本地模式下执行它。在 清单 7 中,您加载了文件,并使用空格作为分隔符对输入进行解析。随后将已划分界限的字符串字段分配给指定的元素。使用 GROUP 运算符根据消息来源对消息进行分组,然后使用 FOREACH 运算符和 COUNT 来聚合您的数据。
清单 7. /var/log/messages 的日志来源和计数脚本
log = LOAD '/var/log/messages' USING PigStorage(' ') AS (month:chararray, \
day:int, time:chararray, host:chararray, source:chararray);
sources = GROUP log BY source;
counts = FOREACH sources GENERATE group, COUNT(log);
dump counts;
执行结果如 清单 8 所示。
清单 8. 执行您的日志来源脚本
$ pig -x local logsources.pig
...
(init:,1)
(gconfd,12)
(kernel:,505)
(syslogd,2)
(dhclient:,91)
(localhost,1168)
(gpm[2139]:,2)
[gpm[2168]:,2)
(NetworkManager:,292)
(avahi-daemon[3345]:,37)
(avahi-daemon[3362]:,44)
(nm-system-settings:,8)
$