SparkLauncher没有启动应用程序

时间:2017-07-25 09:19:23

标签: java apache-spark

我已经编写了一个部署在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)

2 个答案:

答案 0 :(得分:1)

感谢您的努力。首先,我是在错误的经过身份验证的用户下,并且--keyab和--principal缺失,因此没有因为kerberos问题而建立连接。请大家不要忘记配置发生的顺序很多!

答案 1 :(得分:0)

我最近使用SparkLauncher从Java应用程序启动Spark作业。有些事情需要提及:

  • 不确定它是否会被SparkLauncher考虑到SPARK_LIBRARY_PATH(我在代码中没有看到它被使用)
  • 对于部署模式不会是你的客户端火花1.6版本?
  • 我不会立即调用stop()方法,如文档
  • 所示
  

/ ** *要求应用程序停止。这是最好的努力,因为   应用程序可能无法接收*或对命令执行操作。呼叫者   应该注意表明*的状态转换   应用程序已经停止了。 * /

此外,您可以通过将SPARK_PRINT_LAUNCH_COMMAND=true设置为java环境来打印SparkLauncher将执行的命令,这样您就可以将其复制粘贴到命令行实用程序中并运行它。