Flume - 是否可以将整个文件视为 Flume 中的一个事件?

Flume - Can an entire file be considered an event in Flume?

我有一个用例,我需要将目录中的文件提取到 HDFS 中。作为 POC,我在 Flume 中使用了简单的目录假脱机,我在其中指定了源、接收器和通道,它工作正常。缺点是我必须为进入不同文件夹的多种文件类型维护多个目录,以便更好地控制文件大小和其他参数,同时使配置重复,但很容易。

作为替代方案,有人建议我使用正则表达式拦截器,其中多个文件将驻留在一个目录中,并根据文件中的字符串路由到 HDFS 中的特定目录。我期望的文件类型是 CSV 文件,其中第一行是 header,后续行是逗号分隔值。

考虑到这一点,我有几个问题。

  1. 拦截器如何处理文件?
  2. 鉴于 CSV 中的 header 行类似于 ID, Name 后跟 ID 和名称,而同一目录中的另一个文件将有 Name, Address 后跟在下一行的名称和地址中,拦截器和通道配置如何将其路由到不同的 HDFS 目录?
  3. 拦截器如何处理明显与正则表达式不匹配的后续行?
  4. 整个文件是否构成一个事件,或者一个文件实际上可以是多个事件吗?

请告诉我。谢谢!

首先,flume 不适用于文件本身,但适用于称为事件的东西。事件是 Avro 结构,可以包含任何内容,通常是一行,但在您的情况下,它可能是整个文件。

拦截器使您能够从事件中提取信息并将其添加到该事件的 header 中。后者可用于配置traget目录结构。

在您的特定情况下,您可能希望编写一个解析器来分析您的事件内容并设置一个 header 值,例如子路径:

if (line.contains("Address")) {
    event.getHeaders().put("subpath", "address");
else if (line.contains("ID")) {
    event.getHeaders().put("subpath", "id");
}

然后您可以在 hdfs-sink 配置中引用它,如下所示:

hdfs-a1.sinks.hdfs-sink.hdfs.path = hdfs://cluster/path/%{subpath}

关于你的问题多个文件是否可以构成一个事件:是的,这是可能的,但不是假脱机源。您必须实现一个与配置的 Avro 源通信的客户端 class。您必须将文件通过管道传输到事件中并将其发送出去。然后,您还可以在那里设置 headers 而不是使用拦截器。