在hadoop / pig中导入日志的多级目录

时间:2011-03-11 20:01:56

标签: hadoop hdfs apache-pig

我们将日志存储在S3中,我们的一个(Pig)查询将获取三种不同的日志类型。每种日志类型都基于类型/日期的子目录集。例如:

/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...

然后我的查询将针对所有这些日志运行。

处理此问题的最有效方法是什么?

  1. 我们需要使用bash脚本扩展吗?不确定这是否适用于多目录,我怀疑如果要加载10k日志它会有效(甚至可能)。
  2. 我们是否创建了一个服务来聚合所有日志并直接将它们推送到hdfs?
  3. 自定义java / python导入程序?
  4. 其他想法?
  5. 如果您可以保留一些示例代码(如果适用),那将会有所帮助。

    由于

3 个答案:

答案 0 :(得分:5)

PigStorage默认支持

Globbing,所以你可以尝试:

type1 = load 's3:/logs/type{1,2,3}/2011/03/08' as ..

甚至

type1 = load 's3:/logs/*/2011/03/08' as ..

答案 1 :(得分:0)

我有一个类似于你的类似日志系统唯一的区别是我实际上不按日期分析日志,而是按类型分析,所以我会使用:

type1 = load 's3:/logs/type1/2011/03/' as ...

分析type1的月份日志,不要与type2混用。由于您不是按类型分析,而是按日期分析,我建议您将结构更改为:

/logs/<year>/<month>/<day>/<hour>/<type>/lots_of_logs_for_this_hour_and_type.log*

因此您可以加载每日(或每月)数据,然后按类型过滤它们,会更方便。

答案 2 :(得分:0)

如果像我这样你使用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;