Spring YARN 框架簡介,用於開發 Apache Hadoop YARN 應用程式

發佈 | Janne Valkealahti | 2013年9月10日 | ...

我們非常興奮地推出對撰寫基於 YARN 應用程式的支援,作為 Spring for Apache Hadoop 2.0 M1 發佈版本的一部分。在這篇部落格文章中,我將向您介紹 YARN,您可以用它做什麼,以及 Spring 如何簡化基於 YARN 應用程式的開發。

如果您在過去一兩年中一直在關注 Hadoop 社群,您可能已經看到了很多關於 YARN 和 Hadoop 下一個版本的 MapReduce(稱為 MapReduce v2)的討論。 YARN(Yet Another Resource Negotiator,另一種資源協商器)是 MapReduce 專案的一個元件,旨在克服 Hadoop 原始設計中的一些效能問題。 MapReduce v2 的基本思想是將 JobTracker、Resource Management 和 Job Scheduling/Monitoring 的功能拆分為單獨的守護程式。 其目的是擁有一個全域資源管理器 (RM) 和一個每個應用程式的應用程式主控器 (AM)。 從 YARN 架構 可以找到 YARN 元件相依性的通用圖表。

MapReduce Version 2 是一個在 YARN 之上執行的應用程式。 也可以製作類似的自訂基於 YARN 的應用程式,這些應用程式與 MapReduce 無關,它只是簡單地執行 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 Framework 概念,包括配置和一般來說您可以在應用程式中所做的事情。 在高階上,Spring YARN 提供了三個不同的元件:YarnClientYarnAppmasterYarnContainer,它們可以一起稱為 Spring YARN 應用程式。 我們為所有元件提供預設實作,同時仍然讓最終使用者可以根據自己的意願進行自訂。 讓我們快速看一下一個非常簡單的 Spring YARN 應用程式,它在 Hadoop 叢集中執行一些自訂程式碼。

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

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

您可以建立一個 Spring 應用程式,該應用程式使用 YARN XML 命名空間來定義 Spring 應用程式內容,從而啟動 ApplicationMaster。 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 負責控制其所有 YarnContainer 的生命週期、應用程式提交後整個正在執行的應用程式以及自身。

<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 jar 以及您自己的應用程式 jar,如果您想使用非預設目錄,請變更該設定。 此外,在 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,而是為所有三個元件配置 Spring 應用程式內容:YarnClientYarnAppmasterYarnContainer

我們僅僅觸及了 Spring YARN 可以做的事情的表面。 當我們準備更多部落格文章時,請繼續查看 GitHub 中的現有範例。 基本上,為了反映我們在本部落格文章中描述的概念,請參閱我們範例儲存庫中的 multi-context 範例。

未來的部落格文章將涵蓋諸如 單元測試 和更進階的 YARN 應用程式開發等主題。

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

瞭解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

檢視全部