隆重推出用於開發 Apache Hadoop YARN 應用程式的 Spring YARN 框架

釋出 | Janne Valkealahti | 2013 年 9 月 10 日 | ...

我們非常激動地宣佈,作為 Spring for Apache Hadoop 2.0 M1 版本的一部分,我們現在支援編寫基於 YARN 的應用程式。在這篇博文中,我將向您介紹 YARN、您可以使用它做什麼,以及 Spring 如何簡化基於 YARN 的應用程式的開發。

如果您在過去一兩年裡一直關注 Hadoop 社群,您可能已經看到了大量關於 YARN 和 Hadoop MapReduce 下一個版本(稱為 MapReduce v2)的討論。YARN(Yet Another Resource Negotiator,又一個資源協調器)是 MapReduce 專案的一個元件,旨在克服 Hadoop 原始設計中的一些效能問題。MapReduce v2 的基本思想是將 JobTracker 的功能(資源管理和作業排程/監控)拆分成獨立的守護程序。其理念是擁有一個全域性的資源管理器 (RM) 和每個應用程式的應用程式主控 (AM)。YARN 元件依賴關係的通用圖示可以在 YARN 架構中找到。

MapReduce 版本 2 是執行在 YARN 之上的一個應用程式。也可以建立與 MapReduce 無關的、類似的自定義 YARN 應用程式,這只是在執行 YARN 應用程式。然而,編寫自定義 YARN 應用程式非常困難。YARN API 是低級別的基礎設施 API,而不是開發者 API。檢視編寫 YARN 應用程式的 文件,瞭解其中涉及的內容。

從 2.0 版本開始,Spring for Apache Hadoop 推出了 Spring YARN 子專案,為構建基於 Spring 的 YARN 應用程式提供支援。這種 YARN 支援透過簡化開發過程而得以實現。“Spring 處理基礎設施,以便您可以專注於您的 應用程式”這一定論同樣適用於編寫 Hadoop 應用程式以及其他型別的 Java 應用程式。Spring 的 YARN 支援也使得測試您的 YARN 應用程式更加容易。

藉助 Spring 的 YARN 支援,您將使用 Spring 框架本身所有熟悉的概念,包括配置以及您在應用程式中通常可以做的事情。總的來說,Spring YARN 提供了三個不同的元件:YarnClientYarnAppmasterYarnContainer,它們可以一起被稱為 Spring YARN 應用程式。我們為所有元件提供了預設實現,同時仍然允許終端使用者根據自己的意願進行自定義。讓我們快速看一下一個非常簡單的 Spring YARN 應用程式,它在 Hadoop 叢集中執行一些自定義程式碼。

YarnClient 用於與 YARN 的資源管理器通訊。它提供了管理操作,如提交新應用程式例項、列出應用程式和終止正在執行的應用程式。當從 YarnClient 提交應用程式時,主要關注點在於應用程式主控 (Application Master) 的配置和啟動方式。YarnAppmasterYarnContainer 共享相同的通用啟動上下文配置邏輯,因此您會在 YarnClient 和 YarnAppmaster 的配置中看到很多相似之處。類似於 YarnClientYarnAppmaster 定義啟動上下文,YarnAppmasterYarnContainer 定義啟動上下文。啟動上下文定義了啟動容器的命令、本地化檔案、命令列引數、環境變數以及資源限制(記憶體、CPU)。

YarnContainer 是一個執行 YARN 應用程式實際工作的繁重任務的 worker。YarnAppmaster 與 YARN 資源管理器通訊,並相應地啟動和停止 YarnContainers。

您可以透過使用 YARN XML 名稱空間來定義 Spring 應用程式上下文,從而建立一個啟動應用程式主控的 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>

注意:未來的版本將提供一個基於 Java 的 API 進行配置,類似於 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 及其環境定義了本地資源。類路徑設定會拾取預設位置的 hadoop jars 以及您自己的應用程式 jars,如果要使用非預設目錄,請更改此設定。此外,在 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,但總的來說,手動完成此操作以避免不必要的網路 I/O 是更可取的。您的應用程式在建立新版本之前不會改變,因此可以在第一次提交應用程式之前將其複製到 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,而是為您所有的三個元件——YarnClientYarnAppmasterYarnContainer——配置 Spring 應用程式上下文。

我們只是初步瞭解了 Spring YARN 的功能。在我們準備更多博文的同時,請前往 GitHub 檢視現有示例。基本上,為了反映我們在本篇博文中描述的概念,請參閱我們示例儲存庫中的 multi-context 示例。

未來的博文將涵蓋 單元測試和更高階的 YARN 應用程式開發等主題。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有