flume-整个文件在flume中是否可以被视为一个事件?

evrscar2  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(477)

我有一个用例,需要将目录中的文件摄取到hdfs中。作为一个poc,我在flume中使用了简单的目录假脱机,在这里我指定了源、接收器和通道,它工作得很好。缺点是,我必须为进入不同文件夹的多种文件类型维护多个目录,以便更好地控制文件大小和其他参数,同时使配置重复,但很容易。
作为一种替代方法,我被建议使用regex拦截器,其中多个文件将驻留在一个目录中,并且基于文件中的字符串,将路由到hdfs中的特定目录。我期望的文件类型是csv文件,其中第一行是头,后面的行是逗号分隔的值。
考虑到这一点,我有几个问题。
拦截器如何处理文件?
假设csv中的标题行 ID, Name 接下来的几行是id和名称,同一目录中的另一个文件 Name, Address 在下一行的名称和地址后面,拦截器和通道配置是什么样的,以便它将其路由到不同的hdfs目录?
拦截器如何处理明显与regex表达式不匹配的后续行?
一个完整的文件会构成一个事件吗?或者一个文件实际上可能是多个事件吗?
请告诉我。谢谢!

oknrviil

oknrviil1#

对于初学者来说,flume本身并不适用于文件,而是适用于一种称为事件的东西。事件是avro结构,可以包含任何内容,通常是一行,但在您的情况下,它可能是一个完整的文件。
拦截器使您能够从事件中提取信息并将其添加到该事件的头中。后者可用于配置traget目录结构。
在您的特定情况下,您需要编写一个分析事件内容并设置头值的解析器,例如sub-path:

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

然后,您可以在hdfs接收器配置中引用它,如下所示:

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

关于多个文件是否可以构成一个事件的问题:是的,这是可能的,但不是spool源。您必须实现一个与配置的avro源通信的客户机类。你必须将你的文件导入一个事件并发送出去。您还可以在那里设置头,而不是使用拦截器。

相关问题