Flume: HDFSEventSink - 如何动态多路复用?
Flume: HDFSEventSink - how to multiplex dynamically?
总结:我有一个复用场景,想知道如何动态复用——不是基于静态配置的值,而是基于字段的变量值(例如日期)。
详情:
我有一个输入,由 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
# ...
这会为每个实体生成一个文件,这很好。
现在我想引入第二个变量,它是动态的:一个日期。根据事件日期,我想每个实体每个日期创建文件。
日期是一个动态值,所以我无法预先配置多个接收器,因此每个接收器都发送到一个单独的文件。另外,每个 Sink 只能指定一个 HDFS 输出。
所以,这就像需要 "Multiple Outputs HDFSEventSink"(与 Hadoop 的 MultipleOutputs 库类似)。 Flume中有这样的功能吗?
如果不是,是否有任何优雅的方法来解决这个问题或解决这个问题?另一种选择是修改 HDFSEventSink 并且它似乎可以通过为每个事件创建不同的 "realName" (String) 来实现。
实际上你可以在你的 hdfs sink 的路径或 filePrefix 中指定变量。
比如变量的key在事件的headers中是"date",那么可以这样配置:
agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11-%{date}
总结:我有一个复用场景,想知道如何动态复用——不是基于静态配置的值,而是基于字段的变量值(例如日期)。
详情: 我有一个输入,由 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
# ...
这会为每个实体生成一个文件,这很好。 现在我想引入第二个变量,它是动态的:一个日期。根据事件日期,我想每个实体每个日期创建文件。 日期是一个动态值,所以我无法预先配置多个接收器,因此每个接收器都发送到一个单独的文件。另外,每个 Sink 只能指定一个 HDFS 输出。
所以,这就像需要 "Multiple Outputs HDFSEventSink"(与 Hadoop 的 MultipleOutputs 库类似)。 Flume中有这样的功能吗?
如果不是,是否有任何优雅的方法来解决这个问题或解决这个问题?另一种选择是修改 HDFSEventSink 并且它似乎可以通过为每个事件创建不同的 "realName" (String) 来实现。
实际上你可以在你的 hdfs sink 的路径或 filePrefix 中指定变量。 比如变量的key在事件的headers中是"date",那么可以这样配置:
agent.sinks.hdfsSink-11.hdfs.filePrefix = entity11-%{date}