hadoop/pig导入日志的多级目录
Posted
技术标签:
【中文标题】hadoop/pig导入日志的多级目录【英文标题】:Importing multi-level directories of logs in hadoop/pig 【发布时间】:2011-03-11 20:01:55 【问题描述】:我们将日志存储在 S3 中,其中一个(猪)查询将获取三种不同的日志类型。每个日志类型都在基于类型/日期的子目录集中。例如:
/logs/<type>/<year>/<month>/<day>/<hour>/lots_of_logs_for_this_hour_and_type.log*
我的查询想要加载所有三种类型的日志,一段时间。例如:
type1 = load 's3:/logs/type1/2011/03/08' as ...
type2 = load 's3:/logs/type2/2011/03/08' as ...
type3 = load 's3:/logs/type3/2011/03/08' as ...
result = join type1 ..., type2, etc...
然后我的查询将针对所有这些日志运行。
处理这个问题的最有效方法是什么?
-
我们需要使用 bash 脚本扩展吗?不确定这是否适用于多目录,我怀疑如果有 10k 日志要加载,它是否有效(甚至可能)。
我们是否创建一个服务来聚合所有日志并将它们直接推送到 hdfs?
自定义 java/python 导入器?
其他想法?
如果您也可以留下一些示例代码(如果合适的话),那将很有帮助。
谢谢
【问题讨论】:
【参考方案1】:PigStorage 默认支持Globbing,所以你可以试试:
type1 = load 's3:/logs/type1,2,3/2011/03/08' as ..
甚至
type1 = load 's3:/logs/*/2011/03/08' as ..
【讨论】:
【参考方案2】:我有一个和你类似的日志系统,唯一的区别是我实际上不是按日期而是按类型分析日志,所以我会使用:
type1 = load 's3:/logs/type1/2011/03/' as ...
分析类型 1 的月份日志,不要将其与类型 2 混合。由于您不是按类型而是按日期进行分析,因此我建议您将结构更改为:
/logs/<year>/<month>/<day>/<hour>/<type>/lots_of_logs_for_this_hour_and_type.log*
这样您就可以加载每日(或每月)数据,然后按类型过滤它们,这样会更方便。
【讨论】:
谢谢,但我更关心的是如何跨多个子目录导入成百上千的日志。我想将它指向一个给定的目录(例如,2010/03/01)并让它抓取它下面的所有日志。如何解决这个问题更多的是我的问题。【参考方案3】:如果你像我一样使用 Hive 并且你的数据是分区的,你可以使用 PiggyBank 中的一些支持分区的加载器(例如AllLoader),只要你想要过滤的目录结构看起来像:
.../type=value1/...
.../type=value2/...
.../type=value3/...
您应该能够加载文件,然后 FILTER BY type = 'value1'。
例子:
REGISTER piggybank.jar;
I = LOAD '/hive/warehouse/mytable' using AllLoader() AS ( a:int, b:int );
F = FILTER I BY type = 1 OR type = 2;
【讨论】:
以上是关于hadoop/pig导入日志的多级目录的主要内容,如果未能解决你的问题,请参考以下文章
将 Hadoop Pig 输出作为 JSON 数据发布到 URL?
Hadoop Pig 从加载 glob 获取子目录名称并在存储中使用它