Apache Tez 了解


你可能聽說過Apache Tez,它是一個針對Hadoop數據處理應用程序的新分布式執行框架。但是它到底是什么呢?它的工作原理是什么?哪些人應該使用它,為什么?如果你有這些疑問,那么可以看一下Bikas SahaArun Murthy提供的呈現“Apache Tez: 加速Hadoop查詢處理”,在這個呈現中他們討論了Tez的設計,它的一些突出亮點,同時還分享了通過讓Hive使用Tez而不是MapReduce而獲得的一些初始成果。

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 - grp 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的使用示例,對這些屬性的詳細介紹,以及運行時如何展開邏輯圖,那么可以看看Hortonworks提供的這篇文章

運行時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使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM