搶佔先機
VMware 提供培訓和認證,助您突飛猛進。
瞭解更多我們非常高興地宣佈,作為 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 的功能,即資源管理和作業排程/監控,分解成獨立的守護程序。其思想是擁有一個全域性的 Resource Manager (RM) 和一個每個應用程式的 Application Master (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 處理基礎設施,以便您可以專注於您的 應用程式” 這句話不僅適用於編寫其他型別的 Java 應用程式,也適用於編寫 Hadoop 應用程式。Spring 的 YARN 支援也使得測試您的 YARN 應用程式變得更容易。
藉助 Spring 的 YARN 支援,您將使用 Spring Framework 本身所有熟悉的概念,包括配置,以及更廣泛地講,您在應用程式中可以做什麼。從高層次上看,Spring YARN 提供了三個不同的元件:YarnClient、YarnAppmaster 和 YarnContainer,它們合起來可以稱為 Spring YARN 應用程式。我們為所有元件提供了預設實現,同時仍給終端使用者按需定製的選項。讓我們快速看看一個非常簡單的 Spring YARN 應用程式,它在 Hadoop 叢集中執行一些自定義程式碼。
YarnClient 用於與 YARN 的 Resource Manager 通訊。它提供管理操作,如提交新的應用程式例項、列出應用程式和終止正在執行的應用程式。從 YarnClient 提交應用程式時,主要關注的是 Application Master 如何配置和啟動。YarnAppmaster 和 YarnContainer 都共享相同的通用啟動上下文配置邏輯,因此您會在 YarnClient 和 YarnAppmaster 配置中看到很多相似之處。就像 YarnClient 定義 YarnAppmaster 的啟動上下文一樣,YarnAppmaster 定義 YarnContainer 的啟動上下文。啟動上下文定義了啟動容器的命令、本地化檔案、命令列引數、環境變數和資源限制(記憶體、CPU)。
YarnContainer 是一個工作者,負責完成 YARN 應用程式實際執行的繁重工作。YarnAppmaster 與 YARN Resource Manager 通訊,並相應地啟動和停止 YarnContainer。
您可以使用 YARN XML 名稱空間定義 Spring Application Context,從而建立啟動 ApplicationMaster 的 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 負責控制其所有 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 定義了本地資源及其環境。classpath 設定會從預設位置載入 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,而是在為所有三個元件:YarnClient、YarnAppmaster 和 YarnContainer 配置 Spring Application Context。
我們剛剛觸及了 Spring YARN 的皮毛。在我們準備更多博文的同時,您可以去 GitHub 檢視現有示例。基本上,為了體現我們在本博文中描述的概念,請檢視我們示例倉庫中的 multi-context 示例。
未來的博文將涵蓋諸如 單元測試 以及更高階的 YARN 應用程式開發等主題。