【发布时间】:2019-09-29 19:24:47
【问题描述】:
我试图了解 Spark Streaming(不是结构化流)的内部结构,特别是任务查看 DStream 的方式。我正在查看 scala 中的 Spark 源代码,here。我了解调用堆栈:
ExecutorCoarseGrainedBackend (main) -> Executor (launchtask) -> TaskRunner (Runnable).run() -> task.run(...)
我了解 DStream 确实是 RDD 的哈希图,但我试图了解任务查看 DStream 的方式。我知道 Kafka Spark 集成基本上有两种方法:
-
接收器使用高级 Kafka Consumer APIs
这里由 Receiver 任务在每个批处理间隔(例如 5 秒)创建一个新的(微)批处理,其中包含 5 个分区(=> 1 秒的块间隔),并将下游传递给 常规任务。
问题:考虑我们的示例,每个微批次每 5 秒创建一次;正好有 5 个分区,并且所有微批次的所有这些分区都应该以完全相同的方式在下游进行 DAG-ged,相同的 常规 任务是否会一遍又一遍地重复用于相同的分区 id每个微批处理(RDD)都是一项长期运行的任务?例如
如果 (P1,P2,P3,P4,P5) 的分区 ubatch1 在时间 T0 被分配给任务 ID (T1, T2, T3, T4, T5), 将 ubatch2 个分区 (P1',P2',P3',P4',P5')在时间 T5 也被分配到同一组任务 (T1, T2, T3, T4, T5) 或将新的任务 (T6, T7, T8 , T9, T10) 为 ubatch2 创建?
如果是后者,那么当您已经知道有任务在做完全相同的事情并且可以重复使用时,必须每 5 秒通过网络向执行程序发送一次新任务,这不会是性能密集型的吗?长时间运行的任务?
-
直接使用低级 Kafka Consumer APIs
这里一个 Kafka 分区映射到一个 Spark 分区,因此映射到一个任务。同样,考虑主题 t 的 5 个 Kafka 分区,我们得到 5 个 Spark 分区及其对应的任务。
问题:说,T0的ubatch1有分区(P1,P2,P3,P4,P5) em> 分配给任务 (T1, T2, T3, T4, T5)。 将 ubatch2 的分区 (P1',P2',P3',P4' ,P5') 在时间 T5 也被分配到同一组任务 (T1, T2, T3, T4, T5) 或将新任务 (T6, T7, T8, T9, T10) 为ubatch2创建?
【问题讨论】:
-
那个,我同意。我试图深入了解这一点,以便能够自下而上地理解整个画面。我想自己写一个..一个简单的..它将帮助我理解很多方面
-
非常高尚,有点像我自己,但也有Structured Streaming,它并不完全让生活变得更轻松。一天只有这么几个小时!
-
谁能帮我理解这个?从 Receiver 转移到基于 Direct 的方法,甚至转移到 Structured Streaming 是没有问题的。只是我试图了解每个人的内部细节,以便能够更好地了解进化时间线、现有问题和所采取的方法。
标签: apache-spark apache-kafka spark-streaming spark-streaming-kafka dstream