为什么SparkListenerApplicationStart永远不会被触发?

时间:2015-03-20 15:18:32

标签: apache-spark

我正在编写Spark应用程序,我需要拦截正在运行的作业的状态。为此目的,我使用以下代码实现了SparkListener

class MyAppListener extends SparkListener {

    override def onApplicationStart(ev: SparkListenerApplicationStart): Unit = {
      println("AAA: Application Start")
    }

    override def onApplicationEnd(ev: SparkListenerApplicationEnd): Unit = {
      println("AAA: Application End")
    }
  }
}

然后,我使用以下代码启动应用程序并查看事件:

val appListener = new MyAppListener
val conf = new SparkConf().setAppName("Listener")
val sc = new SparkContext(conf) 
sc.addSparkListener(appListener)
println(sc.parallelize(1 to 10).count)
sc.stop()

在日志中,我看到字符串" AAA:Application End",但我看不到应用程序的开头。

配置:

  • Spark版本1.2.0
  • Scala 2.10
  • 群集上的本地独立模式或YARN客户端模式(相同行为)

1 个答案:

答案 0 :(得分:9)

您正在将您的侦听器添加到错误位置的spark中,当您启动spark上下文时,它也会启动您的应用程序。=>在您添加监听器时,onApplicationStart已被触发。

解决方案:将您的侦听器添加到SparkConf。

sparkConf.set("spark.extraListeners","your.listener.class")