Tez學習筆記-初識

Apache Tez是一個針對Hadoop數據處理應用程序的新分佈式執行框架。Tez是Apache最新的支持DAG作業的開源計算框架,它可以將多個有依賴的作業轉換爲一個作業從而大幅提升DAG作業的性能。Tez並不直接面向最終用戶——事實上它允許開發者爲最終用戶構建性能更快、擴展性更好的應用程序。Hadoop傳統上是一個大量數據批處理平臺。但是,有很多用例需要近乎實時的查詢處理性能。還有一些工作則不太適合MapReduce,例如機器學習。Tez的目的就是幫助Hadoop處理這些用例場景。
Tez項目的目標是支持高度定製化,這樣它就能夠滿足各種用例的需要,讓人們不必藉助其他的外部方式就能完成自己的工作,如果 Hive和 Pig 這樣的項目使用Tez而不是MapReduce作爲其數據處理的骨幹,那麼將會顯著提升它們的響應時間。Tez構建在YARN之上,後者是Hadoop所使用的新資源管理框架。
Tez產生的主要原因是繞開MapReduce所施加的限制。除了必須要編寫Mapper和Reducer的限制之外,強制讓所有類型的計算都滿足這一範例還有效率低下的問題——例如使用HDFS存儲多個MR作業之間的臨時數據,這是一個負載。在Hive中,查詢需要對不相關的key進行多次shuffle操作的場景非常普遍,例如join - group by - window function - order by。
Tez設計哲學裏面的關鍵元素包括:
  • 允許開發人員(也包括最終用戶)以最有效的方式做他們想做的事情
  • 更好的執行性能
Tez之所以能夠實現這些目標依賴於以下內容
  • 具有表現力的數據流API——Tez團隊希望通過一套富有表現力的數據流定義API讓用戶能夠描述他們所要運行計算的有向無環圖 (DAG)。爲了達到這個目的,Tez實現了一個結構化類型的API,你可以在其中添加所有的處理器和邊,並可視化實際構建的圖形。
  • 靈活的輸入—處理器—輸出(Input-Processor-Output)運行時模型——可以通過連接不同的輸入、處理器和輸出動態地構建運行時執行器。
  • 數據類型無關性——僅關心數據的移動,不關心數據格式(鍵值對、面向元組的格式等)。
  • 動態圖重新配置
  • 簡單地部署——Tez完全是一個客戶端應用程序,它利用了YARN的本地資源和分佈式緩存。就Tez的使用而言,你不需要在自己的集羣上部署任何內容,僅需要將相關的Tez類庫上傳到HDFS上,然後使用Tez客戶端提交這些類庫即可。
你甚至可以在你的集羣上放置兩份類庫。一份用於產品環境,它使用穩定版本供所有的生產任務使用;另一份使用最新版本,供用戶體驗。這兩份類庫相互獨立,互不影響。
  • Tez能夠運行任意MR任務,不需要做任何改動。這樣能夠讓那些現在依賴於MR的工具實現分佈遷移。
接下來讓我們詳細地探索一下這些表現力豐富的數據流API——看看我們可以使用它們做些什麼?例如,你可以使用MRR模式而不是使用多個MapReduce任務,這樣一個單獨的map就可以有多個reduce階段;並且這樣做數據流可以在不同的處理器之間流轉,不需要把任何內容寫入HDFS(將會被寫入磁盤,但這僅僅是爲了設置檢查點),與之前相比這種方式性能提升顯著。下面的圖表闡述了這個過程:



第一個圖表展示的流程包含多個MR任務,每個任務都將中間結果存儲到HDFS上——前一個步驟中的reducer爲下一個步驟中的mapper提供數據。第二個圖表展示了使用Tez時的流程,僅在一個任務中就能完成同樣的處理過程,任務之間不需要訪問HDFS。
Tez的靈活性意味着你需要付出比MapReduce更多的努力才能使用它,你需要學習更多的API,需要實現更多的處理邏輯。但是這還好,畢竟它和MapReduce一樣並不是一個面向最終用戶的應用程序,其目的是讓開發人員基於它構建供最終用戶使用的應用程序。
以上內容是對Tez的概述及其目標的描述,下面就讓我們看看它實際的API。
Tez API
Tez API包括以下幾個組件:
  • 有向無環圖(DAG)——定義整體任務。一個DAG對象對應一個任務。
  • 節點(Vertex)——定義用戶邏輯以及執行用戶邏輯所需的資源和環境。一個節點對應任務中的一個步驟。
  • 邊(Edge)——定義生產者和消費者節點之間的連接。
邊需要分配屬性,對Tez而言這些屬性是必須的,有了它們才能在運行時將邏輯圖展開爲能夠在集羣上並行執行的物理任務集合。下面是一些這樣的屬性:
  • 數據移動屬性,定義了數據如何從一個生產者移動到一個消費者。
  • 調度(Scheduling)屬性(順序或者並行),幫助我們定義生產者和消費者任務之間應該在什麼時候進行調度。
  • 數據源屬性(持久的,可靠的或者暫時的),定義任務輸出內容的生命週期或者持久性,讓我們能夠決定何時終止。
