本文來自網易雲社群
作者:王佳楠
一、概述
現如今在大規模資料處理分析的技術領域中,Hadoop及其生態內的各功能元件佔據了絕對的統治地位。Hadoop原生的MapReduce計算框架由於任務抽象簡單、計算流程固定、計算的中間結果寫入磁碟引起大量讀寫開銷等短板,正逐步的被基於記憶體的分散式計算框架Spark代替,應用於各類大規模資料處理分析的場景中,其優勢主要體現在以下5個方面: 1、更快的計算速度。採用計算中間結果的記憶體快取機制和基於DAG的資料處理過程優化策略,進一步提升資料處理速率。 2、簡單易用的分散式計算。將大規模資料處理任務,抽象為RDD的處理變換操作,將並行實現的分散式計算任務拆分為各自獨立的序列計算過程。 3、適合豐富的應用場景。Spark內部整合了SQL、機器學習、流計算、圖運算等多種型別計算模型,滿足多種大規模資料分析的場景需求。 4、相容多樣的儲存系統。滿足對包括HDFS、HBase、Hive、S3等多種大規模資料儲存系統的高效讀寫需求,輕鬆處理TB級以上規模以上的資料。 5、資源管理與高可靠性。結合Yarn、Mesos等多種型別的資源管理器,監控協調各計運算元任務的執行狀態,失敗重啟機制確保分散式作業的可靠性。
二、RDD計算模型原理
Spark將資料處理過程抽象為對記憶體中RDD(彈性分散式資料集)的操作,RDD的可以通過從資料來源直接讀取和集合資料型別封裝兩種方式建立。針對RDD的操作,根據其結果主要分為如map、flatMap、mapPartition、filter等生成新的RDD的transformation(轉換)操作和collect、reduce、foreach等生成集合資料型別或結果寫入的action(行為)操作兩大類。
上圖中描述了一個典型的Spark作業基於RDD實現資料的處理過程。其中,Spark對RDD的處理過程是惰性的,只有呼叫對RDD的action操作才能啟動對RDD的計算過程,連續的呼叫多個transformation操作是無法使資料處理過程真正的執行。在觸發RDD計算過程後,根據Spark內建的DAG(有向無環圖)引擎將多個對RDD的操作執行策略進行優化。 為滿足對大規模資料的處理需要,Spark將RDD劃分為多個partition(分割槽),以partition為單位將資料分散到叢集上的各個節點中。針對RDD的action操作和transformation操作間的本質區別就是生成的結果是否為RDD。
三、基於Yarn實現資源管理
由於Hadoop的HDFS與Spark的RDD抽象讀寫具有較為完備的相容性,各版本Spark均提供對應當前Hadoop版本的安裝包。同樣,Spark也可以使用Hadoop中的Yarn作為自身的資源管理器,用以完成對Spark叢集中是作業管理和任務計算資源排程分配等工作。
在Spark作業的執行過程中,Yarn將在叢集中的物理節點上的Executor的JVM程式封裝為獨立的Container,並提供獨立的臨時檔案目錄以及記憶體和CPU資源。同時,Spark還提供了共享檔案依賴的機制將Spark作業執行過程中,各Executor所需的如jar包、.so動態庫、py檔案及其他格式型別的檔案依賴資源與Spark作業自身的執行檔案分發到各Container中,使得Spark作業能夠具備更為靈活的擴充性。
四、技術棧
現如今,Spark作業支援Java、Scala、Python以及R四種語言編寫,Spark自身提供了SQL、機器學習、流計算以及圖運算四種型別的計算功能元件,開發人員可根據實際的應用需求和相應元件的功能特性完成Spark作業的開發。但是,其中如GraphX等部分功能元件僅支援Java及Scala語言的呼叫。
SQL:基於對記憶體中RDD操作和DAG引擎優化,Spark能夠實現比基於原生MapReduce的Hive SQL更高效的計算過程。同時,採用DataFrame封裝Spark作業能夠以函式呼叫的方式完成SQL操作。 機器學習:Spark基於記憶體實現RDD操作,能夠滿足使用大規模資料集完成機器學習建模時進行迭代運算的需要。其自身提供的MLlib元件包中提供了大量常用的機器學習演算法模型,同時,Intel基於Spark開發的BigDL使Spark能夠完成深度學習的建模計算過程。 流計算:Spark Streaming將資料來源抽象為DStream,將各時間窗內持續產生的實時資料切分為不同的RDD,以RDD為單位完成對時間窗內實時資料的處理,但其計算模式仍存在批處理的特性。 圖運算:Spark中自帶的圖運算引擎GraphX採用由並行超步與全域性同步組成的Bulk Synchronous Parallell(整體同步並行)模式,將圖運算過程抽象為各步的迭代直至符合收斂停止條件。
五、應用場景
在網易大資料開發計算平臺Mammut中,作業流任務中已支援Spark型別的計算節點。在原有SQL型別節點的基礎上,通過上傳Spark作業對應的jar包並完成相對應型別引數的配置,即可完成更多更為靈活的ETL過程,彌補Hive原生udf函式和SQL語句無法完成某些特殊要求計算的短板。
為實現更加通用性更廣的服務,基於元件化的方式將常用的非SQL的批處理計算過程實現為通用的功能元件包,通過傳入特定的引數實現功能的呼叫,從而為後續的開發過程節約成本。
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社群。
相關文章:
【推薦】 秋讀|10本熱門圖書(人工智慧、程式設計開發、架構、區塊鏈等)免費送!
【推薦】 使用QUIC
【推薦】 介面文件神器Swagger(上篇)