HDFS接收器:“聪明”文件夹路由

时间:2014-10-15 14:26:42

标签: hdfs flume

我是Flume(和HDFS)的新手,所以我希望我的问题不是愚蠢的。

我有一个多租户应用程序(约有100个不同的客户) 现在)。 我有16种不同的数据类型。

(在制作中,我们每天有大约1500万条消息 的RabbitMQ)

我想写一些HDFS我的所有事件,由租户分隔,数据类型, 和日期,像这样:

/data/{tenant}/{data_type}/2014/10/15/file-08.csv

是否可以使用一个接收器定义?我不想复制 配置,新客户每周都会到达

在文档中,我看到了

agent1.sinks.hdfs-sink1.hdfs.path = hdfs://server/events/%Y/%m/%d/%H/

这可能吗?

agent1.sinks.hdfs-sink1.hdfs.path = hdfs://server/events/%tenant/%type/%Y/%m/%d/%H/

我想根据传入的数据写入不同的文件夹。

2 个答案:

答案 0 :(得分:1)

可能的解决办法可能是编写一个传递租户价值的拦截器。

请参阅以下链接

http://hadoopi.wordpress.com/2014/06/11/flume-getting-started-with-interceptors/

答案 1 :(得分:1)

是的,这确实是可能的。您可以使用元数据或传入数据中的某些字段将输出重定向到。

例如,在我的情况下,我得到不同类型的日志数据,我想相应地将它存储在相应的文件夹中。在我的例子中,我的日志行中的第一个单词是文件名。这是相同的配置代码段。

拦截器:

dataplatform.sources.source1.interceptors = i3
dataplatform.sources.source1.interceptors.i3.type = regex_extractor
dataplatform.sources.source1.interceptors.i3.regex = ^(\\w*)\t.*
dataplatform.sources.source1.interceptors.i3.serializers = s1
dataplatform.sources.source1.interceptors.i3.serializers.s1.name = filename

HDFS接收器

dataplatform.sinks.sink1.type = hdfs
dataplatform.sinks.sink1.hdfs.path = hdfs://server/events/provider=%{filename}/years=%Y/months=%Y%m/days=%Y%m%d/hours=%H

希望这有帮助。