我试图了解 Spark Streaming(不是 Structured Streaming)的内部结构,特别是任务查看 DStream 的方式。我将在 scala 中查看 Spark 的源代码,这里。我了解调用堆栈:
ExecutorCoarseGrainedBackend (main) -> Executor (launchtask) -> TaskRunner (Runnable).run() -> task.run(...)
我了解 DStream 确实是 RDD 的哈希图,但我试图了解任务查看 DStream 的方式。我知道 Kafka Spark 集成基本上有两种方法:
基于使用高级 Kafka 消费者 API 的接收器
在这里, Receiver任务在每个批处理间隔(例如 5 秒)创建一个新的(微)批处理,其中包含 5 个分区(=> 1 秒块间隔),并将下游交给常规任务。
问题:考虑我们的示例,每个微批次每 5 秒创建一次;恰好有 5 个分区,并且所有微批次的所有这些分区都应该以完全相同的方式在下游进行 DAG 处理,是相同的常规任务一遍又一遍地重复用于每个微批次 (RDD) 的相同分区 id 作为长时间运行的任务?例如
如果在时间T0将分区(P1,P2,P3,P4,P5)的ubatch1分配给任务 id (T1, T2, T3, T4, T5),则分区( P1',P2',P3',P4 ',P5')在时间T5也被分配给同一组任务(T1、T2、T3、T4、T5)或者是否会为ubatch2创建新任务(T6、T7、T8、T9、T10)?
如果是后者,那么当您已经知道有任务在做完全相同的事情并且可以在长时间运行时重复使用时,必须每 5 秒通过网络向执行程序发送一次新任务不是性能密集型的吗?任务?
直接使用低级 Kafka 消费者 API
这里一个 Kafka 分区映射到一个 Spark 分区,因此映射到一个任务。同样,考虑主题t的 5 个 Kafka 分区,我们得到 5 个 Spark 分区及其对应的任务。
问题:假设T0的ubatch1有分区(P1,P2,P3,P4,P5)分配给任务(T1,T2,T3,T4,T5)。在时间T5的 ubatch2分区( P1',P2',P3',P4',P5')是否也被分配给同一组任务(T1, T2, T3, T4, T5)或新任务(T6, T7、T8、T9、T10)为ubatch2创建?