【问题标题】:Kafka - Spark Streaming Integration: DStreams and Task reuseKafka - Spark Streaming 集成:DStreams 和任务重用
【发布时间】: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 分区及其对应的任务。

    问题:说,T0ubatch1有分区(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


【解决方案1】:

看完 Apache Spark 的源代码,下面是明确的答案:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2019-01-15
    • 2021-02-28
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多