我试图了解Spark Streaming(而非结构化流)的内部,特别是任务查看DStream的方式。我正在检查Scala here中Spark的源代码。我了解调用堆栈:
ExecutorCoarseGrainedBackend (main) -> Executor (launchtask) -> TaskRunner (Runnable).run() -> task.run(...)
我了解DStream确实是RDD的哈希表,但是我试图了解任务查看DStream的方式。我知道Kafka Spark集成基本上有2种方法:
接收器
这里, Receiver 任务在每个批次间隔(例如5秒)(例如5个分区(=> 1秒块间隔))创建一个新的(微型)批次,并将其下移到< em>常规任务。
问题:考虑我们的示例,其中每5秒创建一次微批处理;完全有5个分区,所有微批处理的所有这些分区都应该以完全相同的方式在DAG下游进行,是否重复使用相同的 regular 任务来重复使用相同的id每个微批次(RDD)都是一项长期运行的任务?例如
如果在时间 T0 上将分区(P1,P2,P3,P4,P5)的 ubatch1 分配给任务ID (T1,T2,T3,T4,T5),将(P1',P2',P3',P4',P5')分区的 ubatch2 在时间 T5 时,也将其分配给同一任务组(T1,T2,T3,T4,T5),或者将新任务(T6,T7,T8 ,T9,T10)是为 ubatch2 创建的吗?
如果是后者,那么当您已经知道有些任务在做完全相同的事情并且可以重复使用时,是否必须每5秒钟通过网络将新任务发送给执行者,是否会占用大量性能?长时间运行的任务?
直接(使用低级Kafka消费者API)
此处,Kafka分区映射到Spark分区,因此映射到一个Task。再次考虑一个主题 t 的5个Kafka分区,我们得到5个Spark分区及其对应的任务。
问题:说,在 T0 的 ubatch1 具有分区(P1,P2,P3,P4,P5)分配给任务(T1,T2,T3,T4,T5)。将对(P1',P2',P3',P4'分区的 ubatch2 ,在时间 T5 时,也将P5')分配给同一任务组(T1,T2,T3,T4,T5),或者将新任务<为 ubatch2 ?
答案 0 :(得分:0)
研究完Apache Spark的源代码之后,这是确定的答案:
这是一种非常直观的方法。
此循环在每个ubatch间隔秒重复一次。