我正在使用DirectAPI在纱线上运行火花流(1.6.1)来读取具有50个分区并在HDFS上书写的Kafka主题的事件。我的批处理间隔为60秒。我收到了大约500K的消息,这些消息在60秒内被处理。
突然火花开始收到15-20万条消息,大约需要5-6分钟处理,批处理间隔为60秒。我已配置"spark.streaming.concurrentJobs=4"
。
因此,当批处理花费很长时间处理spark时,会启动并发4个活动任务来处理积压批处理但仍然会在一段时间内批量积压增加,因为批处理间隔对于这样的数据量来说太小了。
我对此几乎没有疑问。
当我开始接收15-20万条消息时处理这些消息的时间大约为5-6分钟,批处理间隔为60秒。当我检查我的HDFS目录时,我看到为每个60秒创建的文件包含50个部分文件,我很困惑这里我的批处理在5-6分钟内得到处理,然后它是如何每隔1分钟在HDFS上写文件的。 'saveAsTextFile'
操作每批只调用一次。所有文件的总记录50个部分文件大约有330万个。
为了处理1500万到2000万条消息,我将批处理间隔配置为8-10分钟,现在火花开始消耗来自Kafka&再次,它的处理时间开始超过批次间隔。
我已配置'spark.streaming.kafka.maxRatePerPartition=50'
& 'spark.streaming.backpressure.enabled=true'
。
答案 0 :(得分:0)
我认为可能让您感到困惑的一件事是工作时间长短与工作频率之间的关系。
根据您的描述,在可用资源的情况下,最终这项工作似乎需要大约 5 分钟才能完成。但是,您的批处理频率为 1 分钟。
因此,每 1 分钟您就会启动一些需要 5 分钟才能完成的批次。
因此,最终您会期望看到 HDFS 在前几分钟内什么也没有收到,然后您每 1 分钟不断收到一些信息(但从数据输入开始有 5 分钟的“延迟”)。