摘要:我有一个多路复用场景,想知道如何动态多路复用-不是基于静态配置的值,而是基于字段的可变值(例如日期)。
详细信息:
我有一个输入,由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
# ...
这样会为每个实体生成一个文件,这很好。
现在我想给引入第二个变量,它是动态的:一个日期。根据事件的日期,我想每个实体每个日期创建文件。
日期是一个动态值,因此我无法预先配置多个接收器,因此每个接收器都发送到一个单独的文件。此外,每个接收器只能指定一个HDFS输出。
因此,这就像需要一个“Multiple Outputs HDFSEventSink”(以类似于Hadoop的MultipleOutputs库的方式)。 Flume中有这样的功能吗?
如果没有,是否有任何优雅的方法可以解决此问题或解决此问题?另一个选择是修改HDFSEventSink,似乎可以通过为每个事件创建不同的“realName”(字符串)来实现。
最佳答案
实际上,您可以在hdfs接收器的路径或filePrefix中指定变量。
例如,如果变量的键在事件的标题中是“date”,则可以这样配置:
agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11-%{date}