Развернуть приложение драйвера искры без отправки искры

Предположим, у нас есть программа драйвера искры, написанная следующим образом:

public class SimpleApp {
  public static void main(String[] args) {
    String logFile = "YOUR_SPARK_HOME/README.md"; // Should be some file on your system
    SparkConf conf = new SparkConf().setAppName("Simple Application");
    JavaSparkContext sc = new JavaSparkContext(conf);
    JavaRDD<String> logData = sc.textFile(logFile).cache();

    long numAs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("a"); }
    }).count();

    long numBs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("b"); }
    }).count();

    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
  }
}

и я хочу работать в кластере пряжи, могу ли я избежать использования spark-submit и (при условии, конечно, что у меня есть доступ к одному узлу кластера), просто указав в контексте, что я хочу запустить на пряже? Другими словами, можно ли запустить искровой клиент как обычное java-приложение, использующее пряжу?


person Felice Pollano    schedule 09.09.2016    source источник
comment
Если написано на Scala, я знаю, что вы можете просто использовать spark-shell -i file.scala --master yarn-client. Я не думаю, что Java поддерживает это, хотя   -  person OneCricketeer    schedule 09.09.2016


Ответы (4)


Вот еще один официальный способ сделать это.

Spark Launcher — библиотека для запуска приложений Spark.

Эта библиотека позволяет приложениям программно запускать Spark. В библиотеку есть только одна точка входа — класс SparkLauncher.

Чтобы запустить приложение Spark, просто создайте экземпляр SparkLauncher и настройте приложение для запуска. Например:

 import org.apache.spark.launcher.SparkLauncher;

   public class MyLauncher {
     public static void main(String[] args) throws Exception {
       Process spark = new SparkLauncher()
         .setAppResource("/my/app.jar")
         .setMainClass("my.spark.app.Main")
         .setMaster("local")
         .setConf(SparkLauncher.DRIVER_MEMORY, "2g")
         .launch();
       spark.waitFor();
     }
   }

Вы можете установить всю специфичную для YARN конфигурацию с помощью метода setConf и установить мастер на yarn-client или yarn-cluster.

Ссылки: https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/launcher/package-summary.html

person Rakesh Rakshit    schedule 09.09.2016

Из сообщения в блоге Hortonworks< /а>:

1) Скопируйте JAR сборки Spark в HDFS

По умолчанию файл jar сборки spark недоступен в HDFS. Для удаленного доступа он нам понадобится.

Некоторые стандартные местоположения в HDP:

HDP 2.3.2:
    Version: 2.3.2.0-2950
    Spark Jar: /usr/hdp/2.3.2.0-2950/spark/lib/spark-assembly-1.4.1.2.3.2.0-2950-hadoop2.7.1.2.3.2.0-2950.jar
HDP 2.4.0:
    Version: 2.4.0.0-169
    Spark Jar: /usr/hdp/2.4.0.0-169/spark/lib/spark-assembly-1.6.0.2.4.0.0-169-hadoop2.7.1.2.4.0.0-169.jar

Это одноразовый этап подготовки, например, для HDP 2.4 это будет:

sudo su - hdfs
HDP_VERSION=2.4.0.0-169
SPARK_JAR=spark-assembly-1.6.0.2.4.0.0-169-hadoop2.7.1.2.4.0.0-169.jar
hdfs dfs -mkdir "/hdp/apps/${HDP_VERSION}/spark/"
hdfs dfs -put "/usr/hdp/${HDP_VERSION}/spark/lib/$SPARK_JAR" "/hdp/apps/${HDP_VERSION}/spark/spark-hdp-assembly.jar"

2) Загрузите файл jar приложения spark в HDFS

Загрузите файл jar приложения spark, упакованный sbt, в папку проекта в HDFS через WebHdfs (возможно, используйте что-то лучше, чем «/tmp»):

export APP_FILE=simple-project_2.10-1.0.jar
curl    -X PUT "${WEBHDFS_HOST}:50070/webhdfs/v1/tmp/simple-project?op=MKDIRS"
curl -i -X PUT "${WEBHDFS_HOST}:50070/webhdfs/v1/tmp/simple-project/${APP_FILE}?op=CREATE&overwrite=true"
# take Location header from the response and issue a PUT request
LOCATION="http://..."
curl -i -X PUT -T "target/scala-2.10/${APP_FILE}" "${LOCATION}"

