3

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

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

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

  1. 拦截器如何处理文件?
  2. 鉴于 CSV 中的标题行ID, Name在下一行后面是 ID 和名称,并且同一目录中的另一个文件Name, Address在下一行后面是名称和地址,拦截器和通道配置会是什么样子将其路由到不同的 HDFS 目录?
  3. 拦截器如何处理明显不匹配正则表达式的后续行?
  4. 整个文件甚至会构成一个事件,还是一个文件实际上可能是多个事件?

请告诉我。谢谢!

4

1 回答 1

4

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

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

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

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 源对话的客户端类。您必须将文件传输到事件中并将其发送出去。然后,您还可以在那里设置标头,而不是使用拦截器。

于 2015-01-07T13:38:40.840 回答