《深入理解Spark》之通过java调用shell启动spark

背景:

今天公司对于spark做了一个管理平台能实现一站式管理,即远程启动,远程关闭,并监控运行时的数据状态,而且监控平台和spark集群并不在同一个集群上,在同一个局域网内(机器之间做好了免密登录)

当然java调用shell脚本并不是本文的重点,推荐使用下面的方式

     public static void test3(){
	    //1.sh是要执行要脚本文件,A指的是参数,这个一个可变参可以通过shell的$1去接收这个参数
        ProcessBuilder pb = new ProcessBuilder("./1.sh","A");
		///Users/frank/Desktop/  表示shell脚本文件的路径
        pb.directory(new File("/Users/frank/Desktop/"));
        try {
            Process p = pb.start();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String s;
			//打印信息,这样可以做到和linux命令行一样的效果!例如cat xxx.txt时可以获取这个文件的内容
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }
            int runningStatus = p.waitFor();
            System.out.println(">>> "+runningStatus);
        }catch(IOException e) {
            e.printStackTrace();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }public static void test3(){
	    //1.sh是要执行要脚本文件,A指的是参数,这个一个可变参可以通过shell的$1去接收这个参数
        ProcessBuilder pb = new ProcessBuilder("./1.sh","A");
		///Users/frank/Desktop/  表示shell脚本文件的路径
        pb.directory(new File("/Users/frank/Desktop/"));
        try {
            Process p = pb.start();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String s;
			//打印信息,这样可以做到和linux命令行一样的效果!例如cat xxx.txt时可以获取这个文件的内容
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }
            int runningStatus = p.waitFor();
            System.out.println(">>> "+runningStatus);
        }catch(IOException e) {
            e.printStackTrace();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }

当1.sh中使用spark-submit时你会发现没有这个命令,而使用命令行时是可以启动这个spark程序的,这是怎么回事呢?

原来当java调用shell脚本时,linux系统默认使用的是/bin目录下的shell,所有即使你配置了环境变量,此时也找不到,所以,知道了原理就动手解决问题,把spark.../bin下的文件ln到/bin目录下

再运行,发现这个命令时可以找到了,但是又有下面的问题(找不到路径)

按照提示的路径一层一层往下找,如果没有就创建,

创建完jars文件夹后继续运行,有发现新的错误!(加载不到主类)

此时只要把spark.../jars下的jar包拷贝或者ln连接到这个目录下即可,注意使用软连接

再启动试试,发现一切ok了!

你可能感兴趣的:(Spark)