Tez 簡介

Table of Contents

Tez 概述

YARN 背景時間線

Tez 如何使用 YARN Timeline

YARN Timeline and Hadoop Versions

Configuring Tez to use YARN Timeline

Tez 訪問控制

ACLs and the Tez UI

How to setup the ACLs

YARN Administration ACLs

AM/Session Level ACLs

DAG ACLs

將特定於應用程序的數據嵌入到 Tez UI 中

設置 DAG-level 信息

在 Tez UI 中使用 DAG 信息和歷史文本

Tez UI 概述

爲 Tez UI 設置 Tez

部署 Tez UI

配置時間軸服務器 URL 和資源管理器 UI URL。

Hosting the UI in Tomcat.

Hosting the UI 使用任意單機 webserver

應用程序時間軸服務器的其他設置步驟

Tez Shuffle Handler 概述

Tez Shuffle Handler 設置

Tez Shuffle Handler 部署

Node Manager 設置

Tez 本地模式

需要注意的事情

從本地模式遷移到實際集羣時可能出現的問題

帶有外部服務的本地模式


Tez 概述

Apache TEZ®項目旨在構建一個應用程序框架,該框架允許對處理數據的任務進行復雜的定向無循環圖。它目前構建在 Apache Hadoop YARN 之上。

Tez的兩個主要設計主題是:

向終端用戶授權:

  • 豐富的數據流定義 api
  • 靈活的輸入-處理器-輸出運行時模型
  • 數據類型不確定
  • 簡化的部署

執行性能:

  • 性能收益超過 Map Reduce
  • 最優的資源管理
  • 在運行時計劃重新配置
  • 動態物理數據流決策

通過允許 Apache Hive 和 Apache Pig 這樣的項目運行復雜的 DAG 任務,Tez 可以用來處理數據,這些數據以前需要多個 MR jobs,現在在一 Tez 作業中,如下所示。

YARN 背景時間線

在 Apache Hadoop 2.4.0中引入了對 YARN 時間軸的初始支持。在 Apache Hadoop 2.6.0 中引入了對時間軸上的 acl 的支持。Tez 在0.5中引入了對時間軸的支持。x(0.4中有一些實驗支持)。x)。但是,Tez ACLs 與 Timeline 的集成只能從 Tez 0.6.0開始。

Tez 如何使用 YARN Timeline

Tez 使用 YARN Timeline 作爲其應用歷史存儲。Tez 的大部分生命週期信息存儲到這段歷史存儲如:- DAG信息,如:- DAG - DAG提交計劃,開始和結束時間 - DAG計數器 - DAG的最終狀態和附加的診斷 - Vertex,任務和任務嘗試信息-開始和結束時間計數器診斷

使用上述信息,用戶可以在 Tez DAG 運行時和完成後對其進行分析。

YARN Timeline and Hadoop Versions

考慮到只在 Apache Hadoop 2.6.0 中實現了對具有完全安全性的 YARN 時間軸的支持,有些特性可能不受支持,這取決於使用的是 Apache Hadoop 的哪個版本。

  Hadoop 2.2.x, 2.3.x Hadoop 2.4.x, 2.5.x Hadoop 2.6.x and higher
Timeline Support No Yes Yes
Timeline with ACLs Support No No Yes

Configuring Tez to use YARN Timeline

默認情況下,Tez 將其歷史數據寫入 HDFS 上的文件。要使用時間軸,請將以下屬性添加到您的 tez-site.xml:

<property>
   <name>tez.history.logging.service.class</name>
   <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
</property>

Tez 0.4.x,上面的配置不支持,0.4.x 及以上版本使用以下:

<property>
   <name>tez.yarn.ats.enabled</name>
   <value>true</value>
</property>

在 Apache Hadoop 2.4 中使用 Tez 時。x或2.5。x,鑑於這些版本並不完全安全,以下屬性也需要啓用:

<property>
   <name>tez.allow.disabled.timeline-domains</name>
   <value>true</value>
</property>

Tez 訪問控制

Tez 的訪問控制可以分爲以下幾類:

  • 修改 Tez AM(或會話)的權限。持有此許可證的用戶可以:
    • Submit a DAG to a Tez Session
    • Kill any DAG within the given AM/Session
    • Kill the Session
  • 查看 Tez AM(或會話)的權限。持有此許可證的用戶可以:
    • Monitor/View the status of the Session
    • Monitor/View the progress/status of any DAG within the given AM/Session
  • 修改特定 Tez DAG 的權限。持有此許可證的用戶可以:
    • Kill the DAG
  • 查看特定 Tez DAG 的權限。持有此許可證的用戶可以:
    • 監視/查看DAG的進度/狀態

