Scala 以不同的流化上下文依次打开两个卡夫卡团队
我目前正在尝试在spark streaming中实现一个两阶段流程。首先,我打开一个kafkaStream,通过使用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
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进行一些处理,我不太确定如何实现这一点。但你的建议看起来是我应该努力实现的完美结构。