【问题标题】:Flume use case: reading from HTTP and push to HDFS via KafkaFlume 用例:从 HTTP 读取并通过 Kafka 推送到 HDFS
【发布时间】:2024-01-22 12:24:01
【问题描述】:

我是 Flume 新手,想在以下场景中使用 Flume。

我们的系统以 HTTP POST 的形式接收事件,我们需要将它们的副本存储在 Kafka 中(以供进一步处理)并在 HDFS 中存储另一个副本(作为永久存储)。

我们能否将 Flume source 配置为 HTTP,channel 配置为 KAFKA,sink 配置为 HDFS 以满足我们的要求。这个解决方案行得通吗?

【问题讨论】:

    标签: hdfs apache-kafka flume flume-ng


    【解决方案1】:

    如果我理解得很好,您希望 Kafka 作为最终的后端来存储数据,而不是作为 Flume 代理用来通信源和接收器的内部通道。我的意思是,Flume 代理基本上由接收数据的源和构建放入通道的 Flume 事件组成,以便接收器读取这些事件并对其进行处理(通常,将这些数据保存在最终后端)。因此,根据您的设计,如果您使用 Kafka 作为内部通道,那将是一种内部通信 HTTP 源和 HDFS 接收器的方式;但它永远无法从代理外部访问。

    为了满足您的需求,您将需要和代理如:

    http_source -----> memory_channel -----> HDFS_sink ------> HDFS
                |
                |----> memory_channel -----> Kafka_sink -----> Kafka
    
    {.................Flume agent.....................}       {backend}
    

    请注意,基于内存的通道是内部通道,它们可以基于内存或文件,甚至在 Kafka 中,但 Kafka 通道将不同于您将持久化数据的最终 Kafka,这将是可由您的应用访问。

    【讨论】:

    • 感谢您的澄清。同意您的 cmets 使用两个水槽。我不明白的一件事是“但它永远无法从代理外部访问。”当我们提供 Kafka 集群时,代理外部可以访问它,对吗?请澄清。
    • 嗯,你是对的。由于 Kafka 通道基于您自己的集群,因此完全可以访问。尽管如此,这将是 Flume 的一种罕见用途,我的意思是,您可以避免第二个接收器并直接访问基于 Kafka 的内部通道中的数据(同时,HDFS 接收器将永久消耗这些数据存储目的)。但我更喜欢有 2 个基于内存的内部通道,并将 Kafka 视为最终后端,而不是内部通道。我会修正我的答案。
    • 事实上,您可以很好地将 Kafka 用作通道,并让消费者从通道的主题中检索消息。 Kafka 单独处理偏移量(取决于客户端的类型),并且只有在达到消息的 TTL 时才会删除数据。
    最近更新 更多