我是 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 是一个分布式文件系统,因此您的日志将在整个集群中分成 block 并进行复制。
hadoop fs -put /path/to/your/log/directory /user/hive/warehouse/logs
在 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"
现在您可以对您的数据进行一些查询了!在您的示例中,您应该执行以下操作:
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/