【问题标题】:flume with multiple Avro schemas具有多个 Avro 模式的水槽
【发布时间】:2015-03-20 08:53:54
【问题描述】:

我正在使用 Flume 将小的 Avro 文件(每个文件包含几个 Avro 事件)组合成更大的文件以存储在 HDFS 中。我正在使用带有 Avro 序列化器的 Spool 源和 HDFS 接收器。我的假脱机目录包含具有 3 种不同模式的文件。是否可以将 Flume 配置为将具有每个不同架构的 Avro 文件组合到不同的接收器文件中?

提前致谢

【问题讨论】:

    标签: schema flume avro serialization


    【解决方案1】:

    的确如此。实际上,flume 所做的是将您的 Avro 对象包装到另一个 Event 类型的 Avro 容器对象中,该对象由 headers 和 body 组成。该主体实际上包含您的 Avro 对象。

    为了将这些文件假脱机到 hdfs 中的不同目录,您必须设置标题,您可以在路径中引用它们,例如:

    agent.sinks.hdfs-sink.hdfs.path = hdfs://namenode/%{avro_type}/
    

    avro_type 是您设置的标头的名称。

    为了设置该标头,您需要使用拦截器。拦截器是实现org.apache.flume.interceptor.Interceptor 的自定义类。在public Event intercept(Event event) 方法中,您将确定avro 对象的类型并调用event.getHeaders().put("avro_type", <something>);

    基本上就是这样。

    【讨论】:

    • 感谢您的评论 Erik;这让我大开眼界; body 包含 avro 对象的事实。要提到的另一件事是,如果您将 AVRO_EVENT 指定为 hdfs 接收器中的序列化程序,那么它实际上会写入整个(外部)avro 对象,而实际上您可能只需要内部 avro 对象。这可以通过将序列化程序设置为 org.apache.flume.sink.hdfs.AvroEventSerializer$Builder 来实现,它从 LITERAL 或 uri 获取模式;基本上看水槽代码...
    • 没错,默认的serialier只会写Flume的avro格式
    猜你喜欢
    • 2020-05-23
    • 2016-01-23
    • 2017-03-14
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2019-04-06
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多