使用Hadoop MapReduce按月份和IP分组日志条目



我真的是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)

我的问题是:

  1. 我可以使用Hadoop来做到这一点吗?或者有更好的方法吗
  2. 使用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,因此这里有一些提示。

  1. 将这些日志上载到HDFS中。这是所需的第一步,无论您想如何进行处理,HDFS是一个分布式文件系统,因此您的日志将在集群中分块进行复制。

    hadoop fs -put /path/to/your/log/directory /user/hive/warehouse/logs
    
  2. 在配置单元中创建一个表。您必须将其设置在HDFS中放置日志的外部位置(并指定文件中的分隔符(:

    hive -e "create external table logs(location string, day string, ip string) row format delimited fields terminated by ',' location /user/hive/warehouse/logs"
    
  3. 现在你可以对你的数据进行一些查询了!在您的示例中,您应该执行以下操作:

    hive -e "select location, month(day), ip, count(*) from logs group by location, month(day), ip order by location, month, ip"
    

    请注意,我在当天调用MONTH(),以增加聚合当天的月份部分,这就是Hive所称的UDFs.

即使您正在编写SQL查询,这也会在后台生成将在集群上运行的Map/Reduce作业,因此您的作业将根据集群的大小进行扩展。

我希望这是有意义的,如果你想了解更多关于Hive的详细信息,我想将你重定向到Hive DDL描述以及官方项目页面。

相关内容

  • 没有找到相关文章

最新更新