1

摘要:我有一个多路复用场景,并且想知道如何动态多路复用 - 不是基于静态配置的值,而是基于字段的变量值(例如日期)。

详细信息:我有一个输入,由 entityId 分隔。由于我知道我正在使用的实体,我可以在典型的 Flume 多通道选择中对其进行配置。

agent.sources.jmsSource.channels  = chan-10 chan-11 # ...

agent.sources.jmsSource.selector.type = multiplexing
agent.sources.jmsSource.selector.header = EntityId
agent.sources.jmsSource.selector.mapping.10 = chan-10
agent.sources.jmsSource.selector.mapping.11 = chan-11
# ...

每个通道都转到一个单独的 HDFSEventSink,“hdfsSink-n”:

agent.sinks.hdfsSink-10.channel = chan-10
agent.sinks.hdfsSink-10.hdfs.path = hdfs://some/path/
agent.sinks.hdfsSink-10.hdfs.filePrefix = entity10
# ... 
agent.sinks.hdfsSink-11.channel = chan-11
agent.sinks.hdfsSink-11.hdfs.path = hdfs://some/path/
agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11
# ... 

这会为每个实体生成一个文件,这很好。现在我要介绍第二个变量,它是动态的:日期。根据事件日期,我想创建文件 per-entity per-date。日期是一个动态值,因此我无法预先配置多个接收器,因此每个接收器都发送到一个单独的文件。此外,您只能为每个 Sink 指定一个 HDFS 输出。

所以,这就像是需要一个“Multiple Outputs HDFSEventSink”(与 Hadoop 的 MultipleOutputs 库类似)。Flume中有这样的功能吗?

如果没有,是否有任何优雅的方法来解决这个问题或解决这个问题?另一种选择是修改 HDFSEventSink ,它似乎可以通过为每个事件创建不同的“realName”(字符串)来实现。

4

1 回答 1

1

实际上,您可以在 hdfs sink 的路径或 filePrefix 中指定变量。例如,如果变量的键是事件标题中的“日期”,那么您可以像这样配置:

agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11-%{date}
于 2016-08-06T09:41:31.027 回答