Статьи

Представляем среду Spring YARN для разработки приложений Apache Hadoop YARN

Первоначально опубликовано в блоге SpringSource Janne Valkealahti

Мы очень рады выпустить кота из мешка и выпустить поддержку написания приложений на основе YARN в рамках выпуска  Spring для Apache Hadoop 2.0 M1 . В этой записи блога я познакомлю вас с  YARN , что вы можете с ним сделать и как Spring упрощает разработку приложений на основе YARN.

Если вы следили за сообществом Hadoop в течение последнего года или двух, вы, вероятно, видели много дискуссий о YARN и следующей версии MapReduce Hadoop под названием MapReduce v2. YARN (еще одно средство согласования ресурсов) — это компонент проекта MapReduce, созданный для преодоления некоторых проблем с производительностью в оригинальном дизайне Hadoop. Основная идея MapReduce v2 — разделить функции JobTracker, Управление ресурсами и Планирование / Мониторинг заданий на отдельные демоны. Идея состоит в том, чтобы иметь глобального менеджера ресурсов (RM) и Application Master (AM) для каждого приложения. Общую диаграмму для зависимостей компонентов YARN можно найти в  архитектуре YARN .

MapReduce версии 2 — это приложение, работающее поверх YARN. Также возможно создать подобное пользовательское приложение на основе YARN, которое не имеет ничего общего с MapReduce, это просто запущенное приложение YARN. Однако написание пользовательского приложения на основе YARN затруднено. API YARN — это низкоуровневые API-интерфейсы инфраструктуры, а не API-интерфейсы разработчика. Взгляните на документацию  по написанию приложения YARN, чтобы получить представление о том, что происходит.

Начиная с версии 2.0, Spring for Apache Hadoop представляет подпроект Spring YARN для обеспечения поддержки создания приложений YARN на основе Spring. Эта поддержка YARN вступает в игру, пытаясь упростить разработку. «Spring управляет инфраструктурой, чтобы вы могли сосредоточиться на своем  приложении », относится к написанию приложений Hadoop, а также к другим типам приложений Java. Поддержка Spring YARN также облегчает тестирование вашего приложения YARN.

Благодаря поддержке Spring YARN вы будете использовать все знакомые концепции самой Spring Framework, включая настройку и, вообще говоря, то, что вы можете делать в своем приложении. На высоком уровне Spring YARN предоставляет три различных компонента,  YarnClientYarnAppmaster  и YarnContainer,  которые вместе можно назвать Spring YARN Application. Мы предоставляем реализации по умолчанию для всех компонентов, в то же время предоставляя конечному пользователю возможность настраивать столько, сколько он или она хочет. Давайте кратко рассмотрим очень упрощенное приложение Spring YARN, которое запускает некоторый пользовательский код в кластере Hadoop.

YarnClient  используются для связи с менеджером ресурсов пряжи в. Это обеспечивает действия по управлению, такие как отправка новых экземпляров приложений, перечисление приложений и удаление запущенных приложений. При отправке приложений из  YarnClient основные проблемы связаны с настройкой и запуском Application Master. И  YarnAppmaster,  и YarnContainer  используют одну и ту же логику конфигурации контекста запуска, поэтому вы увидите много общего в конфигурации YarnClient и YarnAppmaster. Аналогично тому, как  YarnClient  будет определять контекст запуска для  YarnAppmasterYarnAppmaster  определяет контекст запуска для ЯрнКонтейнер . Контекст запуска определяет команды для запуска контейнера, локализованные файлы, параметры командной строки, переменные среды и ограничения ресурсов (память, процессор).

YarnContainer  является работником , который делает тяжелую работу , что приложение ПРЯЖИ будет на самом деле. YarnAppmaster связывается с YARN Resource Manager и запускает и останавливает YarnContainers соответственно.

Вы можете создать приложение Spring, которое запускает ApplicationMaster, используя пространство имен YARN XML для определения контекста приложения Spring. Конфигурация контекста для YarnClient определяет контекст запуска для YarnAppmaster. Сюда входят ресурсы и библиотеки, необходимые для YarnAppmaster, и его настройки среды. Пример этого показан ниже.

<yarn:configuration />

<yarn:localresources>
  <yarn:hdfs path="/path/to/my/libs/*.jar"/>
