大约1分钟后,Spark Streaming会停止而不会出错

时间:2016-11-16 18:08:39

标签: scala apache-kafka spark-streaming

当我为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

1 个答案:

答案 0 :(得分:0)

您的代码缺少对ssc.awaitTermination的调用来阻止驱动程序线程。

不幸的是,从控制台上的map函数中查看打印输出并不容易,因为这些函数调用是在YARN执行程序中发生的。 Cloudera Manager可以很好地查看日志,如果你真的需要在驱动程序上收集它们,你可以写入HDFS中的某个位置,然后自己从那里搜索各种日志。如果您要跟踪的信息纯粹是数字,您也可以考虑使用Accumulator