http://www.ibm.com/developerworks/cn/opensource/os-log-process-hadoop/
实践:使用 Apache Hadoop 处理日志
使用典型 Linux 系统上的 Hadoop 从日志中提取有用数据
日志是任何计算系统中一个必不可少的部分,支持从审计到错误管理等功能。随着日志的发展和日志来源数量的不断增加(比如在云环境中),有必要提供一个可扩展的系统来高效处理日志。这篇实践将探讨如何在典型 Linux 系统上使用 Apache Hadoop 来处理日志。
0 评论:
在 IBM Bluemix 云平台上开发并部署您的下一个应用。
日志形态千差万别,但随着应用程序和基础架构的发展,结果产生了大量对用户有用的分布式数据。从 Web 和邮件服务器到内核和引导日志,许多现代的服务器拥有丰富的信息集。大量的分布式数据是 Apache Hadoop 的完美应用,就像日志文件(按时间排序的结构化文本数据)一样。
您可以使用日志处理来提取各种信息。其中最常用的一种用法是提取错误,或是对某个系统中的一些事件(比如登录失败)的发生次数进行计数。您还可以提取某些类型的性能数据,比如每秒连接数或每秒处理的事务数。其他有用的信息包括 Web 日志中的站点访问量(减少)的提取(映射)和构造。这一分析除了支持检测文件访问统计之外,还支持对惟一用户访问的检测。
概述
关于本文
通过练习开始工作之前,您可能想阅读以下文章:
这些练习将为您提供以下几方面的实践:
- 建立一个简单的 Hadoop 环境并运行它
- 与 Hadoop 文件系统 (HDFS) 进行交互
- 编写一个简单的 MapReduce 应用程序
- 编写一个过滤的 Apache Pig 查询
- 编写一个累计的 Pig 查询
先决条件
要从这些练习中获得最大的益处,您应当掌握 Linux® 的基本应用知识。对虚拟设备有一些了解也有助于建立一个简单的环境。
练习 1. 建立一个简单的 Hadoop 环境并运行它
要建立 Hadoop 环境并运行它,有两种方法。第一种是安装 Hadoop 软件,然后针对您的环境(最简单的情况是一个单节点实例,其中所有的守护程序都在单个节点上运行)对其进行配置。参见 用 Hadoop 进行分布式数据处理,第 1 部分:入门 以了解有关的详细信息。
第二种(也是较为简单的一种)方法是通过使用 Cloudera 的 Hadoop Demo VM(包含一个 Linux 映像和一个预配置的 Hadoop 实例)。Cloudera 虚拟机 (VM) 运行于 VMware、基于 Kernel 的虚拟机或 Virtualbox 之上。
选择一种方法,并完成安装。然后,完成以下任务:
- 通过发出一个 HDFS
ls
命令来验证 Hadoop 是否正在运行。
练习 2. 与 HDFS 进行交互
HDFS 是一种专用的文件系统,用来管理一个 Hadoop 集群内的数据和副本,并将它们分配给各个计算节点,以便高效处理它们。尽管 HDFS 是一种专用的文件系统,但它仍然可以实现许多典型的文件系统命令。要检索 Hadoop 的帮助信息,可发出 hadoop dfs
命令。请执行以下任务:
- 在 HDFS 内创建一个测试子目录。
- 使用
copyFromLocal
将一个文件从本地文件系统移动到 HDFS 子目录中。 - 对于额外的练习,请使用
hadoop dfs
命令查看 HDFS 内的文件。
练习 3. 编写一个简单的 MapReduce 应用程序
按照 用 Hadoop 进行分布式数据处理,第 3 部分:应用程序开发 中的演示,编写一个单词数映射和缩减应用程序非常简单。使用本文中演示的 Ruby 示例,开发一个 Python 映射和缩减应用程序,并在样例数据集上运行它们。回想一下,Hadoop 对映射的输出进行了排序,所以词语很可能是连续的,这为缩减程序 (reducer) 提供了一种有用的优化。
练习 4. 编写一个简单的 Pig 查询
正如您在 使用 Apache Pig 处理数据 中所看到的,Pig 允许您构建一个简单的、可转换成 MapReduce 应用程序的脚本。在本练习中,您提取了所有的日志条目(来自 /var/log/messages),这些日志条目中包含单词 kernel: 和单词 terminating。
- 创建一个根据预定义的标准提取所有日志行的脚本。
练习 5. 编写一个聚合 Pig 查询
日志消息由 Linux 内核(比如 kernel
或 dhclient
)中的各种来源生成。在本例中,您需要找出生成日志消息的各种来源,以及每个来源生成的日志消息数量。
- 创建一个对每个日志来源生成的日志消息数进行计数的脚本。
练习解决方案
具体的输出取决于特定的 Hadoop 安装和配置。
练习 1 的解决方案:建立一个简单的 Hadoop 环境并运行它
在 练习 1 中,您在 HDFS 上执行了一个 ls
命令。清单 1 展示了恰当的解决方案。
清单 1. 在 HDFS 上执行一个 ls 操作
$ hadoop dfs -ls /
drwxrwxrwx - hue supergroup 0 2011-12-10 06:56 /tmp
drwxr-xr-x - hue supergroup 0 2011-12-08 05:20 /user
drwxr-xr-x - mapred supergroup 0 2011-12-08 10:06 /var
$
所显示文件的多少取决于具体的使用。
练习 2 的解决方案:与 HDFS 进行交互
在 练习 2 中,您在 HDFS 内创建了一个子目录,并将一个文件复制到这个子目录中。请注意,您是通过将内核消息缓冲器移动到某个文件中来创建测试数据的。对于额外的练习,请使用 cat
命令(参见 清单 2)查看 HDFS 内的文件。
清单 2. 操作 HDFS
$ dmesg > kerndata $ hadoop dfs -mkdir /test $ hadoop dfs -ls /test $ hadoop dfs -copyFromLocal kerndata /test/mydata $ hadoop dfs -cat /test/mydata Linux version 2.6.18-274-7.1.el5 (mockbuild@builder10.centos.org)... ... e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX $
练习 3 的解决方案:编写一个简单的 MapReduce 应用程序
在 练习 3 中,您用 Python 语言创建了一个简单的单词计数 MapReduce 应用程序。Python 实际上是实现单词计数示例的一种极好的语言。您可以在 Writing a Hadoop MapReduce Program in Python(由 Michael G. Noll 编著)中发现一个关于 Python MapReduce 的有用的整理文章。
本示例假设您执行了练习 2 的步骤(将数据摄入 HDFS)。清单 3 提供了映射应用程序。
清单 3. 用 Python 编写的映射应用程序
#!/usr/bin/env python import sys for line in sys.stdin: line = line.strip() words = line.split() for word in words: print '%s\t1' % word
清单 4 提供了缩减应用程序。
清单 4. 用 Python 编写的缩减应用程序
#!/usr/bin/env python from operator import itemgetter import sys last_word = None last_count = 0 cur_word = None for line in sys.stdin: line = line.strip() cur_word, count = line.split('\t', 1) count = int(count) if last_word == cur_word: last_count += count else: if last_word: print '%s\t%s' % (last_word, last_count) last_count = count last_word = cur_word if last_word == cur_word: print '%s\t%s' % (last_word, last_count)
清单 5 说明了在 Hadoop 中调用 Python MapReduce 示例的流程。
清单 5. 使用 Hadoop 测试 Python MapReduce
$ hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \ -file pymap.py -mapper pymap.py -file pyreduce.py -reducer pyreduce.py \ -input /test/mydata -output /test/output ... $ hadoop dfs -cat /test/output/part-00000 ... write 3 write-combining 2 wrong. 1 your 2 zone: 2 zonelists. 1 $
练习 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)
$
参考资料
学习
- 使用 Linux 和 Hadoop 进行分布式计算(作者:Ken Mann 和 M. Tim Jones,developerWorks,2008 年 12 月):发现 Apache 的 Hadoop,一个基于 Linux 的软件框架,支持大量数据的分布式操作,包括 Internet Web 页面的平行索引。
- 用 Hadoop 进行分布式数据处理,第 1 部分:入门(作者:M. Tim Jones,developerWorks,2010 年 5 月):探讨 Hadoop 框架,包括其基本元素,比如 Hadoop 文件系统 (HDFS),通用节点类型,以及使用其核心 Web 界面监视和管理 Hadoopde 的方式。了解如何安装和配置一个单节点的 Hadoop 集群,深入探究 MapReduce 应用程序。
- 用 Hadoop 进行分布式数据处理,第 2 部分:进阶(作者:M. Tim Jones,developerWorks,2010 年 6 月):使用 Hadoop 在一个多节点集群中配置一个更高级的设置,以便并行处理它们。您将在并行环境中使用 MapReduce 功能,并探讨 Hadoop 的命令行和基于 Web 的管理方面。
- 用 Hadoop 进行分布式数据处理,第 3 部分:应用程序开发(作者:M. Tim Jones,developerWorks,2010 年 7 月):探讨 Hadoop API 和数据流,了解如何通过一个简单的 Mapper 和 Reducer 应用程序使用它们。
- 使用 Apache Pig 处理数据(作者:M. Tim Jones,developerWorks,2012 年 2 月):Pig 因其可以寻找和发现可以使用的任何事情而广为人知。Apache Pig 和大数据具有同样的功效。了解有关该工具以及如何在应用程序中应用该工具的更多信息。
- Writing a Hadoop MapReduce Program in Python(作者:Michael G. Noll,更新日期:2011 年 10 月,发布日期:2007 年 9 月):了解本教程中如何以 Python 编程语言为 Hadoop 编写一个简单的 MapReduce 程序。
- developerWorks 中国网站开源技术专区 提供了有关开源工具和使用开源技术的丰富信息。
- developerWorks 中国网站 Web 开发专区 专门研究各种基于 Web 的解决方案的文章。
- 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
- 随时关注 developerWorks 技术活动和网络广播。
- 访问 developerWorks Open source 专区获得丰富的 how-to 信息、工具和项目更新以及最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。
获得产品和技术
- Cloudera's Hadoop Demo VM(2012 年 5 月):开始使用 Apache Hadoop 和一组虚拟机(包括一个 Linux 图像和一个预配置的 Hadoop 实例)。
- 以最适合您的方式 IBM 产品评估试用版软件:下载产品试用版,在线试用产品,在云环境中使用产品,或者在 IBM SOA 人员沙箱 中花费几小时了解如何高效实现面向服务架构。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
- 加入 IBM 软件下载与技术交流群组,参与在线交流。