</yarn:localresources>

<yarn:environment>
  <yarn:classpath/>
</yarn:environment>

<yarn:client app-name="my-yarn-app">
  <yarn:master-runner />
</yarn:client>

Примечание. В будущих выпусках будет предоставлен API-интерфейс на основе Java для настройки,  аналогичный тому, что делается в Spring Security 3.2 .

Цель  YarnAppmaster  — управлять экземпляром работающего приложения. YarnAppmaster  отвечает за управление жизненным циклом всех его  YarnContainers , целое приложение работает после того, как заявка подана, а также само по себе.

<yarn:configuration />

<yarn:localresources>
  <yarn:hdfs path="/path/to/my/libs/*.jar"/>
</yarn:localresources>

<yarn:environment>
  <yarn:classpath/>
</yarn:environment>

<yarn:master>
  <yarn:container-allocator/>
  <yarn:container-runner/>
</yarn:master>

В приведенном выше примере определяется контекстная конфигурация для  YarnAppmaster . Подобно тому, что мы видели в   конфигурации YarnClient , мы определяем локальные ресурсы для  YarnContainer  и его среды. Параметр classpath выбирает файлы jar hadoop, а также файлы вашего собственного приложения в расположениях по умолчанию. Измените параметр, если хотите использовать каталоги не по умолчанию. Также в YarnAppmaster  мы определяем компоненты, обрабатывающие распределение контейнера и загрузку. Компонент Allocator взаимодействует с менеджером ресурсов YARN, который управляет планированием ресурсов. Компонент Runner отвечает за загрузку выделенных контейнеров.

<yarn:container container-class="org.example.MyCustomYarnContainer"/>

Приведенный выше пример определяет простую  конфигурацию  контекста YarnContainer .

Для реализации функциональности контейнера вы реализуете интерфейс YarnContainer. Интерфейс YarnContainer аналогичен интерфейсу Java Runnable, у него есть метод run (), а также два дополнительных метода, связанных с получением информации о среде и командной строке.

Ниже приведено простое приложение hello world, которое будет запускаться внутри контейнера YARN:

public class MyCustomYarnContainer implements YarnContainer {

  private static final Log log = LogFactory.getLog(MyCustomYarnContainer.class);

  @Override
  public void run() {
    log.info("Hello from MyCustomYarnContainer");
  }

  @Override
  public void setEnvironment(Map<String, String> environment) {}

  @Override
  public void setParameters(Properties parameters) {}

}

Мы только что показали конфигурацию Spring YARN-приложения и логику основного приложения, так что остается только запустить приложение для запуска внутри кластера Hadoop. Служебный класс CommandLineClientRunner обеспечивает эту функциональность.

Вы можете использовать CommandLineClientRunner либо вручную из командной строки, либо использовать его из собственного кода.

# java -cp <mile long classpath> org.springframework.yarn.client.CommandLineClientRunner application-context.xml yarnClient -submit

Приложение Spring YARN упаковано в файл JAR, который затем может быть перенесен в HDFS с остальными зависимостями. YarnClient может переносить все необходимые библиотеки в HDFS во время процесса отправки приложения, но, вообще говоря, более целесообразно делать это вручную, чтобы избежать ненужного сетевого ввода-вывода. Ваше приложение не изменится, пока не будет создана новая версия, поэтому его можно будет скопировать в HDFS до первой отправки приложения. То есть вы можете использовать команду Hadoop  hdfs dfs -copyFromLocal  .

Ниже вы можете увидеть пример типовой настройки проекта.

src/main/java/org/example/MyCustomYarnContainer.java src/main/resources/application-context.xml src/main/resources/appmaster-context.xml src/main/resources/container-context.xml

Как дикое предположение, мы сделаем ставку, что вы теперь выяснили, что вы на самом деле не настраиваете YARN, вместо этого вы настраиваете контексты приложения Spring для всех трех компонентов,  YarnClientYarnAppmaster  и  YarnContainer .

Мы только что поцарапали поверхность того, что мы можем сделать с помощью Spring YARN. Пока мы готовим больше постов в блоге, проверим существующие образцы в  GitHub . В основном, чтобы отразить концепции, которые мы описали в этом сообщении в блоге, посмотрите  мультиконтекстный  пример в нашем репозитории примеров.

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