我已经编写了一个部署在unix机器上的小类,我似乎无法弄清楚为什么会出现这个错误。我检查了我的SPARK_HOME
并添加了所有必需的选项,如下面的课程所示。我试图把它写成监视最终运行的火花线程的方法。 Spark-submit工作完美,所以我知道环境的设置不是问题。
package com.james.SparkLauncher2;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.spark.launcher.SparkAppHandle;
import org.apache.spark.launcher.SparkLauncher;
public class SparkLauncher2
{
static final Logger LOGGER = Logger.getLogger(SparkLauncher2.class);
public static void main(String[] args) {
try {
LOGGER.info("In main of SparkLauncher2");
Map <String, String> env= new HashMap<>();
env.put( "SPARK_HOME", "/opt/cloudera/parcels/CDH-5.8.0-1.cdh5.8.0.p0.42/lib/spark");
env.put(" SPARK_LIBRARY_PATH", "/opt/cloudera/parcels/CDH-5.8.0-1.cdh5.8.0.p0.42/lib/spark/lib");
System.out.println("Environments setup correctly");
//pass in enviroment variables
SparkAppHandle sparkLauncher= new SparkLauncher(env)
.setAppResource("/home/james/fe.jar")
//This conf file works well with the spark submit so it shouldn't be source of the issue
.setPropertiesFile("/etc/spark/conf/spark-defaults.conf")
.setMainClass("com.james.SparkLauncher2.SparkLauncher2")
.setConf(SparkLauncher.DRIVER_MEMORY, "2g")
.setDeployMode("client")
.setVerbose(true)
.setConf("spark.yarn.keytab ","/home/james/my.keytab")
.setConf("spark.yarn.principal","somestring")
.setConf("spark.app.name ","SparkLauncher2") //add class name for example HbaseTest
.setConf("spark.jars","/home/james/flume-test.jar,/opt/cloudera/parcels/CDH-5.8.0-1.cdh5.8.0.p0.42/bin/test")
//call listener class to see if there is any state change
.startApplication(new MyListener());
sparkLauncher.stop();
//handle.stop();
} catch (IOException e) {
e.printStackTrace();
}
//this exception is what gets thrown
catch(Exception e){
LOGGER.info("General exception");
e.printStackTrace();
}
}
}
我把这个类主要用于检查状态的变化,但没有记录状态变化
class MyListener implements SparkAppHandle.Listener {
@Override
public void stateChanged(SparkAppHandle handle) {
System.out.println("state changed " + handle.getState());
}
@Override
public void infoChanged(SparkAppHandle handle) {
System.out.println("info changed " + handle.getState());
}
}
这是我检查目录的例外,所有这些似乎都是正确的。我甚至写了一个替代版本,其中所有内容都被硬编码到setConf方法中。显然没有启动火花工作。我也没有在UI上看到任何工作。 CommandBuilder类文档不清楚如何抛出此异常。出于上下文的目的,这是Java 7和spark 1.6
java.lang.IllegalStateException: Application is still not connected.
at org.apache.spark.launcher.CommandBuilderUtils.checkState(CommandBuilderUtils.java:249)
at org.apache.spark.launcher.ChildProcAppHandle.stop(ChildProcAppHandle.java:74)
at com.james.SparkLauncher2.SparkLauncher2.main(SparkLauncher2.java:43)
答案 0 :(得分:1)
感谢您的努力。首先,我是在错误的经过身份验证的用户下,并且--keyab和--principal缺失,因此没有因为kerberos问题而建立连接。请大家不要忘记配置发生的顺序很多!
答案 1 :(得分:0)
我最近使用SparkLauncher从Java应用程序启动Spark作业。有些事情需要提及:
/ ** *要求应用程序停止。这是最好的努力,因为 应用程序可能无法接收*或对命令执行操作。呼叫者 应该注意表明*的状态转换 应用程序已经停止了。 * /
此外,您可以通过将SPARK_PRINT_LAUNCH_COMMAND=true
设置为java环境来打印SparkLauncher将执行的命令,这样您就可以将其复制粘贴到命令行实用程序中并运行它。