3

我们将日志存储在 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. 其他想法?

如果您也可以留下一些示例代码(如果合适的话),那将很有帮助。

谢谢

4

3 回答 3

5

PigStorage默认支持通配符,因此您可以尝试:

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

甚至

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

于 2011-03-14T18:18:11.627 回答
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*

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

于 2011-03-13T13:06:57.790 回答
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;
于 2012-08-02T10:30:47.273 回答