Kafka-Spark Streaming集成:DStream和任务重用

时间:2019-05-12 18:12:59

标签: apache-spark apache-kafka spark-streaming spark-streaming-kafka dstream

我试图了解Spark Streaming(而非结构化流)的内部,特别是任务查看DStream的方式。我正在检查Scala here中Spark的源代码。我了解调用堆栈:

ExecutorCoarseGrainedBackend (main) -> Executor (launchtask) -> TaskRunner (Runnable).run() -> task.run(...) 

我了解DStream确实是RDD的哈希表,但是我试图了解任务查看DStream的方式。我知道Kafka Spark集成基本上有2种方法:

    使用高级Kafka消费者API的
  • 接收器

    这里, 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

  • 创建em>(T6,T7,T8,T9,T10)

1 个答案:

答案 0 :(得分:0)

研究完Apache Spark的源代码之后,这是确定的答案:

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

  1. 我们使用来自 SparkContext SparkStreamingContext(ssc)来创建并以DStream DAG的形式将转换序列保存在流上,并以 ForEachDStream DStream,其中每个DStream都是RDD的容器,即Hashmap
  2. ForEachDStream 已在 ssc 的DStreamGraph中注册。
  3. ssc.start (执行)后,JobScheduler将保存的计划放在事件循环中,该循环执行每 ubatch间隔秒数创建/提取RDD对于每个DStream以及当时的每个DStream,并将其保存在HashMap中以用于corr。 Dem在 rememberDuration 时间段内(例如,用于窗口显示)
  4. ,然后在过程中创建RDD DAG,并在 ForEachDStream 中指定的操作中结束,然后将新作业提交给DAG Scheduler。

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