spark-submit работает в режиме кластера пряжи, а SparkLauncher - с теми же параметрами - PullRequest
0 голосов
/ 22 марта 2019

Я могу отправить задание spark через spark-submit, однако, когда я пытаюсь сделать то же самое программно с помощью SparkLauncher, это ничего не дает (я даже не вижу задание Spark в пользовательском интерфейсе)

Ниже приведен сценарий:

У меня есть сервер (скажем, имя хоста: cr-hdbc101.dev.local: 7123), на котором размещен кластер hdfs.Я помещаю толстую банку на сервер, который пытаюсь выполнить.Следующая искробезопасная отправка работает должным образом, и задание зажигания отправляется в режиме кластера пряжи

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 являются частью жирной банки, которую я отправляю на сервер.Я просто вызываю код SparkLauncher с помощью внешнего API, который, в свою очередь, должен открывать JVM драйвера на кластере

SparkVersion: 1.6.0, scala ver: 2.10.5

1 Ответ

0 голосов
/ 26 марта 2019

Я даже не получал логи в Spark-UI ... sparkApp даже не работал. Поэтому я запустил sparkLauncher как процесс (используя .launch (). WaitFor ()), чтобы я мог перехватить журналы ошибок.

Я захватил журналы, используя .getInputStream и .getErrorStream, и обнаружил, что пользователь, передаваемый в кластер, неверен. Мой кластер будет работать только для пользователя "abcd".

Я установил System.setProperty ("HADOOP_USER_NAME", "abcd"), а также добавил "spark.yarn.appMasterEnv.HADOOP_USER_NAME = abcd" в spark-default.conf перед запуском SparkLauncher. Однако похоже, что они не переносятся в кластер.

Поэтому я передал 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)...
...