Apache spark 使用Spark Streaming时限制Kafka批次大小
是否可以限制Kafka消费者返回的用于Spark流媒体的批次的大小Apache spark 使用Spark Streaming时限制Kafka批次大小,apache-spark,apache-kafka,spark-streaming,kafka-consumer-api,Apache Spark,Apache Kafka,Spark Streaming,Kafka Consumer Api,是否可以限制Kafka消费者返回的用于Spark流媒体的批次的大小 我这样问是因为我得到的第一批记录有数亿条,处理和检查它们需要很长时间。我想你的问题可以通过火花流式背压解决 检查spark.streaming.backpressure.enabled和spark.streaming.backpressure.initialRate 默认情况下,spark.streaming.backpressure.initialRate未设置,spark.streaming.backpressure.ena
我这样问是因为我得到的第一批记录有数亿条,处理和检查它们需要很长时间。我想你的问题可以通过火花流式背压解决 检查
spark.streaming.backpressure.enabled
和spark.streaming.backpressure.initialRate
默认情况下,spark.streaming.backpressure.initialRate
未设置,spark.streaming.backpressure.enabled
默认情况下为禁用,因此我认为spark将尽可能多地使用
从
spark.streaming.backpressure.enabled
:
这使得Spark Streaming能够基于数据流控制接收速率
对当前批量调度的延迟和处理时间进行分析,以便
系统接收的速度与系统处理的速度一样快。
在内部,这将动态设置
接受者。此速率由值的上限确定
spark.streaming.receiver.maxRate
和
spark.streaming.kafka.maxRatePerPartition
如果已设置(请参见下文)
由于您想要控制第一批,或者更具体地说,第一批中的消息数量,我认为您需要spark.streaming.backpressure.initialRate
spark.streaming.backpressure.initialRate
:
这是每个接收器将接收的初始最大接收速率
当背压机构关闭时,接收第一批数据
启用
当您的Spark job(分别是Spark workers)能够处理来自kafka的10000条消息,但kafka代理为您的工作提供100000条消息时,这条消息是很好的
除了上述答案之外,您可能还想查看spark.streaming.kafka.maxRatePerPartition,以及一些关于这些属性的研究和建议。。批量大小是3个参数的乘积
batchDuration
:将流式数据划分为批的时间间隔(以秒为单位)spark.streaming.kafka.maxRatePerPartition
:设置每秒每个分区的最大消息数。当与batchDuration
结合使用时,将控制批次大小。您希望设置maxRatePerPartition
,并将其设置为较大(否则会有效地限制作业)和batchDuration
非常小为了更好地解释背压启用/禁用()时该产品的工作原理,限制最大批处理大小将大大有助于控制处理时间,但会增加消息的处理延迟 通过以下属性的设置,我们可以控制批量大小 spark.streaming.receiver.maxRate= spark.streaming.kafka.maxRatePerPartition= 通过启用背压,您甚至可以根据处理时间动态设置批处理大小 火花.流.背压.启用:真
spark.streaming.backpressure.initialRate:这就是我要找的,谢谢。不幸的是,spark.streaming.backpressure.initialRate、spark.streaming.backpressure.enabled、spark.streaming.receiver.maxRate和spark.streaming.receiver.initialRate都没有更改我获得的记录数(我尝试了许多不同的组合)。唯一有效的配置是“spark.streaming.kafka.maxRatePerPartition”。这总比什么都不做要好,但如果能为自动缩放启用背压,我会很有用。你知道为什么背压不起作用吗?如何调试这个?也许
spark.streaming.backpressure.initialRate
可以工作,但正如Jeroen van Wilgenburg在他的博客中所注意到的,“设置最大值是个好主意,因为背压算法不是即时的(这是不可能的)…当卡夫卡决定在最初几秒钟内每秒给我们50000条记录时,卡夫卡输入的作业可能会处理大约1000个事件。”。。但是我很困惑,因为它不起作用。spark.streaming.backpressure.enabled
应该在最新的流媒体文档上“在内部动态设置接收器的最大接收速率”,它提到设置spark.streaming.backpressure.enabled
动态地处理速率。“在Spark 1.5中,我们引入了一种称为背压的功能,无需设置此速率限制,因为Spark Streaming会自动计算速率限制,并在处理条件发生变化时动态调整。”,这可以解释为什么属性设置为true时速率不起作用。我使用的是spark 1.6.1和createStream API,我也无法利用spark.streaming.backpressure.enabled=true它对我也不起作用,唯一适合我的设置是spark.streaming.receiver.MaxRate这种方法适用于spark结构化流媒体吗?您当前的批处理间隔是多少?如果更多的话,试着缩短批处理间隔,这样你可以得到更少的数据。忽略你的问题,你提到的第一批。这个答案比公认的答案更准确。这真的很有意义。谢谢你的澄清。但我的情况却没有什么不同。在我的工作中,我从多个主题进行消费。所以,问题是:NumberOfTopics X NumberOfPartitions X MaxRatePerPartition X BatchDuration,我想设置最大值。使用Spark 2.4和直接卡夫卡流。