Flume - 是否可以将整个文件视为 Flume 中的一个事件?
Flume - Can an entire file be considered an event in Flume?
我有一个用例,我需要将目录中的文件提取到 HDFS 中。作为 POC,我在 Flume 中使用了简单的目录假脱机,我在其中指定了源、接收器和通道,它工作正常。缺点是我必须为进入不同文件夹的多种文件类型维护多个目录,以便更好地控制文件大小和其他参数,同时使配置重复,但很容易。
作为替代方案,有人建议我使用正则表达式拦截器,其中多个文件将驻留在一个目录中,并根据文件中的字符串路由到 HDFS 中的特定目录。我期望的文件类型是 CSV 文件,其中第一行是 header,后续行是逗号分隔值。
考虑到这一点,我有几个问题。
- 拦截器如何处理文件?
- 鉴于 CSV 中的 header 行类似于
ID, Name
后跟 ID 和名称,而同一目录中的另一个文件将有 Name, Address
后跟在下一行的名称和地址中,拦截器和通道配置如何将其路由到不同的 HDFS 目录?
- 拦截器如何处理明显与正则表达式不匹配的后续行?
- 整个文件是否构成一个事件,或者一个文件实际上可以是多个事件吗?
请告诉我。谢谢!
首先,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 而不是使用拦截器。
我有一个用例,我需要将目录中的文件提取到 HDFS 中。作为 POC,我在 Flume 中使用了简单的目录假脱机,我在其中指定了源、接收器和通道,它工作正常。缺点是我必须为进入不同文件夹的多种文件类型维护多个目录,以便更好地控制文件大小和其他参数,同时使配置重复,但很容易。
作为替代方案,有人建议我使用正则表达式拦截器,其中多个文件将驻留在一个目录中,并根据文件中的字符串路由到 HDFS 中的特定目录。我期望的文件类型是 CSV 文件,其中第一行是 header,后续行是逗号分隔值。
考虑到这一点,我有几个问题。
- 拦截器如何处理文件?
- 鉴于 CSV 中的 header 行类似于
ID, Name
后跟 ID 和名称,而同一目录中的另一个文件将有Name, Address
后跟在下一行的名称和地址中,拦截器和通道配置如何将其路由到不同的 HDFS 目录? - 拦截器如何处理明显与正则表达式不匹配的后续行?
- 整个文件是否构成一个事件,或者一个文件实际上可以是多个事件吗?
请告诉我。谢谢!
首先,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 而不是使用拦截器。