计算Spark(结构化)流应用程序的数据处理速率

时间:2018-04-27 15:22:28

标签: scala apache-spark streaming spark-streaming spark-structured-streaming

TL; DR 关于查找Apache Spark数据管道可以处理的最大传入数据率的最佳做法是什么?

我为流数据编写了两个Apache Spark管道(一个使用Structured Streaming,另一个使用Streaming)。管道从套接字连接接收流数据。出于本地测试目的,我以两种方式将文件传输到ncat服务器:

  1. 我逐行管道文件,行间略有延迟。
  2. 我一次管理大约5000个数据点的整个文件。
  3. 这两种流方法(一种快速,一种稍慢)对于流式和流式传输流水线具有非常不同的结果。延迟的逐行流(1)允许流水线完全处理所有信息,而转储(2)导致仅处理一小部分数据点(大部分数据完全丢失)。

    这似乎表明两条管道都存在问题,并且会跟上这些问题。使用完整文件转储(2)的速率,并且管道的结果与传入数据的速率有关。我显然希望尽可能接近这个最大速率,而不是过去。

    我的问题是:如何找到Apache Structured Streaming / Apache Streaming管道设置的最大数据处理速率?

1 个答案:

答案 0 :(得分:1)

在阅读和理解您的问题时,您希望找到火花流工作处理的速率。您有一个名为PIDRateEstimator的东西,当使用BackPressure启用时,它会为您的Spark应用程序提供反馈循环。在旧的火花流版本中,设置背压更有意义,您需要接收器使用流中的消息。从Spark 1.3开始,您可以使用无接收器的“直接”方法来确保更强大的端到端保证。所以你不需要担心背压,因为火花可以完成大部分微调。请从以下链接中了解有关PIDEstimators的更多信息

https://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/scheduler/rate/PIDRateEstimator.scala

https://vanwilgenburg.wordpress.com/2015/10/06/spark-streaming-backpressure/

对于速率限制,您可以使用Spark配置变量spark.streaming.kafka.maxRatePerPartition来设置每个分区每个分区的最大消息数。