[Документация Yandex Cloud](../../index.md) > [Yandex Data Processing](../index.md) > [Практические руководства](index.md) > Работа с заданиями > Запуск заданий с удаленного хоста

# Запуск заданий с удаленных хостов, не входящих в кластер Yandex Data Processing

В этом руководстве показывается, как с помощью [утилиты spark-submit](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications) запускать Spark-задания в кластере Yandex Data Processing с хостов, не входящих в кластер Yandex Data Processing.

{% note info %}

Задания в кластере Yandex Data Processing также можно запускать из Yandex DataSphere. Подробнее в [концепции](../../datasphere/concepts/data-processing.md#existing-clusters).

{% endnote %}

Чтобы выполнить задания с удаленных хостов, не входящих в кластер:

1. [Подготовьте инфраструктуру](#infra).
1. [Запустите задания](#spark-submit).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).


## Перед началом работы {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://kz.console.yandex.cloud/billing)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).


### Необходимые платные ресурсы {#paid-resources}

* Кластер Yandex Data Processing: использование вычислительных ресурсов с наценкой за сервис Yandex Data Processing, использование сетевых дисков, получение и хранение логов, объем исходящего трафика ([тарифы Yandex Data Processing](../pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Yandex Virtual Private Cloud](../../vpc/pricing.md)).
* Виртуальная машина: использование вычислительных ресурсов, хранилища, публичного IP-адреса и операционной системы ([тарифы Yandex Compute Cloud](../../compute/pricing.md)).


## Подготовьте инфраструктуру {#infra}

Создайте и настройте хост для удаленного запуска заданий на кластере Yandex Data Processing:

{% list tabs %}

- Версия образа 1.4

  1. [Создайте кластер Yandex Data Processing](../operations/cluster-create.md).
  1. [Создайте виртуальную машину](../../compute/operations/vm-create/create-linux-vm.md) с операционной системой Ubuntu 16.04 LTS.
  1. Чтобы обеспечить сетевой доступ к кластеру Yandex Data Processing с созданной ВМ, [настройте группы безопасности](../operations/security-groups.md) кластера.
  1. [Подключитесь](../../compute/operations/vm-connect/ssh.md#vm-connect) к ВМ по [SSH](../../glossary/ssh-keygen.md):

      ```bash
      ssh -A <имя_пользователя>@<FQDN_ВМ>
      ```

  1. Скопируйте настройки репозитория с любого из хостов кластера Yandex Data Processing. Для этого выполните последовательность команд на созданной виртуальной машине.
     1. Скопируйте адрес репозитория:

        ```bash
        ssh root@<FQDN_хоста_кластера> \
        "cat /etc/apt/sources.list.d/yandex-dataproc.list" | \
        sudo tee /etc/apt/sources.list.d/yandex-dataproc.list
        ```

     1. Скопируйте gpg-ключ для верификации подписей deb-пакетов:

        ```bash
        ssh root@<FQDN_хоста_кластера> \
        "cat /srv/dataproc.gpg" | sudo apt-key add -
        ```

     1. Обновите кеш репозиториев:

        ```bash
        sudo apt update
        ```

  1. Установите необходимые пакеты:

     ```bash
     sudo apt install openjdk-8-jre-headless hadoop-client hadoop-hdfs spark-core spark-python
     ```

     {% note info %}

     Пакет `spark-python` необходим только для запуска заданий PySpark.

     {% endnote %}

  1. Скопируйте конфигурационные файлы Hadoop и Spark:

     ```bash
     sudo -E scp -r \
         root@<FQDN_хоста_кластера>:/etc/hadoop/conf/* \
         /etc/hadoop/conf/ && \
     sudo -E scp -r \
         root@<FQDN_хоста_кластера>:/etc/spark/conf/* \
         /etc/spark/conf/
     ```

  1. Создайте пользователя `sparkuser`, от имени которого будут запускаться задания:

     ```bash
     sudo useradd sparkuser && \
     ssh root@<FQDN_хоста_кластера> "
       hadoop fs -mkdir /user/sparkuser
       sudo -u hdfs hdfs dfs -chown sparkuser:sparkuser /user/sparkuser
       sudo -u hdfs hdfs dfs -ls /user/sparkuser
     "
     ```

- Версия образа 2.0

  1. [Создайте кластер Yandex Data Processing](../operations/cluster-create.md).
  1. [Создайте виртуальную машину](../../compute/operations/vm-create/create-linux-vm.md) с операционной системой Ubuntu 20.04 LTS.
  1. Чтобы обеспечить сетевой доступ к кластеру Yandex Data Processing с созданной ВМ, [настройте группы безопасности](../operations/security-groups.md) кластера.
  1. [Подключитесь](../../compute/operations/vm-connect/ssh.md#vm-connect) к ВМ по [SSH](../../glossary/ssh-keygen.md):

     ```bash
     ssh -A <имя_пользователя>@<FQDN_ВМ>
     ```

  1. Скопируйте настройки репозитория с любого из хостов кластера Yandex Data Processing. Для этого выполните последовательность команд на созданной виртуальной машине.
     1. Скопируйте адрес репозитория:

        ```bash
        ssh ubuntu@<FQDN_хоста_кластера> \
        "cat /etc/apt/sources.list.d/yandex-dataproc.list" | \
        sudo tee /etc/apt/sources.list.d/yandex-dataproc.list
        ```

     1. Скопируйте gpg-ключ для верификации подписей deb-пакетов:

        ```bash
        ssh ubuntu@<FQDN_хоста_кластера> \
        "cat /srv/dataproc.gpg" | sudo apt-key add -
        ```

     1. Обновите кеш репозиториев:

        ```bash
        sudo apt update
        ```

  1. Установите необходимые пакеты:

     ```bash
     sudo apt install openjdk-8-jre-headless hadoop-client hadoop-hdfs spark-core spark-python
     ```

     {% note info %}

     Пакет `spark-python` необходим только для запуска заданий PySpark.

     {% endnote %}

  1. Скопируйте конфигурационные файлы Hadoop и Spark:

     ```bash
     sudo -E scp -r \
         ubuntu@<FQDN_хоста_кластера>:/etc/hadoop/conf/* \
         /etc/hadoop/conf/ && \
     sudo -E scp -r \
         ubuntu@<FQDN_хоста_кластера>:/etc/spark/conf/* \
         /etc/spark/conf/
     ```

  1. Создайте пользователя `sparkuser`, от имени которого будут запускаться задания:

     ```bash
     sudo useradd sparkuser && \
     ssh ubuntu@<FQDN_хоста_кластера> "
       hadoop fs -mkdir /user/sparkuser
       sudo -u hdfs hdfs dfs -chown sparkuser:sparkuser /user/sparkuser
       sudo -u hdfs hdfs dfs -ls /user/sparkuser
     "
     ```

{% endlist %}

## Запуск задания {#spark-submit}

{% list tabs %}

- Spark-задание

  1. Запустите задание с помощью команды:

     ```bash
     sudo -u sparkuser spark-submit \
          --master yarn \
          --deploy-mode cluster \
          --class org.apache.spark.examples.SparkPi \
              /usr/lib/spark/examples/jars/spark-examples.jar 1000
     ```

     Результат:

     ```text
     20/04/19 16:43:58 INFO client.RMProxy: Connecting to ResourceManager at rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz/  10.13.13.18:8032
     20/04/19 16:43:58 INFO client.AHSProxy: Connecting to Application History server at rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz/10.13.13.18:10200
     20/04/19 16:43:58 INFO yarn.Client: Requesting a new application from cluster with 4 NodeManagers
     ...
     20/04/19 16:43:58 INFO yarn.Client: Preparing resources for our AM container
     20/04/19 16:43:58 INFO yarn.Client: Uploading resource file:/usr/lib/spark/examples/jars/spark-examples.jar -> hdfs://  rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz/user/sparkuser/.sparkStaging/application_1586176069782_0003/  spark-examples.jar
     20/04/19 16:43:58 INFO yarn.Client: Uploading resource file:/etc/spark/conf/hive-site.xml -> hdfs://  rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz/user/sparkuser/.sparkStaging/application_1586176069782_0003/hive-site.  xml
     20/04/19 16:43:58 INFO yarn.Client: Uploading resource file:/tmp/spark-6dff3163-089b-4634-8f74-c8301d424567/  __spark_conf__8717606866210190000.zip -> hdfs://rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz/user/sparkuser/.  sparkStaging/application_1586176069782_0003/__spark_conf__.zip
     20/04/19 16:44:00 INFO yarn.Client: Submitting application application_1586176069782_0003 to ResourceManager
     20/04/19 16:44:00 INFO impl.YarnClientImpl: Submitted application application_1586176069782_0003
     20/04/19 16:44:01 INFO yarn.Client: Application report for application_1586176069782_0003 (state: ACCEPTED)
     20/04/19 16:44:01 INFO yarn.Client:
        client token: N/A
        diagnostics: AM container is launched, waiting for AM container to Register with RM
        ApplicationMaster host: N/A
        ApplicationMaster RPC port: -1
        queue: default
        start time: 1587314639386
        final status: UNDEFINED
        tracking URL: http://rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz:8088/proxy/application_1586176069782_0003/
        user: sparkuser
     20/04/19 16:44:05 INFO yarn.Client: Application report for application_1586176069782_0003 (state: RUNNING)
     20/04/19 16:44:05 INFO yarn.Client:
        client token: N/A
        diagnostics: N/A
        ApplicationMaster host: rc1b-dataproc-d-9cd9yoenm4npsznt.mdb.yandexcloud.kz
        ApplicationMaster RPC port: 41648
        queue: default
        start time: 1587314639386
        final status: UNDEFINED
        tracking URL: http://rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz:8088/proxy/application_1586176069782_0003/
        user: sparkuser
     20/04/19 16:44:06 INFO yarn.Client: Application report for application_1586176069782_0003 (state: RUNNING)
     20/04/19 16:44:07 INFO yarn.Client: Application report for application_1586176069782_0003 (state: RUNNING)
     20/04/19 16:44:08 INFO yarn.Client: Application report for application_1586176069782_0003 (state: RUNNING)
     20/04/19 16:44:09 INFO yarn.Client: Application report for application_1586176069782_0003 (state: FINISHED)
     20/04/19 16:44:09 INFO yarn.Client:
        client token: N/A
        diagnostics: N/A
        ApplicationMaster host: rc1b-dataproc-d-9cd9yoenm4npsznt.mdb.yandexcloud.kz
        ApplicationMaster RPC port: 41648
        queue: default
        start time: 1587314639386
        final status: SUCCEEDED
        tracking URL: http://rc1b-dataproc-m-ds7lj5gnnnqggbqd.mdb.yandexcloud.kz:8088/proxy/application_1586176069782_0003/
        user: sparkuser
     20/04/19 16:44:09 INFO util.ShutdownHookManager: Shutdown hook called
     20/04/19 16:44:09 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-6dff3163-089b-4634-8f74-c8301d424567
     20/04/19 16:44:09 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-826498b1-8dec-4229-905e-921203b7b1d0
     ```

  1. Проверьте статус выполнения с помощью утилиты [yarn application](https://hadoop.apache.org/docs/r2.10.0/hadoop-yarn/hadoop-yarn-site/YarnCommands.html#application):

     ```bash
     yarn application -status application_1586176069782_0003
     ```

     Результат:

     ```text
     20/04/19 16:47:03 INFO client.RMProxy: Connecting to ResourceManager at rc1b-dataproc-m-ds7lj5gn********.mdb.yandexcloud.kz/10.13.13.18:8032
     20/04/19 16:47:03 INFO client.AHSProxy: Connecting to Application History server at rc1b-dataproc-m-ds7lj5gn********.mdb.yandexcloud.kz/10.13.13.18:10200
     Application Report :
         Application-Id : application_1586176069782_0003
         Application-Name : org.apache.spark.examples.SparkPi
         Application-Type : SPARK
         User : sparkuser
         Queue : default
         Application Priority : 0
         Start-Time : 1587314639386
         Finish-Time : 1587314647621
         Progress : 100%
         State : FINISHED
         Final-State : SUCCEEDED
         Tracking-URL : rc1b-dataproc-m-ds7lj5gn********.mdb.yandexcloud.kz:18080/history/application_1586176069782_0003/1
         RPC Port : 41648
         AM Host : rc1b-dataproc-d-9cd9yoen********.mdb.yandexcloud.kz
         Aggregate Resource Allocation : 141510 MB-seconds, 11 vcore-seconds
         Aggregate Resource Preempted : 0 MB-seconds, 0 vcore-seconds
         Log Aggregation Status : SUCCEEDED
         Diagnostics :
         Unmanaged Application : false
         Application Node Label Expression : <Not set>
         AM container Node Label Expression : <DEFAULT_PARTITION>
         TimeoutType : LIFETIME    ExpiryTime : UNLIMITED    RemainingTime : -1seconds
     ```

  1. Просмотрите журналы со всех запущенных контейнеров с помощью утилиты [yarn logs](https://hadoop.apache.org/docs/r2.10.0/hadoop-yarn/hadoop-yarn-site/YarnCommands.html#logs):

     ```bash
     sudo -u sparkuser yarn logs \
          -applicationId application_1586176069782_0003 | grep "Pi is"
     ```

     Результат:

     ```text
     Pi is roughly 3.14164599141646
     ```

- PySpark-задание

  1. На виртуальной машине создайте файл `month_stat.py` со следующим кодом:

     ```python
     import sys

     from pyspark import SparkContext, SparkConf
     from pyspark.sql import SQLContext

     def main():
         conf = SparkConf().setAppName("Month Stat - Python")
         conf.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider")
         sc = SparkContext(conf=conf)

         sql = SQLContext(sc)
         df = sql.read.parquet("s3a://yc-mdb-examples/dataproc/example01/set01")
         defaultFS = sc._jsc.hadoopConfiguration().get("fs.defaultFS")
         month_stat = df.groupBy("Month").count()
         month_stat.repartition(1).write.format("csv").save(defaultFS+"/tmp/month_stat")

     if __name__ == "__main__":
             main()
     ```

  1. Скопируйте файл `month_stat.py` на хосте-мастере кластера:

     ```bash
     sudo -E scp month_stat.py <имя_пользователя>@<FQDN_хоста_кластера>:~/month_stat.py
     ```

     Для образа 2.0 укажите пользователя `ubuntu`, для образа 1.4 — `root`.

  1. Запустите приложение:

     ```bash
     sudo -u sparkuser spark-submit \
          --master yarn \
          --deploy-mode cluster \
          month_stat.py
     ```

  1. Результат работы приложения будет выгружен в HDFS на кластере. Список получившихся файлов можно вывести командой:

     ```bash
     ssh <имя_пользователя>@<FQDN_хоста_кластера> "hdfs dfs -ls /tmp/month_stat"
     ```

     Для образа 2.0 укажите пользователя `ubuntu`, для образа 1.4 — `root`.

{% endlist %}

{% note info %}

Вы можете просматривать логи выполнения заданий и искать в них информацию с помощью сервиса [Yandex Cloud Logging](../../logging/index.md). Подробнее в разделе [Работа с логами](../operations/logging.md).

{% endnote %}


## Удалите созданные ресурсы {#clear-out}

Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:

1. [Удалите кластер Yandex Data Processing](../operations/cluster-delete.md).
1. [Удалите виртуальную машину](../../compute/operations/vm-control/vm-delete.md).