從上面可以看到,可以訪問 AM 上的操作的所有用戶/組也可以訪問該 AM/會話內的所有 DAGs 上的類似操作。另外,在默認情況下,Tez AM 的所有者,即啓動 Tez AM 的用戶,被認爲是超級用戶,可以訪問 AM 上的所有操作以及 AM/會話中的所有 DAGs。

在 Tez 0.5.0中引入了對 acl 的支持。這些 acl 與 YARN 時間線的集成只能從 Tez 0.6.0起使用。

ACLs and the Tez UI

對於支持 acl 的 YARN 時間軸服務器的版本,UI 將尊重此類安全集羣的 acl。例如,當特定的經過身份驗證的用戶在 UI 上查看“All DAGs”頁面時,將只顯示用戶可以訪問的 DAGs。

How to setup the ACLs

默認情況下,在 Tez 中總是啓用 acl。要禁用 acl,請設置以下配置屬性:

<property>
   <name>tez.am.acls.enabled</name>
   <value>false</value>
</property>

YARN Administration ACLs

YARN 管理 acl 由集羣級別的配置驅動。YARN 管理員被授予 AM 級別查看和修改權限。當前的一個限制是對 cluster wide yarn.admin 的修改。當 AM 運行時,acl 配置不會反映在 AM 視圖和修改 acl 中。要設置 acl,需要定義以下屬性:

<property>
   <name>yarn.admin.acl</name>
   <value></value>
</property>

該值的格式是一個以逗號分隔的用戶和組列表,其中的用戶和組由一個空格分隔。例如“user1、user2 group1, group2。”要允許所有用戶執行給定的操作,可以指定值“*”。

AM/Session Level ACLs

AM/Session 級acl由配置驅動。要設置acl,需要定義以下屬性:

<property>
   <name>tez.am.view-acls</name>
   <value></value>
</property>
<property>
   <name>tez.am.modify-acls</name>
   <value></value>
</property>

該值的格式是一個以逗號分隔的用戶和組列表,其中的用戶和組由一個空格分隔。例如“user1、user2 group1, group2。”要允許所有用戶執行給定的操作,可以指定值“*”。

DAG ACLs

在某些情況下,應用程序可能需要在給定會話中運行 DAGs 以獲得不同的訪問權限。在這種情況下,可以通過 DAG API 以編程方式指定每個 DAG 的 acl。在您正在使用的 Tez 版本的 API 文檔中查找 DAG::setAccessControls。在這個場景中,需要注意的是,會話 acl 的定義應該只指定超級用戶,以確保其他用戶不會意外地訪問給定會話中的所有 DAGs 的信息。

將特定於應用程序的數據嵌入到 Tez UI 中

Tez UI 主要是基於存儲在 YARN 時間軸中的數據構建的。目前,Tez API 爲將特定於應用程序的數據注入同一存儲層的應用程序提供了一些最低限度的支持。通過遵循定義良好的格式,使用通用標準指南,也可以在 Tez UI 中顯示這些數據。

設置 DAG-level 信息

要設置 DAG 級別信息,使用的 API 是 DAG::setDAGInfo。(請參閱Javadocs以獲得更詳細和最新的信息)

setDAGInfo() API 期望 a 是傳遞給它的字符串。該字符串建議爲 json 編碼的值,用戶界面識別的鍵如下:

  • “context”: 使用此 DAG 的應用程序上下文。例如,如果作爲 Hive 或 Pig 腳本的一部分運行,可以將其設置爲“Hive”或“Pig”。
  • “description”: DAG 的一般描述。在 Hive 的情況下,這可以是 SQL 查詢文本。

默認情況下,作爲 tez-runtime-library 的一部分的輸入/輸出/處理器不會通過 setHistoryText()  API 發佈它們的配置信息。爲此,需要啓用以下屬性:

<property>
   <name>tez.runtime.convert.user-payload.to.history-text</name>
   <value>true</value>
</property>

請注意,這是一個數據量很大的操作,在 TimelineServer 上增加了很多負載(由於生成的配置數據量很大),因此大多數作業都應該禁用該操作,除非確實需要進行調試。

在 Tez UI 中使用 DAG 信息和歷史文本

如果 DAG 信息和歷史文本中的數據設置符合 UI 所期望的格式,那麼它將以一種易於使用的方式顯示在 Tez UI 中。在不可能這樣做的情況下,UI 可能會退回到完全不顯示數據或以安全的方式顯示字符串的狀態。

Tez UI 概述

