【发布时间】:2016-11-08 13:10:10
【问题描述】:
我有一个 Web 应用程序,它将使用 spark 启动器库在 Cloudera 火花集群上提交火花作业。
已成功将 Spark 作业提交到集群。但是,即使在集群上的作业完成执行后,它也不会回调侦听器类方法,并且返回的 SparkAppHandle 上的 getState() 永远不会从“未知”更改。
我正在使用yarn-cluster 模式。这是我的代码。还有什么需要做的吗?
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 至少需要 1.6.0 版本(我使用的是 1.5.1)。一旦我成功测试它,我会将它作为答案发布。
标签: apache-spark spark-launcher