Apache spark 调用Rserve时触发流式处理慢速检查点

Apache spark 调用Rserve时触发流式处理慢速检查点,apache-spark,spark-streaming,rserve,Apache Spark,Spark Streaming,Rserve,我用Java编写了一个spark流媒体应用程序。它读取数据馈送接收器的股票交易,并将其转换为Tick对象,并使用10秒的微批次间隔、窗口间隔和滑动间隔。将创建一个JavaPairDStream,其中键是股票符号 然后使用mapWithState将Tick对象存储在JavaMapWithStateDStream中;在mapWithState回调函数中使用刻度作为输入执行分析计算。一切正常,直到我修改了我的程序,在mapWithState回调函数中调用Rserve,以便在R中执行额外的分析计算 当我

我用Java编写了一个spark流媒体应用程序。它读取数据馈送接收器的股票交易,并将其转换为Tick对象,并使用10秒的微批次间隔、窗口间隔和滑动间隔。将创建一个
JavaPairDStream
,其中键是股票符号

然后使用mapWithState将Tick对象存储在JavaMapWithStateDStream中;在mapWithState回调函数中使用刻度作为输入执行分析计算。一切正常,直到我修改了我的程序,在mapWithState回调函数中调用Rserve,以便在R中执行额外的分析计算

当我开始调用Rserve时,每10个窗口都需要很长时间来处理;这个窗口也会写入检查点文件(我使用的是Hadoop)。每10个窗口的处理时间比前10个窗口长(窗口30比窗口20长,窗口20比窗口10长)。所有非检查点窗口都会在10秒内完成,但检查点窗口最终可能需要几分钟才能完成,而其他窗口则在它们后面排队

然后,我尝试将JavaMapWithStateStream上的检查点间隔设置为24小时,以便有效地禁用检查点(mapWithStateStream.checkpoint(Durations.minutes(1440)))。我为3服务器集群上的工作人员启用了足够的内存,以便他们能够在不断增长的内存使用率下生存下来

我输出到日志的结果出乎意料。以前,
JavaPairDStream
中填充了5000个键,现在仍然如此。但是,以前有5000个键被传递到mapWithState回调函数;现在只向它传递了200个键,我看到Spark Streaming UI网页中跳过了许多阶段。当我在MS Windows机器上以单进程模式运行此操作时,仍会将5000个键传递给mapWithState回调函数

有人知道为什么调用Rserve会导致检查点时间大幅增加,或者为什么在JavaMapWithStateDStream上调用检查点(Durations.minutes(1440))会导致spark无法将
JavaPairDStream
中的大多数元组传递给mapWithState回调函数吗