3) Создайте файл свойств spark и загрузите его в HDFS

spark.yarn.submit.file.replication=3
spark.yarn.executor.memoryOverhead=384
spark.yarn.driver.memoryOverhead=384
spark.master=yarn
spark.submit.deployMode=cluster
spark.eventLog.enabled=true
spark.yarn.scheduler.heartbeat.interval-ms=5000
spark.yarn.preserve.staging.files=true
spark.yarn.queue=default
spark.yarn.containerLauncherMaxThreads=25
spark.yarn.max.executor.failures=3
spark.executor.instances=2
spark.eventLog.dir=hdfs\:///spark-history
spark.history.kerberos.enabled=true
spark.history.provider=org.apache.spark.deploy.history.FsHistoryProvider
spark.history.ui.port=18080
spark.history.fs.logDirectory=hdfs\:///spark-history
spark.executor.memory=2G
spark.executor.cores=2
spark.history.kerberos.keytab=none
spark.history.kerberos.principal=none

и загрузите его через WebHDFS как spark-yarn.properties в папку простого проекта, как и раньше.

4) Создайте JSON-файл задания Spark

a) Нам нужно создать команду для запуска Spark ApplicationMaster:

java -server -Xmx1024m -Dhdp.version=2.4.0.0-169 \
     -Dspark.yarn.app.container.log.dir=/hadoop/yarn/log/rest-api \
     -Dspark.app.name=SimpleProject \
     org.apache.spark.deploy.yarn.ApplicationMaster \
     --class IrisApp --jar __app__.jar \
     --arg '--class' --arg 'SimpleProject' \
     1><LOG_DIR>/AppMaster.stdout 2><LOG_DIR>/AppMaster.stderr

Важно указать имя приложения Spark и версию HDP. Искра разрешит

b) Нам нужно установить некоторые общие переменные среды

JAVA_HOME="/usr/jdk64/jdk1.8.0_60/"
SPARK_YARN_MODE=true
HDP_VERSION="2.4.0.0-169" 

Затем нам нужно сообщить Spark, какие файлы следует распространять среди всех исполнителей Spark. Поэтому нам нужно установить 4 переменные. Одна переменная имеет формат "#,#,...", а три других содержат временные метки, разделенные запятыми, размеры файлов и видимость каждого файла (в том же порядке):

SPARK_YARN_CACHE_FILES: "hdfs://<<name-node>>:8020/tmp/simple-project/simple-project.jar#__app__.jar,hdfs://<<name-node>>:8020/hdp/apps/2.4.0.0-169/spark/spark-hdp-assembly.jar#__spark__.jar"
SPARK_YARN_CACHE_FILES_FILE_SIZES: "10588,191724610"
SPARK_YARN_CACHE_FILES_TIME_STAMPS: "1460990579987,1460219553714"
SPARK_YARN_CACHE_FILES_VISIBILITIES: "PUBLIC,PRIVATE"

Замените ‹> правильным адресом. Размер файла и метку времени можно получить из HDFS через WebHDFS.

Затем создайте путь к классам

CLASSPATH="{{PWD}}<CPS>__spark__.jar<CPS>{{PWD}}/__app__.jar<CPS>{{PWD}}/__app__.properties<CPS>{{HADOOP_CONF_DIR}}<CPS>/usr/hdp/current/hadoop-client/*<CPS>/usr/hdp/current/hadoop-client/lib/*<CPS>/usr/hdp/current/hadoop-hdfs-client/*<CPS>/usr/hdp/current/hadoop-hdfs-client/lib/*<CPS>/usr/hdp/current/hadoop-yarn-client/*<CPS>/usr/hdp/current/hadoop-yarn-client/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/common/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/common/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/yarn/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/yarn/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/hdfs/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/hdfs/lib/*<CPS>{{PWD}}/mr-framework/hadoop/share/hadoop/tools/lib/*<CPS>/usr/hdp/2.4.0.0-169/hadoop/lib/hadoop-lzo-0.6.0.2.4.0.0-169.jar<CPS>/etc/hadoop/conf/secure<CPS>"

Примечания: - spark.jar и app.jar совпадают с файлами SPARK_YARN_CACHE_FILES.

  • Spark разрешит :

c) Создайте JSON-файл задания Spark

Приведенная выше информация будет добавлена ​​в файл Spark json в качестве атрибута команды и среды (подробности см. во вложении — удалите окончание .txt)