Tez UI 依賴於應用程序時間軸服務器,它的角色是在 YARN 應用程序生命週期中生成的應用程序數據的後備存儲。

Tez 提供了自己的 UI,該 UI 與應用程序時間軸服務器接口,並在 Tez UI web 應用程序中顯示 Tez 應用程序的活動視圖和歷史視圖。

爲 Tez UI 設置 Tez

爲Tez UI設置Tez

爲了讓 Tez 擁有一個功能性的 UI,並讓歷史鏈接從 YARN ResourceManager UI 中正確工作,需要在 Tez -site.xml 中啓用以下設置:

tez-site.xml
-------------
...
<property>
  <description>Enable Tez to use the Timeline Server for History Logging</description>
  <name>tez.history.logging.service.class</name>
  <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
</property>

<property>
  <description>URL for where the Tez UI is hosted</description>
  <name>tez.tez-ui.history-url.base</name>
  <value>http://<webserver-host:9999/tez-ui/</value>
</property>
...

部署 Tez UI

tez-ui.war 可以通過三種方式獲得:

  • 給定版本的二進制工件中生成war。二進制工件不是所有版本都可用的,在這種情況下,請使用下面列出的任何其他選項。
  • 獲得 tez-ui.war 對於給定的發佈,從 Maven repo 獲取。
  • SourceCode 構建 tez-ui.war。有關詳細信息,請參閱tez-ui模塊中的README.txt。

配置時間軸服務器 URL 和資源管理器 UI URL。

默認情況下,Tez UI 嘗試使用與 Tez UI 相同的主機連接到時間軸服務器。例如,如果 UI 託管在 localhost 上,則時間軸服務器URL 被假定爲 http(s)://localhost:8188,資源管理器 web URL 被假定爲 http(s)://localhost:8088。

如果時間軸服務器和/或資源管理器託管在不同的主機上,Tez UI 需要在 scripts/config .js 中配置相應的更改(在提取的 Tez - UI .war 中)。取消以下行註釋,並適當地設置主機名和端口。“timelineBaseUrl” 映射到 YARN 時間軸服務器,“RMWebUrl” 映射到 YARN 資源管理器。

// timelineBaseUrl: 'http://localhost:8188',
// RMWebUrl: 'http://localhost:8088',

Hosting the UI in Tomcat.

  1. 移除舊的部署 $TOMCAT_HOME/webapps
  2. 把 war 文件導入  $TOMCAT_HOME/webapps/tez-ui/
  3. 根據需要修改 scripts/config.js 
  4. Restart tomcat and the UI should be available under the tez-ui/ path.

Hosting the UI 使用任意單機 webserver

  1. 解壓縮 war 文件
  2. 根據需要修改 scripts/config.js 
  3. 將結果目錄複製到web服務器的文檔根目錄。
  4. Restart the webserver

應用程序時間軸服務器的其他設置步驟

Requires: Apache Hadoop 2.6.0 or above

需要在 yarn-site.xml 中設置以下配置,以便在與 Tez UI 相關的時間軸服務器上正確地執行功能行爲。如果在分佈式設置中運行,用實際的主機名替換 localhost。

<property>
  <description>Indicate to clients whether Timeline service is enabled or not.
  If enabled, the TimelineClient library used by end-users will post entities
  and events to the Timeline server.</description>
  <name>yarn.timeline-service.enabled</name>
  <value>true</value>
</property>

<property>
  <description>The hostname of the Timeline service web application.</description>
  <name>yarn.timeline-service.hostname</name>
  <value>localhost</value>
</property>

<property>
  <description>Enables cross-origin support (CORS) for web services where
  cross-origin web response headers are needed. For example, javascript making
  a web services request to the timeline server.</description>
  <name>yarn.timeline-service.http-cross-origin.enabled</name>
  <value>true</value>
</property>

<property>
  <description>Publish YARN information to Timeline Server</description>
  <name> yarn.resourcemanager.system-metrics-publisher.enabled</name>
  <value>true</value>
</property>

Tez Shuffle Handler 概述

Tez 指定 shuffle handler 允許 Tez DAGs 利用 Tez 的新功能 shuffle 數據。Tez shuffle handler 允許 DAGs 更有效地爲 Tez 的新數據移動類型和運行時優化(如自動減少並行)洗牌數據。長時間運行的 Tez 會話將能夠爲已完成的查詢清理中間數據,而 Tez 應用程序可以決定爲正在運行的應用程序清理已完成的中間數據。

Tez Shuffle Handler 設置

Requires: Apache Tez 0.9.0 or above

客戶端中的配置指定 Tez shuffle 處理程序

