Облачная платформаAdvanced

Взаимосвязь между Spark, HDFS и Yarn

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Взаимосвязь между Spark и HDFS

Данные, вычисляемые Spark, поступают из нескольких источников данных, таких как локальные файлы и HDFS. Большая часть данных, вычисляемых Spark, поступает из HDFS. HDFS может считывать данные в большом масштабе для параллельных вычислений. После вычисления данные могут быть сохранены в HDFS.

Spark включает Driver и Executor. Driver планирует задачи, а Executor выполняет задачи.

Figure 1 показывает процесс чтения файла.

Figure 1 File reading process


Процесс чтения файла выглядит следующим образом:

  1. Driver взаимодействует с HDFS для получения информации о файле A.
  2. HDFS возвращает подробную информацию о блоках этого файла.
  3. Driver задает степень параллелизма на основе объёма данных блоков и создаёт несколько задач для чтения блоков этого файла.
  4. Executor выполняет задачи и считывает подробные блоки в составе Resilient Distributed Dataset (RDD).

Figure 2 показывает процесс записи данных в файл.

Figure 2 File writing process


Процесс записи файла выглядит следующим образом:

  1. Driver создаёт каталог, в котором будет записан файл.
  2. На основе статуса распределения RDD вычисляется количество задач, связанных с записью данных, и эти задачи отправляются Executor.
  3. Executor выполняет эти задачи и записывает данные RDD в каталог, созданный в 1.

Взаимосвязь Spark и Yarn

Вычисления и планирование Spark могут быть реализованы в режиме Yarn. Spark использует вычислительные ресурсы, предоставляемые кластерами Yarn, и выполняет задачи распределённым способом. Spark on Yarn имеет два режима: Yarn-cluster и Yarn-client.

  • Режим Yarn-cluster

    Figure 3 показывает рабочий фреймворк Spark on Yarn-cluster.

    Figure 3 операционный фреймворк Spark on Yarn-cluster


    Процесс реализации Spark on Yarn-cluster:

    1. Клиент генерирует информацию о приложении и затем отправляет её в ResourceManager.
    2. ResourceManager выделяет первый контейнер (ApplicationMaster) для SparkApplication и запускает driver в этом контейнере.
    3. ApplicationMaster запрашивает ресурсы у ResourceManager для запуска контейнера.

      ResourceManager выделяет контейнер ApplicationMaster, который взаимодействует с NodeManager и запускает executor в полученном контейнере. После запуска executor регистрируется в driver и запрашивает задачи.

    4. Driver распределяет задачи executor.
    5. Executor выполняет задачи и сообщает о статусе выполнения driver.
  • Режим Yarn-client

    Рисунок 4 показывает работающий фреймворк Spark в Yarn-cluster.

    Рисунок 4 Spark on Yarn-client операционный фреймворк


    Процесс реализации Spark on Yarn-client:

    Note

    В режиме Yarn-client Driver развертывается на клиенте и запускается на клиенте. В режиме Yarn-client клиент более ранней версии несовместим. Рекомендуется использовать режим Yarn-cluster.

    1. Клиент отправляет запрос Spark‑приложения в ResourceManager, после чего ResourceManager возвращает результаты. Результаты включают информацию, такую как Application ID и максимальные и минимальные доступные ресурсы. Клиент упаковывает всю информацию, необходимую для запуска ApplicationMaster, и отправляет её в ResourceManager.
    2. После получения запроса ResourceManager находит подходящий узел для ApplicationMaster и запускает его на этом узле. ApplicationMaster — роль в Yarn, а имя процесса в Spark — ExecutorLauncher.
    3. Исходя из требований к ресурсам каждой задачи, ApplicationMaster может запросить серию Containers у ResourceManager для выполнения задач.
    4. После получения нового списка выделенных контейнеров (от ResourceManager) ApplicationMaster отправляет информацию соответствующим NodeManagers для запуска контейнеров.

      ResourceManager выделяет контейнеры для ApplicationMaster, который взаимодействует с соответствующими NodeManagers и запускает executors в полученных контейнерах. После запуска executors он регистрируется с drivers и запрашивает задачи.

      Note

      Запущенные контейнеры не приостанавливаются, и ресурсы не освобождаются.

    5. Drivers распределяют задачи между executors. Executor выполняет задачи и сообщает о статусе выполнения driver‑у.