我真的是Apache Hadoop的新手。但我想学习如何使用它来总结我的机器日志。事实上,它不够大(GB(,我可以解析它,然后等待几个小时。但我认为学习Hadoop可能很有用。
所以,我有一个日志条目,格式如下。
Location, Date, IP Address
例如
New York, 2011-11-31 10:50:59, 1.1.1.1
New York, 2011-11-31 10:51:01, 1.1.1.2
Chicago, 2011-11-31 10:52:02, 1.1.1.1
Los Angeles, 2011-11-31 10:53:04, 1.1.1.4
我想按位置聚合,按月份分组,然后按IP地址聚合。下面是我心目中的样子。
Location, Month, IP, Count
+ New York
| +-- November 2011
| | +---- 1.1.1.1 5
| | +---- 1.1.1.2 2
| | +---- 1.1.1.3 7
| +-- December 2011
| | +---- 1.1.1.1 6
| | +---- 1.1.1.4 6
| +-- January 2012
| +---- 1.1.1.1 10
+ Chicago
| +-- November 2011
| | +---- 1.1.1.1 20
| | +---- 1.1.1.2 1
| | +---- 1.1.1.3 10
(so on)
我的问题是:
- 我可以使用Hadoop来做到这一点吗?或者有更好的方法吗
- 使用Hadoop实现这一点的常用方法是什么
感谢您提供指向链接、文章或示例代码的指针。
can I do this using Hadoop or is there a better way to do it?
你肯定可以使用Hadoop,如果你只有几GB,这可能没有那么必要,但使用Hadoop这样做的好处是,你将能够轻松地扩展,假设明天你必须在500Gb上做同样的事情,你的代码可能没有什么可更改的,只有硬件和配置。
what is the common way to do this using Hadoop?
我不认为有一种"通用的方式"可以这么说,Hadoop是一个封装多个项目的框架,你可以在Map/Reduce、Hive、Pig。。。
我认为您的用例非常适合使用Hive来完成这项工作,因为您希望进行聚合,并拥有一个可以轻松地将其放入表中的结构,如果您是Hadoop的新手,您可以熟悉SQL,因此这里有一些提示。
将这些日志上载到HDFS中。这是所需的第一步,无论您想如何进行处理,HDFS是一个分布式文件系统,因此您的日志将在集群中分块进行复制。
hadoop fs -put /path/to/your/log/directory /user/hive/warehouse/logs
在配置单元中创建一个表。您必须将其设置在HDFS中放置日志的外部位置(并指定文件中的分隔符(:
hive -e "create external table logs(location string, day string, ip string) row format delimited fields terminated by ',' location /user/hive/warehouse/logs"
现在你可以对你的数据进行一些查询了!在您的示例中,您应该执行以下操作:
hive -e "select location, month(day), ip, count(*) from logs group by location, month(day), ip order by location, month, ip"
请注意,我在当天调用
MONTH()
,以增加聚合当天的月份部分,这就是Hive所称的UDF
s.
即使您正在编写SQL查询,这也会在后台生成将在集群上运行的Map/Reduce作业,因此您的作业将根据集群的大小进行扩展。
我希望这是有意义的,如果你想了解更多关于Hive的详细信息,我想将你重定向到Hive DDL描述以及官方项目页面。