Последней недостающей частью являются так называемые local_resources, которые описывают все файлы в HDFS, необходимые для задания Spark: - JAR сборки Spark (как в переменной среды кэширования) - JAR приложения Spark для этого проекта (как в переменной среды кэширования) - Spark файл свойств для этого проекта (только для Application Master, кэширование не требуется)

Все три должны быть представлены в форме

{
  "key": "__app__.jar", 
  "value": {
    "resource": "hdfs://<<name-node>>:8020/tmp/simple-project/simple-project.jar", 
    "size": 10588, 
    "timestamp": 1460990579987, 
    "type": "FILE", 
    "visibility": "APPLICATION"
  }
}, 

Снова замените ‹>. Временная метка, путь hdfs, размер и ключ должны быть такими же, как и для переменных среды кэширования.

Сохраните его как spark-yarn.json (подробности см. во вложении — удалите окончание .txt)

5) Отправить задание

Сначала запросите идентификатор приложения из YARN.

curl -s -X POST -d '' \
     https://$KNOX_SERVER:8443/gateway/default/resourcemanager/v1/cluster/apps/new-application
# {
#   "application-id": "application_1460195242962_0054",
#   "maximum-resource-capability": {
#     "memory": 8192,
#     "vCores": 3
#   } 
# }

Отредактируйте «идентификатор приложения» в spark-yarn.json, а затем отправьте задание:

curl -s -i -X POST -H "Content-Type: application/json" ${HADOOP_RM}/ws/v1/cluster/apps \
     --data-binary spark-yarn.json 
# HTTP/1.1 100 Continue
# 
# HTTP/1.1 202 Accepted
# Cache-Control: no-cache
# Expires: Sun, 10 Apr 2016 13:02:47 GMT
# Date: Sun, 10 Apr 2016 13:02:47 GMT
# Pragma: no-cache
# Expires: Sun, 10 Apr 2016 13:02:47 GMT
# Date: Sun, 10 Apr 2016 13:02:47 GMT
# Pragma: no-cache
# Content-Type: application/json
# Location: http://<<resource-manager>>:8088/ws/v1/cluster/apps/application_1460195242962_0054
# Content-Length: 0
# Server: Jetty(6.1.26.hwx)

См. также полезный помощник по Python от автора сообщения в блоге в этом проекте gitlab.

person Rakesh Rakshit    schedule 09.09.2016
comment
Это выглядит намного сложнее, чем просто использование spark-submit. В любом случае JAR необходимо построить. - person OneCricketeer; 09.09.2016
comment
@cricket_007 именно поэтому spark-submit скрывает все эти сложности и делает всю работу за вас. - person Rakesh Rakshit; 09.09.2016
comment
@cricket_007 cricket_007 Я добавил ответ, в котором вы можете использовать библиотеку запуска искр. - person Rakesh Rakshit; 09.09.2016
comment
Привет, @RakeshRakshit, похоже, ты только что скопировал большую часть этого контента из блога. Я отредактировал ваше сообщение, чтобы указать авторство. Плагиат не очень приветствуется в Stack Overflow, и всегда приятно отдать должное там, где это необходимо. Тем не менее спасибо за этот ответ! - person Rick Moritz; 30.01.2018

Смотрите эти проекты:

https://github.com/cloudera/livy

https://github.com/spark-jobserver/spark-jobserver

Оба просты в использовании и предоставляют интерфейс отдыха для развертывания и запуска приложения spark.

person Ganchix    schedule 09.09.2016

Вы должны посмотреть на org.apache.spark.deploy.yarn.Client, который предоставляет API, который вы хотите использовать. Он позволяет вам определить SparkConf аргументы командной строки, а затем отправляет соответствующее задание в Yarn, используя метод run().

Я подозреваю, что это то, чего вы хотите достичь.

Я нашел следующие tutorial в другом вопросе, в котором приводится краткий практический пример.

Кроме того, вот еще один запись в блоге, освещающая проблему.

А это исходный код для справки, так как API точно не задокументирован.

person Rick Moritz    schedule 16.05.2017
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Doron Yakovlev-Golani; 16.05.2017
comment
@DoronYakovlev-Golani спасибо за подсказку, я добавил основную информацию, а также предоставил дополнительные ссылки, которые должны служить отправной точкой. - person Rick Moritz; 16.05.2017