1

我试图了解 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创建?

4

1 回答 1

0

在浏览了 Apache Spark 的源代码之后,这里是明确的答案:

这是一种非常直观的方法。

  1. 我们使用 SparkContext 中的SparkStreamingContext (ssc)DStream DAG 的形式在流上创建和保存我们的转换序列,该 DAG 以ForEachDStream DStream 结尾,其中每个 DStream 都是 RDD 的容器,即 Hashmap
  2. ForEachDStream 在sscDStreamGraph中注册。
  3. ssc.start (-ing) 执行时,JobScheduler 将我们保存的计划放在一个事件循环上,该循环执行每个ubatch 间隔秒,为每个 DStream 以及当时从每个 DStream 创建/提取一个 RDD,并将其保存在 HashMap为更正。DStream for a rememberDuration持续时间(例如用于窗口)
  4. 并在此过程中创建以ForEachDStream中指定的操作结束的 RDD DAG,然后将新作业提交给 DAG 调度程序。

此循环每 ubatch 间隔秒重复一次。

于 2019-05-15T18:00:58.793 回答