当我为Spart Streaming作业spark-submit
时,我可以看到它在大约1分钟内运行,然后以最终状态SUCCEEDED
停止:
16/11/16 18:58:16 INFO yarn.Client: Application report for application_XXXX_XXX (state: RUNNING)
16/11/16 18:58:17 INFO yarn.Client: Application report for application_XXXX_XXX (state: FINISHED)
我不明白为什么它会停止,而我希望它运行一个未定义的时间并由从Kafka队列收到的消息触发。在日志中,我可以看到所有println
输出,并且没有错误。
这是代码的简短摘录:
val conf = new SparkConf().setAppName("MYTEST")
val sc = new SparkContext(conf)
sc.setCheckpointDir("~/checkpointDir")
val ssc = new StreamingContext(sc, Seconds(batch_interval_seconds))
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
println("Dividing the topic into partitions.")
val inputKafkaTopicMap = inputKafkaTopic.split(",").map((_, kafkaNumThreads)).toMap
val messages = KafkaUtils.createStream(ssc, zkQuorum, group, inputKafkaTopicMap).map(_._2)
messages.foreachRDD(msg => {
msg.foreach(s => {
if (s != null) {
//val result = ... processing goes here
//println(result)
}
})
})
// Start the streaming context in the background.
ssc.start()
这是我的spark-submit
命令:
/usr/bin/spark-submit --master yarn --deploy-mode cluster --driver-memory 10g --executor-memory 10g --num-executors 2 --conf "spark.executor.extraJavaOptions=-XX:+UseG1GC \
-XX:+AlwaysPreTouch" --class org.test.StreamingRunner test.jar param1 param2
当我打开资源管理器时,我发现没有作业RUNNING
,并且火花流工作被标记为FINISHED
。
答案 0 :(得分:0)
您的代码缺少对ssc.awaitTermination
的调用来阻止驱动程序线程。
不幸的是,从控制台上的map
函数中查看打印输出并不容易,因为这些函数调用是在YARN执行程序中发生的。 Cloudera Manager可以很好地查看日志,如果你真的需要在驱动程序上收集它们,你可以写入HDFS中的某个位置,然后自己从那里搜索各种日志。如果您要跟踪的信息纯粹是数字,您也可以考虑使用Accumulator。