天天看點

《Spark大資料分析:核心概念、技術及實踐》一3.3 應用運作

本節書摘來自華章出版社《spark大資料分析:核心概念、技術及實踐》一書中的第3章,第3.1節,作者[美] 穆罕默德·古勒(mohammed guller),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

3.3 應用運作 

本節主要描述資料處理代碼是怎麼在spark叢集中執行的。

3.3.1 術語

先來看看幾個術語的定義。

shuffle操作。shuffle操作是指在叢集節點上對資料進行重新配置設定。這是一個耗時操作,因為它涉及在網絡間傳輸資料。需要注意的是,shuffle操作不是對資料進行随機重新配置設定,它按照某些标準将資料分成不同的集合。每一個集合就是一個新的分區。

作業。作業是一系列計算的集合,spark執行這些計算并将結果傳回給驅動程式。作業本質上就是在spark叢集上運作資料處理算法。一個應用程式可以發起多個作業。本章稍後将會介紹作業是怎麼執行的。

階段。一個階段由若幹個任務構成。spark将一個作業分解為一個由若幹個階段構成的dag,每一個階段依賴于其他階段。舉個例子,把一個作業分解為階段0和階段1兩個階段。隻有當階段0完成之後,才可以開始階段1。spark利用shuffle邊界将任務分成不同的階段。不要求shuffle操作的任務屬于同一階段。隻有在開始一個新階段時,任務才需要輸入資料是經過shuffle操作的。

3.3.2 應用運作過程

有了上面的這些定義,我們就可以描述一個spark應用在叢集節點上并行處理資料的過程。當一個spark應用開始運作的時候,spark會連接配接叢集管理者,擷取在worker節點上的執行者資源。就像前面所說的,spark應用把一個資料處理算法當成一個作業送出。spark将這個作業分解成由若幹個階段構成的dag。然後,spark在執行者上排程這些階段的運作,排程操作由叢集管理者提供的底層排程器實作。執行者并行地運作spark送出的任務。

每一個spark應用都有一組其自己的位于worker節點上的執行者。這樣的設計有諸多好處。首先,不同應用中的任務由于運作在不同jvm之上,使得它們之間互相隔離。一個應用程式中的錯誤任務并不會讓其他應用崩潰。其次,排程任務變得輕而易舉。spark一次隻需要排程歸屬于同一應用的任務。它不用處理這樣一種複雜情況,其中排程的多個任務屬于多個并發執行的不同應用。

然而,這種設計也有不足之處。由于不同應用在不同的jvm程序中運作,是以它們之間就不太友善共享資料。即使它們可能在同一個worker節點上運作,它們也隻能通過讀寫磁盤的方式共享資料。就像前面所說的,讀寫磁盤是耗時的操作。是以,應用間通過磁盤共享資料,将會遇到性能問題。

繼續閱讀