tez-site.xml
-------------
...
<property>
  <name>tez.am.shuffle.auxiliary-service.id</name>
  <value>tez_shuffle</value>
</property>
...

Tez Shuffle Handler 部署

Tez Shuffle 處理程序 jar artifact org.apache.org: Tez -aux-services 需要放在節點管理器類路徑中並重新啓動

Node Manager 設置

Requires: Apache Hadoop 2.6.0 or above

需要在節點管理器 yarn-site.xml 中設置以下配置,以啓用 Tez Shuffle 處理程序

yarn-site.xml
-------------
...
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>tez_shuffle</value>
</property>

<property>
  <name>yarn.nodemanager.aux-services.tez_shuffle.class</name>
  <value>org.apache.tez.auxservices.ShuffleHandler</value>
</property>
...

Tez 本地模式

Tez 本地模式是一種測試 Tez 作業的開發工具,不需要啓動 Hadoop 集羣。本地模式運行 Tez 組件 AppMaster、TaskRunner,這些組件在集羣上執行作業時使用。從開發人員工具的角度來看,它提供了幾個優點。

  • 快速原型 Hadoop 設置,啓動成本等不涉及。
  • 單元測試快速執行,因爲分配資源、啓動 jvm 等的開銷被消除了。
  • 易於調試的單個 JVM 運行所有用戶代碼。

雖然大多數組件在本地模式下重用,但也有一些組件不是

  • 調度和容器重用是不同的。
  • yarn 本地資源的處理。本地模式期望在執行時客戶端加載必要的 jar。
  • 包含一些性能改進,比如跳過 RPC 調用,因爲所有內容都在同一個 JVM 中運行。

在本地模式下運行 DAG

  • “tez.local.model” 在用於創建 TezClient 的 confgiuration 實例中,應該設置爲 true。
  • 文件系統必須配置爲本地文件系統(“fs.default.name” must be set to “file:///”)。這需要在所有用於創建 DAG 的配置實例中進行設置。通常,在不使用 Hadoop 集羣的情況下使用 Tez 進行測試和原型設計時,這不是問題。當 Hadoop 配置文件位於類路徑中,並配置了一個不同的默認文件系統時,就會出現問題。
  • 設置獲取器以使用本地讀取,而不是從遠程節點獲取。(“tez.runtime.optimize.local.fetch” must be set to true)
  • 除此之外,使用本地模式而不是在集羣上運行作業,不需要進行其他更改。
  • 如果在代碼中使用此配置,則應該對配置進行以下更改,然後此配置實例將成爲所有其他配置實例的基礎。
Configuration conf = new Configuration();
conf.setBoolean(TezConfiguration.TEZ_LOCAL_MODE, true);
conf.set("fs.default.name", "file:///");
conf.setBoolean(TezRuntimeConfiguration.TEZ_RUNTIME_OPTIMIZE_LOCAL_FETCH, true);
  • 如果使用一個 tez-site.xml 配置文件,它應該包含以下條目
<property>
  <name>fs.default.name</name>
  <value>file:///</value>
</property>
<property>
  <name>tez.local.mode</name>
  <value>true</value>
</property>
<property>
  <name>tez.runtime.optimize.local.fetch</name>
  <value>true</value>
</property>

需要注意的事情

  • 在當前本地模式下,大量輸入數據可能導致 JVM 內存不足,因爲所有 TEZ 組件都在單個 JVM 中運行。輸入數據的大小應該保持較小
  • tezam .inline.task. execution_max_tasks (tez.am.inline.task.execution.maxtasks)不應該被更改(默認值爲1)。
  • “tez.history.logging.service.class” 應該是默認值: “org.apache.tez.dag.history.logging.impl.SimpleHistoryLoggingService”.這意味着 ATS 在當前本地模式下是禁用的。

從本地模式遷移到實際集羣時可能出現的問題

  • 資源需求(CPU、內存等)本來是爲 yarn 集羣指定的,現在將開始生效,應該加以考慮。
  • 爲 DAG 設置的 Java 選項和環境變量在本地模式下不起作用,可能是遷移問題的根源。
  • 當在本地模式下運行時,ObjectRegistry 將在單個任務中工作。在實際的集羣中,行爲會有所不同,它會在共享同一個容器的任務之間工作。

帶有外部服務的本地模式

  • 在本地模式下運行時,常規的容器執行被轉換爲在相同的進程中運行,而不是啓動容器。
  • 配置爲在外部服務中運行的執行不受影響,並嘗試使用這些外部服務執行。如果以這種方式配置,請確保在嘗試使用本地模式時外部服務正在運行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章