hadoop - 使用 Hadoop MapReduce 按月份和 IP 对日志条目进行分组

标签 hadoop mapreduce

我是 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 是一个分布式文件系统,因此您的日志将在整个集群中分成 block 并进行复制。

    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

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

我希望这是有道理的,如果您想了解有关 Hive 的更多详细信息,我想将您重定向到 the Hive DDL description以及the official project page .

关于hadoop - 使用 Hadoop MapReduce 按月份和 IP 对日志条目进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329900/

相关文章:

java - HDFS 写入导致 "CreateSymbolicLink error (1314): A required privilege is not held by the client."

hadoop - 错误:java.lang.NoClassDefFoundError:org/apache/hadoop/util/StopWatch

hadoop - 在 hadoop 多节点集群设置中创建从作业日志到 ${hadoop.tmp.dir} 的符号链接(symbolic link)失败

hadoop - 执行Sqoop导出时转义字符

hadoop - 如何从 pig map 中获取变量键的值?

hadoop - 从hadoop文件中剪切字段的最佳方法

java - 将值从 Mapper 传递到 Reducer

java - 执行 BufferedReader.close() 时 Hadoop FileSystem 关闭异常

hadoop - 如何在 VM 上永久存储 hbase 表

hadoop - 我可以为每个节点定义不同的 map 和 reduce 插槽吗?