如何在Spark中实现自定义作业侦听器/跟踪器?

时间:2014-06-28 02:32:45

标签: java apache-spark

我有一个类如下,当我通过命令行运行时,我希望看到进度状态。有点像,

10% completed... 
30% completed... 
100% completed...Job done!

我在yarn上使用spark 1.0并使用Java API。

public class MyJavaWordCount {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.err.println("Usage: MyJavaWordCount <master> <file>");
            System.exit(1);
        }
        System.out.println("args[0]: <master>="+args[0]);
        System.out.println("args[1]: <file>="+args[1]);

        JavaSparkContext ctx = new JavaSparkContext(
                args[0],
                "MyJavaWordCount",
                System.getenv("SPARK_HOME"),
                System.getenv("SPARK_EXAMPLES_JAR"));
        JavaRDD<String> lines = ctx.textFile(args[1], 1);

//      output                                            input   output         
        JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
            //              output       input 
            public Iterable<String> call(String s) {
                return Arrays.asList(s.split(" "));
            }
        });

//          K       V                                                input   K       V 
        JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
            //            K       V             input 
            public Tuple2<String, Integer> call(String s) {
                //                K       V 
                return new Tuple2<String, Integer>(s, 1);
            }
        });

        JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer i1, Integer i2) {
                return i1 + i2;
            }
        });

        List<Tuple2<String, Integer>> output = counts.collect();
        for (Tuple2 tuple : output) {
            System.out.println(tuple._1 + ": " + tuple._2);
        }
        System.exit(0);
    }
}

3 个答案:

答案 0 :(得分:15)

如果您使用scala-spark,此代码将帮助您添加spark listener。

创建SparkContext

val sc=new SparkContext(sparkConf) 

现在,您可以在spark上下文中添加spark侦听器

sc.addSparkListener(new SparkListener() {
  override def onApplicationStart(applicationStart: SparkListenerApplicationStart) {
    println("Spark ApplicationStart: " + applicationStart.appName);
  }

  override def onApplicationEnd(applicationEnd: SparkListenerApplicationEnd) {
    println("Spark ApplicationEnd: " + applicationEnd.time);
  }

});

Here is用于从Spark计划中侦听事件的接口列表。

答案 1 :(得分:9)

您应该实施SparkListener。只需覆盖您感兴趣的任何事件(工作/阶段/任务开始/结束事件),然后调用sc.addSparkListener(myListener)

它不会为您提供基于百分比的直接进度跟踪器,但至少您可以跟踪正在进行的进度及其粗略的速率。困难来自于Spark阶段数量的不可预测性,以及每个阶段的运行时间如何可能大不相同。一个阶段的进展应该更加可预测。

答案 2 :(得分:4)

首先,如果你想跟踪进度,那么你可以考虑spark.ui.showConsoleProgress请检查@Yijie Shens回答(Spark output: log-style vs progress-style)这个..

我认为没有必要为这样的事情实现Spark侦听器。除非你非常具体。

  

问题:如何在Spark中实现自定义作业侦听器/跟踪器?

You can Use SparkListener and intercept SparkListener events

此实现的经典示例,在Spark Framework中,它本身就是HeartBeatReceiver。

示例: HeartBeatReceiver.scala

/**
 * Lives in the driver to receive heartbeats from executors..
 */
private[spark] class HeartbeatReceiver(sc: SparkContext, clock: Clock)
  extends SparkListener with ThreadSafeRpcEndpoint with Logging {

  def this(sc: SparkContext) {
    this(sc, new SystemClock)
  }

  sc.addSparkListener(this) ...

以下是可用的侦听器事件列表。哪个应用程序/工作事件应该对您有用

  
      
  • <强> SparkListenerApplicationStart

  •   
  • <强> SparkListenerJobStart

  •   
  • SparkListenerStageSubmitted

  •   
  • SparkListenerTaskStart

  •   
  • SparkListenerTaskGettingResult

  •   
  • SparkListenerTaskEnd

  •   
  • SparkListenerStageCompleted

  •   
  • <强> SparkListenerJobEnd

  •   
  • <强> SparkListenerApplicationEnd

  •   
  • SparkListenerEnvironmentUpdate

  •   
  • SparkListenerBlockManagerAdded

  •   
  • SparkListenerBlockManagerRemoved

  •   
  • SparkListenerBlockUpdated

  •   
  • SparkListenerUnpersistRDD

  •   
  • SparkListenerExecutorAdded

  •   
  • SparkListenerExecutorRemoved

  •