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

Nic*_*aro 4 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")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

在日志中,我看到字符串"AAA:Application End",但我没有看到应用程序的开始.

组态:

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

Xua*_*ham 10

你正在将你的监听器添加到错误的位置,当你启动一个spark上下文时,它也会启动你的应用程序.=>在你添加你的监听器时,onApplicationStart已经被触发了.

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

sparkConf.set("spark.extraListeners","your.listener.class")
Run Code Online (Sandbox Code Playgroud)