運行時API基於輸入—處理器—輸出模型,藉助於該模型所有的輸入和輸出都是可插拔的。爲了方便,Tez使用了一個基於事件的模型,目的是爲了讓任務和系統之間、組件和組件之間能夠通信。事件用於將信息(例如任務失敗信息)傳遞給所需的組件,將輸出的數據流(例如生成的數據位置信息)傳送給輸入,以及在運行時對DAG執行計劃做出改變等。
Tez還提供了各種開箱即用的輸入和輸出處理器。
這些富有表現力的API能夠讓更高級語言(例如Hive)的編寫者很優雅地將自己的查詢轉換成Tez任務。
Tez調度程序
在決定如何分配任務的時候,Tez調度程序考慮了很多方面,包括:任務位置需求、容器的兼容性、集羣可利用資源的總量、等待任務請求的優先級、自動並行化、釋放應用程序不再使用的資源(因爲對它而言數據並不是本地的)等。它還維護着一個使用共享註冊對象的預熱JVM連接池。應用程序可以選擇使用這些共享註冊對象存儲不同類型的預計算信息,這樣之後再進行處理的時候就能重用它們而不需要重新計算了,同時這些共享的連接集合及容器池資源也能非常快地運行任務。
如果你想了解更多與容器重利用相關的信息,那麼可以查看這裏
擴展性
總體來看,Tez爲開發人員提供了豐富的擴展性以便於讓他們能夠應對複雜的處理邏輯。這可以通過示例“Hive是如何使用Tez的”來說明。


讓我們看看這個經典的TPC-DS查詢模式,在該模式中你需要將多個維度表與一個事實表連接到一起。大部分優化器和查詢系統都能完成該圖右上角部分所描述的場景:如果維度表較小,那麼可以將所有的維度表與較大的事實表進行廣播連接,這種情況下你可以在Tez上完成同樣的事情。
但是如果這些廣播包含用戶自定義的、計算成本高昂的函數呢?此時,你不可能都用這種方式實現。這就需要你將自己的任務分割成不同的階段,正如該圖左邊的拓撲圖所展示的方法。第一個維度表與事實表進行廣播連接,連接的結果再與第二個維度表進行廣播連接。
第三個維度表不再進行廣播連接,因爲它太大了。你可以選擇使用shuffle連接,Tez能夠非常有效地導航拓撲。
使用Tez完成這種類型的Hive查詢的好處包括:
  • 它爲你提供了全面的DAG支持,同時會自動地在集羣上完成大量的工作,因而它能夠充分利用集羣的並行能力;正如上面所介紹的,這意味着在多個MR任務之間不需要從HDFS上讀/寫數據,通過一個單獨的Tez任務就能完成所有的計算。
  • 它提供了會話可重用的容器,因此延遲低,能夠儘可能地避免重組。
使用新的Tez引擎執行這個特殊的Hive查詢性能提升將超過100%。
路線圖
  • 更加豐富的DAG支持。例如,Samza是否能夠使用Tez作爲其底層支撐然後在這上面構建應用程序?爲了讓Tez能夠處理Samza的核心調度和流式需求開發團隊需要做一些支持。Tez團隊將探索如何在我們的DAG中使用這些類型的連接模式。他們還想提供更好的容錯支持,更加有效地數據傳輸,從而進一步優化性能,並且改善會話性能。
  • 考慮到這些DAG的複雜度無法確定,需要提供很多自動化的工具來幫助用戶理解他們的性能瓶頸。

Tez是一個支持DAG作業的分佈式執行框架。它能夠輕而易舉地映射到更高級的聲明式語言,例如Hive、Pig、Cascading等。它擁有一個高度可定製的執行架構,因而我們能夠在運行時根據與數據和資源相關的實時信息完成動態性能優化。框架本身會自動地決定很多棘手問題,讓它能夠順利地正確運行。

使用Tez,你能夠得到良好的性能和開箱即用的效率。Tez的目標是解決Hadoop數據處理領域所面對的一些問題,包括延遲以及執行的複雜性等。Tez是一個開源的項目,並且已經被Hive和Pig使用。


安裝部署
Hadoop使用版本:hadoop-2.7.2.tar.gz
Tez使用版本:tez-0.8.4.tar.gz

解壓文件
$ tar -xzvf tez-0.8.4.tar.gz

修改/etc/profile文件
export TEZ_HOME=/home/dataplat/tez-0.8.4
export TEZ_CONF_DIR=$HADOOP_HOME
export TEZ_LIB_DIR=$TEZ_HOME:$TEZ_HOME/lib

HDFS上新建文件夾tez,將tez文件拷貝至其目錄下
hadoop fs -copyFromLocal tez-0.8.4 /tez/
這裏由於源包下guava包版本較低,替換爲一個較高版本包guava-18.0.jar

在HADOOP配置文件目錄下新建tez-site.xml文件
<configuration>
  <property>
    <name>tez.lib.uris</name>
    <value>${fs.defaultFS}/tez/tez-0.8.4,${fs.defaultFS}/tez/tez-0.8.4/lib</value>
  </property>

  <property>
    <name>tez.lib.uris.classpath</name>
    <value>${fs.defaultFS}/tez/tez-0.8.4,${fs.defaultFS}/tez/tez-0.8.4/lib</value>
  </property>

  <property>
        <name>tez.use.cluster.hadoop-libs</name>
        <value>true</value>
  </property>

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

修改配置文件hadoop-env.sh,添加以下內容
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${TEZ_CONF_DIR}:${TEZ_HOME}/*:${TEZ_HOME}/lib/*
或者
for jar in `ls $TEZ_HOME|grep jar`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/lib/$jar
done

修改配置文件mapred-site.xml
<property>
                <name>mapreduce.framework.name</name>
                <value>yarn-tez</value>
</property>

執行MapReduce程序、Hive命令均可測試



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