Apache spark Spark启动器句柄和侦听器未提供状态

Apache spark Spark启动器句柄和侦听器未提供状态,apache-spark,spark-launcher,Apache Spark,Spark Launcher,我有一个web应用程序,它将使用spark launcher库在Cloudera spark cluster上提交spark作业 它正在将spark作业成功提交到群集。但是,它不会回调侦听器类方法,而且返回的getState()不会从“未知”更改,即使在集群上的作业完成执行之后也是如此 我正在使用纱线簇模式。这是我的密码。还有什么需要做的吗 SparkLauncher launcher = new SparkLauncher() .setSp

我有一个web应用程序,它将使用spark launcher库在Cloudera spark cluster上提交spark作业

它正在将spark作业成功提交到群集。但是,它不会回调侦听器类方法,而且返回的
getState()
不会从“未知”更改,即使在集群上的作业完成执行之后也是如此

我正在使用
纱线簇
模式。这是我的密码。还有什么需要做的吗

SparkLauncher launcher = new SparkLauncher()
                           .setSparkHome("sparkhome")
                           .setMaster("yarn-cluster")
                           .setAppResource("spark job jar file")
                           .setMainClass("spark job driver class")
                           .setAppName("appname")
                           .addAppArgs(argsArray)
                           .setVerbose(true)
                           .addSparkArg("--verbose");

SparkAppHandle handle = launcher.startApplication(new LauncherListener());

int c = 0;
while(!handle.getState().isFinal()) {
  LOG.info(">>>>>>>> state is=  "+handle.getState() );
  LOG.info(">>>>>>>> state is not final yet. counter=  "+c++ );
  LOG.info(">>>>>>>> sleeping for a second");
  try {
    Thread.sleep(1000L);
  } catch (InterruptedException e) {
  }
  if(c == 200)
    break;
}
以下是我已经尝试过的东西:

  • 应用程序启动后,将侦听器实例添加到
    SparkAppHandle
  • 使当前类实现了
    SparkAppHandle.Listener
    ,并以两种方式传递它(
    this
    )(启动时,以及通过将其设置为
    SparkAppHandle
  • 尝试使用
    launcher.launch()
    方法,以便至少可以通过调用
    Process.waitFor()
    方法阻止生成的
    Process
    对象,直到spark作业在集群上运行完毕。但是,在这种情况下,对于长时间运行的spark作业,此节点上的相应进程永远不会返回(尽管对于在1或2分钟内完成的spark作业,它工作正常)

  • 我已经从spark用户邮件列表中得到了这个问题的答案。要使此功能正常工作,不仅spark launcher需要为1.6.0,而且基础spark至少应该为1.6.0


    我一直在使用spark 1.5.1和1.6.0版本的launcher库。现在,我已经将spark cluster更新到1.6.0版本,现在我得到了对方法的回调。

    在哪里可以解决这个问题?我在spark用户邮件列表上得到的答复是,基础spark至少需要1.6.0版本(我使用的是1.5.1)。一旦我成功地测试了它,我将把它作为一个答案发布。为了让它工作,我必须做些什么?我也面临同样的问题。应用程序立即退出,并获取appID和状态。如果我显式调用Thread.sleep()就可以工作。谢谢我面临的问题是根本无法获取state或appID。我认为,如果您想等待spark作业完成,可以放置一个循环,该循环将轮询句柄的状态,直到到达最终状态(
    handle.getState().isFinal()
    )。