spark-submit适用于纱线群集模式,但SparkLauncher不适用于相同的参数

问题描述 投票:0回答:1

我可以通过spark-submit提交spark工作但是当我尝试使用SparkLauncher以编程方式执行相同操作时,它什么也没给我(我甚至没有在UI上看到Spark工作)

以下是场景:

我有一个托管hdfs集群的服务器(比如主机名:cr-hdbc101.dev.local:7123)。我把一个胖罐子推到我试图执行的服务器上。以下spark-submit按预期工作,并以yarn-cluster模式提交spark作业

spark-submit \
      --verbose \
      --class com.digital.StartSparkJob \
      --master yarn \
      --deploy-mode cluster \
      --num-executors 2 \
      --driver-memory 2g \
      --executor-memory 3g \
      --executor-cores 4 \
      /usr/share/Deployments/Consolidateservice.jar "<arg_to_main>"

但是,以下SparkLauncher代码不起作用

val sparkLauncher = new SparkLauncher()
    sparkLauncher
      .setSparkHome("/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/spark")
      .setAppResource("/usr/share/Deployments/Consolidateservice.jar")
      .setMaster("yarn-cluster")
      .setVerbose(true)
      .setMainClass("com.digital.StartSparkJob")
      .setDeployMode("cluster")
      .setConf("spark.driver.cores", "2")
      .setConf("spark.driver.memory", "2g")
      .setConf("spark.executor.cores", "4")
      .setConf("spark.executor.memory", "3g")
      .addAppArgs(<arg_to_main>)
      .startApplication()

我想也许SparkLauncher没有得到正确的env变量,所以我将以下内容发送给SparkLauncher,但无济于事(基本上我将spark-env.sh中的所有内容传递给SparkLauncher)

val env: java.util.Map[String, String] = new java.util.HashMap[String, String]
    env.put("SPARK_CONF_DIR", "/etc/spark/conf.cloudera.spark_on_yarn")
    env.put("HADOOP_HOME", "/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop")
    env.put("YARN_CONF_DIR", "/etc/spark/conf.cloudera.spark_on_yarn/yarn-conf")
    env.put("SPARK_LIBRARY_PATH", "/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/spark/lib")
    env.put("SCALA_LIBRARY_PATH", "/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/spark/lib")
    env.put("LD_LIBRARY_PATH", "/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/hadoop/lib/native")
    env.put("SPARK_DIST_CLASSPATH", "/etc/spark/conf.cloudera.spark_on_yarn/classpath.txt")

    val sparkLauncher = new SparkLauncher(env)
    sparkLauncher
      .setSparkHome("/opt/cloudera/parcels/CDH-5.7.2-1.cdh5.7.2.p0.18/lib/spark")...

更令人沮丧的是,当我使用相同的SparkLauncher代码进行纱线客户端模式时,它可以完美地运行。

有人可以指点我,我错过了什么,我只是觉得我在没有认识到它的情况下盯着这个问题。

注意:主类(com.digital.StartSparkJob)和SparkLauncher代码都是我正在推送到服务器的胖jar的一部分。我只是使用外部API调用SparkLauncher代码,而外部API又应该在集群上打开驱动程序JVM

SparkVersion:1.6.0,规模远:2.10.5

apache-spark spark-submit spark-launcher
1个回答
0
投票

我甚至没有登录Spark-UI ...... sparkApp甚至没有运行。因此我将sparkLauncher作为一个进程运行(使用.launch()。waitFor()),以便我可以捕获错误日志。

我使用.getInputStream和.getErrorStream捕获了日志,发现传递给集群的用户是错误的。我的群集仅适用于用户“abcd”。

在启动SparkLauncher之前,我确实设置了System.setProperty(“HADOOP_USER_NAME”,“abcd”),并将“spark.yarn.appMasterEnv.HADOOP_USER_NAME = abcd”添加到spark-default.conf。但是看起来他们没有移植到集群。

因此,我将HADOOP_USER_NAME作为childArg传递给了SparkLauncher

val env: java.util.Map[String, String] = new java.util.HashMap[String, String]
    env.put("SPARK_CONF_DIR", "/etc/spark/conf.cloudera.spark_on_yarn")
    env.put("YARN_CONF_DIR", "/etc/spark/conf.cloudera.spark_on_yarn/yarn-conf")
    env.put("HADOOP_USER_NAME", "abcd")

try {
val sparkLauncher = new SparkLauncher(env)...
© www.soinside.com 2019 - 2024. All rights reserved.