使用kafka进行Spark流式传输 - 从检查点

时间:2016-10-06 20:54:27

标签: apache-spark spark-streaming

我们正在使用Spark Streaming和Kafka构建容错系统,并正在测试检查点火花流,以便我们可以选择在因任何原因崩溃时重新启动spark作业。这就是我们的火花过程:

  • Spark Streaming每5秒运行一次(幻灯片间隔)以从kafka
  • 读取数据
  • Kafka每秒收到大约80封邮件

我们想要实现的是一个设置,我们可以关闭火花流工作(模仿失败),然后重新启动它,并确保我们处理来自Kafka的每条消息。这似乎工作正常,但是,我看到的是我不知道该怎么做:

  • 重新启动Spark作业后,将为所有丢失的时间创建一个批处理。因此对于例如如果我们在一分钟后关闭并重新启动12个批次(每5秒一个)。请参阅下面的图片
  • 这些批次中没有一个正在处理任何数据。正如您在下图中看到的那样,这些批次的输入大小= 0.在数据开始处理批次之前,我们必须等待所有这些完成。如果我们在数小时的间隔后重新启动作业,这会变得更糟,因为创建了数百个批处理但不需要处理任何事情但必须完成的工作

对此的任何意见均表示赞赏:

  • 这是预期的吗?为什么批处理在不处理任何数据时被创建(kafka主题是连续接收消息)。
  • 还有一件令人困惑的事情。在我们将spark过程停止一分钟并重新启动之后,kafka主题中有4800(80 * 60)条消息等待处理。看起来这些消息正在处理中,但我没有看到UI上任何输入大小为4800的批处理

enter image description here

2 个答案:

答案 0 :(得分:1)

  

这是预期的吗?为什么批处理在不处理任何数据时被创建

这就是Sparks容错语义保证的,即使您的服务失败,它也可以从最后处理的时间点开始并继续处理。 Spark正在读取检查点数据并启动恢复过程,直到达到当前时间点。 Spark不知道0个事件批次,因此无法优化它们。

  

看起来正在处理这些消息,但我在UI上看不到任何输入大小为4800的批处理

这可能由于各种原因而发生。常见的一种是如果你将Sparks背压标志设置为true。 Spark看到你有一个重要的处理延迟,因此它减少了每批读取的消息数量,以便让流式作业能够赶上。

答案 1 :(得分:0)

  

这是预期的吗?为什么批处理在不处理任何数据时被创建

事实上,与Kafka一起使用Spark时,从检查点恢复时,首先会产生作业。所有数据都在一个或多个批次中处理(取决于某些配置),而在web ui中,您只能看到所有使用0事件执行的恢复批次。

  

还有第二件事令人困惑......

是的,从网络上来说,这令人困惑。尝试计算每个批次的事件数量,打印数量

DStream.foreachRDD(println(_.count))

你会发现Spark确实处理由checkpoint创建的批处理,而在web ui中,事件为num 0。

  

如果您的应用程序发现在从故障中恢复后很难处理一个批次中的所有事件,那么如何控制spark创建的批次数?

尝试搜索spark.streaming.kafka.maxRatePerPartition =>使用新Kafka直接流API时从每个Kafka分区读取数据的最大速率(每秒记录数)。

MaxRatePerPartition* partitionOfKafka* YourStreamingBatchDuration * N = eventsNumToProcess

N => After recovered from checkpoint, the num of batches spark need to process.