Spark 启动器句柄和侦听器未提供状态
Spark launcher handle and listener not giving state
我有一个 Web 应用程序,它将使用 spark 启动器库在 Cloudera spark 集群上提交 spark 作业。
正在成功将 spark 作业提交到集群。但是,它不会回调侦听器 class 方法,而且返回的 SparkAppHandle 上的 getState()
也不会从 "UNKNOWN" 改变,即使作业在集群上完成执行后也是如此。
我正在使用 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
。
- 使当前的 class 实现
SparkAppHandle.Listener
并以两种方式传递它 (this
)(在启动时,并通过在 SparkAppHandle
上设置它)
- 尝试使用
launcher.launch()
方法,这样至少我可以通过调用 process.waitFor()
方法阻止生成的 Process
对象,直到 spark 作业在集群上完成 运行。然而在这种情况下,对于长 运行 的火花作业,此节点上的相应进程永远不会 returns(尽管它适用于在 1 或 2 分钟内完成的火花作业)
我已经从 spark 用户邮件列表中得到了这个问题的答案。要使此功能正常工作,不仅 spark launcher 需要是 1.6.0,而且底层 spark 至少应该是 1.6.0。
我一直在使用 spark 1.5.1 和 1.6.0 版本的启动器库。现在我已经将 spark 集群更新到 1.6.0 版本,现在我得到了 listener 方法的回调。
我有一个 Web 应用程序,它将使用 spark 启动器库在 Cloudera spark 集群上提交 spark 作业。
正在成功将 spark 作业提交到集群。但是,它不会回调侦听器 class 方法,而且返回的 SparkAppHandle 上的 getState()
也不会从 "UNKNOWN" 改变,即使作业在集群上完成执行后也是如此。
我正在使用 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
。 - 使当前的 class 实现
SparkAppHandle.Listener
并以两种方式传递它 (this
)(在启动时,并通过在SparkAppHandle
上设置它) - 尝试使用
launcher.launch()
方法,这样至少我可以通过调用process.waitFor()
方法阻止生成的Process
对象,直到 spark 作业在集群上完成 运行。然而在这种情况下,对于长 运行 的火花作业,此节点上的相应进程永远不会 returns(尽管它适用于在 1 或 2 分钟内完成的火花作业)
我已经从 spark 用户邮件列表中得到了这个问题的答案。要使此功能正常工作,不仅 spark launcher 需要是 1.6.0,而且底层 spark 至少应该是 1.6.0。
我一直在使用 spark 1.5.1 和 1.6.0 版本的启动器库。现在我已经将 spark 集群更新到 1.6.0 版本,现在我得到了 listener 方法的回调。