【问题标题】:Signaling Flume source to stop if the sink unreachable如果接收器无法访问,则通知 Flume 源停止
【发布时间】:2015-09-08 14:59:04
【问题描述】:

我正在尝试使用 Flume 将我的访问日志发送到 Spark 集群。但是有很多限制迫使我编写自定义应用程序(或 Flume 源)来读取日志文件。

我要做的是让 Flume 客户端向这个源发出信号,以防它无法将数据写入接收器。由于我们经常有长时间的网络中断,并且没有足够的磁盘空间来在磁盘上排队失败的日志,直到网络备份。相反,我想“告诉”源停止阅读日志,直到网络启动,然后“告诉”它重新开始。但到目前为止,我还没有在文档中看到任何关于错误的回调。

有没有我可以在不重新发明轮子的情况下实现这样的场景?

【问题讨论】:

  • 您使用的是哪种源类型?您是将日志文件复制到 HDFS 还是使用 AvroSink 将输出流式传输到 SparkStreaming?您的场景实际上是 Flume 旨在处理的,但您应该对您的配置提供更深入的了解,以便我们为您提供指导。也许你的 flume.conf 的副本就可以了。
  • 啊,抱歉,忘了说我正在使用 SparkStreaming。因此,我将日志推送到 Spark 上的 Avro 接收器。我只需要保证网络中断后流会自动继续,而不会在中断期间复制磁盘上的日志(正常访问日志文件 + Flume 磁盘缓冲)。

标签: logging apache-spark flume log-shipping


【解决方案1】:

好的,现在我们已经澄清了几个问题,下面是实际发生的情况:

Flume Source - SpoolDir or similar -> Channel -> AvroSink (SparkStreaming)

Flume 解析一个文件并将该文件的行转换为 FlumeEvents,这些事件被假脱机到 Channel。这种情况会尽快发生,至少在通道满之前是这样。如果 Channel 已满,则源将后退,直到 Channel 再次接受记录。您可以通过指定通道可以保存的内存和记录数量来控制通道的容量。

通道将被 AvroSink 读取。如果 AvroSink 由于网络中断而无法提交事件,它将停止从通道消费,从而导致通道满。

此时您将在 Flume 的日志文件中看到消息,指示接收器无法跟上源,这是预期的行为,因为您的通道充当(不可靠)接收器的后备缓冲区。您不会遇到重复处理事件的情况,但是如果您选择非持久通道类型(例如 MemoryChannel),您可能会丢失一些事件以中断。

【讨论】:

  • 我不担心 Flume 重复处理我的事件。只是为了澄清一点,我的问题是如何向自定义源发出信号以退出或停止生成更多事件。因为据我所见,自定义源和接收器是完全分离的,并且 Flume 的任务是在某处将未处理的事件排队,直到接收器重新上线。
  • 正如我所写,回退机制是由通道容量触发的。如果通道已满,源将后退。没有功能可以明确地做到这一点。这种退避机制其实很可靠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多