2016-04-04 169 views
0

MyJavaSparkListener星火:onApplicationStart永遠不會被調用

package com.streamanalytix.spark.core.pipeline; 

import org.apache.commons.logging.Log; 
import org.apache.spark.JavaSparkListener; 
import org.apache.spark.scheduler.SparkListenerApplicationEnd; 
import org.apache.spark.scheduler.SparkListenerApplicationStart; 
import org.apache.spark.scheduler.SparkListenerBlockManagerAdded; 
import org.apache.spark.scheduler.SparkListenerBlockManagerRemoved; 

public class MyJavaSparkListener extends JavaSparkListener { 

    /** The Constant LOGGER. */ 
    private static final Log LOGGER = LogUtil.getLogger(MyJavaSparkListener.class); 

    public MyJavaSparkListener() { 
     super(); 
     LOGGER.info("---------------------------------------------- Creating new SaxJavaSparkListener"); 
    } 

    @Override 
    public void onApplicationStart(SparkListenerApplicationStart arg0) { 
     LOGGER.info("---------------------------------------------- Spark pipeline is up and running..."); 
    } 

    @Override 
    public void onApplicationEnd(SparkListenerApplicationEnd arg0) { 
     LOGGER.info("---------------------------------------------- Spark pipeline going to shutdown..."); 
    } 

    @Override 
    public void onBlockManagerAdded(SparkListenerBlockManagerAdded blockManagerAdded) { 
     LOGGER.info("---------------------------------------------- onBlockManagerAdded"); 
    } 

    @Override 
    public void onBlockManagerRemoved(SparkListenerBlockManagerRemoved blockManagerRemoved) { 
     LOGGER.info("---------------------------------------------- onBlockManagerRemoved"); 
    } 
} 

我註冊這個監聽器有以下行

context.sparkContext().sc().addSparkListener(new MyJavaSparkListener()); 

我在客戶端模式下運行的Spark應用程序,但我沒有看到任何日誌打印爲onApplicationStartonApplicationEnd。但是,調用onBlockManagerAdded並打印日誌。 我不知道如何使用onApplicationStart或者如何使用它,因爲文檔太有限了。

謝謝。

回答

3

問題是SparkListenerApplicationStart在註冊偵聽器之前已經發送。爲了避免這種情況,您可以使用配置spark.extraListeners。然後,Spark將在任何事件之前註冊您的偵聽器。以下是有關此配置的說明(http://spark.apache.org/docs/latest/configuration.html#application-properties):

實現SparkListener的類的逗號分隔列表;當初始化SparkContext時,這些類的實例將被創建並註冊到Spark的監聽器總線。如果一個類有一個接受SparkConf的單參數構造函數,那麼將調用該構造函數;否則,將調用一個零參數的構造函數。如果找不到有效的構造函數,則SparkContext創建將失敗,並出現異常。

相關問題