Flume - 可以将整个文件视为Flume中的事件吗?

时间:2015-01-06 19:39:07

标签: hadoop flume flume-ng

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

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

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

  1. 拦截器如何处理文件?
  2. 鉴于CSV中的标题行与ID, Name类似,后面的行跟随ID和名称,同一目录中的另一个文件将在下一行中跟Name, Address后跟名称和地址,拦截器和通道配置将它路由到不同的HDFS目录是什么样的?
  3. 拦截器如何处理明显与正则表达式不匹配的后续行?
  4. 整个文件是否构成一个事件,或者一个文件实际上可能是多个事件?
  5. 请告诉我。谢谢!

1 个答案:

答案 0 :(得分:4)

对于初学者来说,水槽不能对文件本身起作用,而是在一个叫做事件的东西上。事件是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源对话的客户端类。您必须将文件传输到事件中并将其发送出去。然后你也可以在那里设置标题,而不是使用拦截器。