Scala 以不同的流化上下文依次打开两个卡夫卡团队

Scala 以不同的流化上下文依次打开两个卡夫卡团队,scala,apache-spark,apache-kafka,spark-streaming,Scala,Apache Spark,Apache Kafka,Spark Streaming,我目前正在尝试在spark streaming中实现一个两阶段流程。首先,我打开一个kafkaStream,通过使用auto.offset.reset=earlime阅读主题中已有的所有内容,并在上面训练我的模型。 为此,我使用了一个流,因为在()之前,如果不打开一个流,我就无法找到如何做。 由于我还没有找到一种在不停止整个StreamingContext的情况下停止流的方法,我在使用ssc.stop(true,true)进行模型计算后停止上下文 当我现在尝试创建一个新的StreamingCon

我目前正在尝试在spark streaming中实现一个两阶段流程。首先,我打开一个kafkaStream,通过使用
auto.offset.reset=earlime
阅读主题中已有的所有内容,并在上面训练我的模型。 为此,我使用了一个流,因为在()之前,如果不打开一个流,我就无法找到如何做。 由于我还没有找到一种在不停止整个StreamingContext的情况下停止流的方法,我在使用
ssc.stop(true,true)
进行模型计算后停止上下文

当我现在尝试创建一个新的StreamingContext(使用旧的sparkConfig或具有相同参数的新的sparkConfig)时,调用我的方法以使用新的groupId和
auto.offset.reset=latest
打开一个新的KafkaStream,当我向Kafka主题写入新内容时,看起来根本没有流媒体发生。forEachRDD中的print()或count()或println都不会在我的IDE中产生任何输出

应用程序的结构如下所示:

  def main(args: Array[String]) {

    val sparkConf = new SparkConf().setAppName(sparkAppName).setMaster(sparkMaster)
      .set("spark.local.dir", sparkLocalDir)
      .set("spark.driver.allowMultipleContexts", "true")

    sparkConf.registerKryoClasses(Array(classOf[Span]))
    sparkConf.registerKryoClasses(Array(classOf[Spans]))
    sparkConf.registerKryoClasses(Array(classOf[java.util.Map[String, String]]))

    val trainingSsc = new StreamingContext(sparkConf, Seconds(batchInterval))
    trainingSsc.checkpoint(checkpoint)
    //val predictor = (model, ninetynine, median, avg, max)
    val result = trainKMeans(trainingSsc);

    trainingSsc.stop(true, false)

    val predictionSsc = new StreamingContext(sparkConf, Seconds(batchInterval))
    val threshold = result._5
    val model = result._1

    kMeansAnomalyDetection(predictionSsc, model, threshold)  
}

我希望你能指出我犯的错误,如果你需要更多的细节,请告诉我。非常感谢您提供的任何帮助和提示。

总体而言,该程序看起来方向正确,但有几点需要解决:

发出
streamingContext.start()
时,Spark Streaming将启动流调度程序。数据流操作将仅由调度程序执行。这意味着对这两个调用进行排序不会产生任何结果:

val result = trainKMeans(trainingSsc);
trainingSsc.stop(true, false)
在进行任何培训之前,将停止流式传输上下文

相反,我们应该这样做:

val result = trainKMeans(trainingSsc)
trainingSsc.foreachRDD{_ => trainingSsc.stop(false, false) } // note that we don't stop the spark context here
trainingSsc.start()
trainingSsc.awaitTermination()
在这种情况下,我们开始流处理;我们让第一个间隔执行,在这个间隔中我们的模型将被训练,然后我们停止处理

第二个流应在与第一个流不同的组上启动(代码段中未显示kafka流创建)

对于第二个流上下文,我们缺少一个开始:

val predictionSsc = new StreamingContext(sparkContext, Seconds(batchInterval)) // note that we pass a sparkContext here, not a config. We reuse the same spark context.
val threshold = result._5
val model = result._1
kMeansAnomalyDetection(predictionSsc, model, threshold) 
predictionSsc.start()
predictionSsc.awaitTermination()

此时我们应该有一个工作流程。

我真的忘了添加预测。start()-这就是预测没有启动的原因。我将评估是否有可能将培训的开始也放在主方法中-但是,在上下文停止后,我需要对提取的RDD进行一些处理,我不太确定如何实现这一点。但你的建议看起来是我应该努力实现的完美结构。