2

我对 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 执行此操作的常用方法是什么?

感谢您提供指向链接或文章或示例代码的指针。

4

1 回答 1

1
can I do this using Hadoop or is there a better way to do it?

您绝对可以为此使用 Hadoop,如果您只有几个 Gbs,则可能没有必要,但是使用 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. 在 Hive 中创建一个表。您必须将其设置在您将日志放入 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 所说UDF的 s。

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

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

于 2013-01-15T02:27:28.877 回答