首页 > 解决方案 > 水槽配置 - spoolDir 和文件滚动接收器的变量

问题描述

我已经搜索过,有很多关于如何使用'fileHeader'and 'basenameHeader'for的帖子spoolDirectory,尽管它似乎不适用于我的情况。

我的目标是使用 Flume 将本地目录中的文件提取到使用file_rollsink 的 blob 目录中,并保留文件名或至少将文件放在与文件名同名的目录中。例如,

/input/january.txt -> /blob_output/january.[timestamp] 或 /input/january.txt -> /blob_output/january/[timestamp].txt

问题是我似乎无法调用文件名或基本名的变量,因为它总是不返回任何内容(或 null),导致输出名称中只有一个时间戳。这是我的水槽配置:

training_agent.sources = src1
training_agent.channels = ch1
training_agent.sinks = sink1

training_agent.sources = src1
training_agent.channels = ch1
training_agent.sinks = sink1

training_agent.sources.src1.type = spooldir
training_agent.sources.src1.channels = ch1
training_agent.sources.src1.spoolDir = /home/training/input/
training_agent.sources.src1.batchSize = 5
training_agent.sources.src1.fileHeader = true

training_agent.channels.ch1.type = memory
training_agent.channels.capacity = 500
training_agent.channels.ch1.transactionCapacity = 50

training_agent.sinks.sink1.type = file_roll
training_agent.sinks.sink1.sink.rollInterval = 0
training_agent.sinks.sink1.channel = ch1
training_agent.sinks.sink1.sink.directory = /blobtraining_path/destination
training_agent.sinks.sink1.sink.pathManager.prefix = ${file}

标签: flumeflume-ng

解决方案


在 Rolling File Sink 的文档中,没有指定输出文件的文件名的选项。

我检查了源代码以找到解决此问题的方法,但没有简单的方法可以解决。Flume 仅使用当前时间戳来生成文件名。您只能为输出文件指定前缀和扩展名。

但是,您可以扩展DefaultPathManager并添加执行此操作的功能,或者您可以创建一个新的自定义接收器(您自己的滚动文件接收器),它能够从水槽事件头中获取文件名头并使用此信息创建输出文件输入文件的相同值。

要创建自定义接收器,您可以查看Flume 开发人员指南的接收器部分。

额外的信息:

training_agent.sinks.sink1.sink.pathManager.prefix = ${file}

您不能直接在水槽配置文件中使用环境变量。如果要在水槽配置中使用环境变量,则必须将其添加到执行命令中。

-DpropertiesImplementation=org.apache.flume.node.EnvVarResolverProperties

推荐阅读