我是Apache Hadoop的新手。但我想学习如何使用它来总结我的机器日志。实际上它不够大(GB)我可以解析它并等待,比如几个小时。但我认为学习Hadoop可能会有用。
所以,我有一个日志条目,格式如下。
Location, Date, IP Address
e.g。
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)
我的问题是:
感谢您提供指向链接或文章或示例代码的指针。
答案 0 :(得分: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,所以这里有一些提示。
将这些日志上传到HDFS。无论您希望如何处理,这都是首要任务,HDFS是一个分布式文件系统,因此您的日志将在整个群集中按块分割并复制。
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。