是否可以从没有安装Spark的主机上启动Spark应用程序

时间:2017-10-05 05:53:36

标签: java apache-spark

我有一个远程主机设置了Spark独立实例(目前在同一台机器上有一个主服务器和一个服务器)。我还有具有spark-core依赖性的本地Java代码和带有实际Spark应用程序的打包jar。我尝试使用SparkLauncher类启动它,如其中的Javadoc所述。

这是依赖:

        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.10</artifactId>
        <version>${spark.version}</version>

以下是louncher的代码:

        new SparkLauncher()
            .setVerbose(true)
            .setDeployMode("cluster")
            .setSparkHome("/opt/spark/current").setAppResource(Resources.getResource("validation.jar").getPath())
            .setMainClass("com.blah.SparkTestApplication")
            .setMaster("spark://"  + sparkMasterHostWithPort))
            .startApplication();

我得到的错误是path not found /opt/spark/current/,如果我删除setSparkHome来电,则Spark home not found; set it explicitly or use the SPARK_HOME environment variable

这是我天真的问题:是否有任何解决方法允许我不在本地主机上安装Spark二进制文件,我只想运行Launcher?为什么依赖项中引用的Spark Java代码不能/不足以连接到某些已配置的远程Spark Master并提交应用程序jar?即使我将Spark二进制文件,应用程序代码以及甚至需要的Spark Java jar放到hdfs位置并使用其他部署方法(如​​YARN),仅仅使用Launcher触发提交并远程启动它就足够了吗?

原因是我想避免在多个客户端节点上安装Spark二进制文件,只是为了从那里提交和启动动态创建/修改的Spark应用程序,这对我来说听起来像是浪费。更不用说每次提交都需要在jar中打包应用程序。

1 个答案:

答案 0 :(得分:0)

简短的回答:您的客户端计算机上必须有spark二进制文件,并指向它的SPARK_HOME环境变量。

长答案:但是,如果要在远程集群上启动作业,则可以在spark作业中使用以下配置:

val spark = SparkSession.builder.master("yarn") 
.config("spark.submit.deployMode", "cluster")
.config("spark.driver.host", "remote.spark.driver.host.on.the.cluster") 
.config("spark.driver.port", "35000")
.config("spark.blockManager.port", "36000") 
.getOrCreate()

spark.driver.portspark.blockManager.port不是强制性的,但是如果您在封闭的环境(例如kubernetes网络)中工作,并且为Spark Client Pod定义了一些端口网关服务,则需要它们。

SparkLauncher的主设置中定义了远程主机将不起作用。您需要从集群获取hadoop配置,通常它位于集群节点上的/etc/hadoop/conf中。将hadoop config目录放置在客户端计算机上,并将HADOOP_CONF_DIR环境变量指向该计算机。这应该足以开始。