孫麗
摘要:本文主要對Hadoop、Spark兩種大數據處理框架進行介紹,闡述各自的原理、生態組成及應用特點,并對兩者進行了簡單的比較。
關鍵詞:Hadoop;Spark;大數據框架
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2020)12-0003-03
隨著互聯網技術的迅猛發展,以及人們獲取信息的方式和方法的改變,各行業應用系統的規模迅速擴大,所產生的數據呈井噴式增長,遠遠超出傳統單臺計算機的信息處理能力。因此若干大數據處理平臺應運而生,如Hadoop、Spark、Flink、Storm、Samza等,各種平臺都具有自己的特點與應用領域,現對其中最常見、應用最廣泛的Hadoop及Spark進行介紹。
1Hadoop
1.1關于Hadoop
Hadoop是Apache下的一個開源的分布式計算平臺。Hadoop作為一種底層細節透明的架構,其核心包括兩部分:HDFS分布式文件系統(Hadoop Distributed File System)和MapReduce。HDFS實現分布式文件系統,提供了文件操作和數據存儲;MapReduce實現了分布式計算和分布式任務處理,實現了任務的分發、執行、跟蹤等工作。
1.2Hadoop原理與運行機制
Hadoop是典型的主從結構,包括Master和Slave,即其構成包括數據節點多個以及名字節點一個。主服務器(master)由名字節點構成,其主要作用是對HDFS(分布式文件系統)的name space進行管理,并執行client提出的文件訪問命令;對系統數據進行存儲是數據節點具有的功能。一定數量的TaskTracker和一個Job共同構成了MapReduce框架,主節點和數據節點分別為運行JobTracker和TaskTracker提供了相應的場所。各項任務和作用的調度工作均由主節點負責,將任務分派到從節點的同時,還會對其執行狀況進行監督,如果任務在分配或監控上未獲得成功,將自動重復上一步驟;對來自主節點的任務予以執行是從節點唯一的工作。在對Job進行提交時,Job等相關信息的接收工作由JobTracker負責,并向從節點分發相應的信息,此外,還會對其具體的執行狀況實施監督管理。
在應用中,從基礎層面為框架提供支持是Hadoop Common的主要作用,處理大數據的工作是由MapReduce組件和HDFS合作完成的。圖1展示的內容就是運行過程中Hadoop所依據的機制,其對于相關部署環境等方面進行了詳細展示。
1.3Hadoop生態
Hadoop生態圈主要包括HBase、Hive、Pig、Sqoop、Avro和ZooKeeper等。Hive是基于Hadoop的分布式數據倉庫技術,用于查詢和管理存儲在分布式環境下的大數據集,適合處理相對靜態的海量數據集,即在處理過程中數據不會發生快速變化且對處理結果的實時響應要求不高,其HQL語句結合了SQL技術和MapReduce分布式計算框架,降低了傳統數據分析人員使用Hadoop進入大數據時代的障礙。HBase是運行于Hadoop之上的分布式海量數據庫,用來存儲分結構化和半結構化的松散數據,它起源于Google的BigTable,起初解決大規模網頁搜索,現在應用于多種應用如地圖、社交網站YouTube、博客網站等,是一種典型的NoSQL技術,能夠實現海量數據的準實時查詢。Sqoop是一個用來將Hadoop和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(如:MySQL,Oracle,Postgres等)中的數據導入到HDFS中,也可以將HDFS的數據導出到關系型數據庫中。
2Spark
2.1關于Spark
Apache Spark是專為大規模數據處理而設計的快速通用的計算引擎。Spark應用程序在集群運行機制如圖2所示,Spark應用程序作為獨立的進程集合運行在集群上,由主程序中的SparkContext對這些進程進行協調。SparkContext可以連接多種類型的集群管理器,包括Mesos,YARN,Spark自己的Standalone,集群管理器可以在應用程序間分配計算資源。當SparkContext連接上集群管理器后,會在集群節點上申請創建executor, executor就是進行運算的執行以及存儲應用數據的進程,之后SparkContext將用戶的應用程序以JAR文件或者Python文件的形式發送給executor,最后SparkContext發送task到executor進行執行。
線程池是所有Spark應用程序均具備的,為執行多線程任務提供保障。采取此種方式的優點在于,可以有效隔離不同應用程序的調動,換而言之,drive的任務尤其自行調度,不同程序在執行任務時使用的JVM也不同。但此種方式也存在一定的弊端,即每個SparkContext所形成的數據不具備共享性。
2.2Spark的RDD
對于Spark的抽象性主要表現為兩種形式:其一,通過RDD(即彈性分布式數據)來抽象表示數據,只有進行RDD轉換后的數集,才可以通過Spark完成相應操作;其二,通過動作等算子抽象化RDD,所有位于集群節點的元素均被納入RDD中。形成RDD具體方式是:通過Hadoop以及對此類文件予以支持的系統形成,此外,通過轉換其他RDD也可以獲得。
集群節點是RDD的具體分布位置,其構成元素均具有只讀性,如果部分數據由于某節點的功能失效而遺失,在重新對數據進行構建時可以將lineage作為Spark的依據,對算子在RDD構建過程中所經歷的轉換過程進行記錄是血統的工作原理,從而為遺失分區的恢復提供便利。在對算子進行轉換時Spark會在內存中緩存相應的結果,新的RDD由此形成,隨后便可以直接讀取緩存在內存中的相關操作,在磁盤中緩存兩個Job的步驟可以省略,使運行速度顯著提升。通過抽象化處理數據集獲得了RDD,基于此,在轉換時僅能實現粗粒度。但在分析數據時,并行數據方式仍然可以被RDD很好適應,將相同操作執行在不同記錄上是此類應用顯著特征,具體包括機器學習等。
由于Spark框架對RDD的操作算子都是基于數據分區進行粗粒度的操作處理,每個轉換算子操作過后都會產生一個新的RDD,因此RDD之間會形成一個前后依賴關系。
Narrow Dependencies和WideDependencies即窄依賴和寬依賴構成了Spark的依賴形式。使用某個父RDD的權限僅被賦予單獨的子RDD時,被稱之為窄依賴;反之,如果可以由多個子RDD同時使用,則被稱之為寬依賴。由于依賴不具有多重性,因此,處理相應分區時,窄依賴的各個節點均可以進行多次,在對不同轉換算子進行操作時,數據不需要同其他分區進行交換,進而對傳輸耗時有效降低,并對相關效率大幅度提升;由于依賴具有多重性,因此在處理下一步驟前,必須要完成全部節點的算子轉換,此外,還要將數據傳送到相應分區中,不但會占有大量節點,并且延遲了數據傳輸。窄依賴是RDD C,D,F間具有的關系,基于此,在優化其DAG的過程中,Spark會重新對pipeline進行組合,map等算子的操作區間僅位于SparkEx-ecutor上。寬依賴是RDD A,B,G所具有的關系,因此要執行join算子必須在位于Spark Executor分區中的groupBy算子全部執行完畢時才能夠得到允許,此外,還需要通過網絡對傳輸相關數據,導致執行時間延遲。
2.3Spark生態
SparkCore為整個生態的核心,其他組件有SparkStreaming、SparkSQL、MLlib、GraphX。SparkStreaming在生態中用于處理流式數據,同時又能和其他三大組件無縫集合;SparkSQL擅長處理結構化數據的Spark生態成員,是一個分布式SQL查詢引擎,它提供了一個DataFrame的數據模型。對RDD等方面進行整體性處理是SparkSQL最具代表性的特征,如此,查詢HQL或SQL的工作難度被大幅度降低,并且分析復雜數據的工作也可以同時完成。Spark平臺提供的圖計算和圖挖掘接口是GraphX的基礎,極大方便了大家對分布式圖處理的需求。MLlib是機器學習的算法包,里面包含了一些常用的機器學習算法和處理工具,如分類、回歸、聚類等。
3Hadoop、Spark比較
Hadoop較早成為大數據行業應用最廣泛的應用框架,但近些年Spark大有超越Hadoop的趨勢。主要原因在于相比于Hadoop,Spark最大的優勢在于“快”。因為Spark的計算是基于內存的,而Hadoop的MapReduce計算模型涉及大量磁盤讀寫,10開銷巨大,尤其是涉及迭代的情況,高延時的缺點更加突出,這就決定了Hadoop只能適合于對實時性要求不高的批處理應用場景。其次,Spark開發多使用Scala,代碼量要比Hadoop簡潔很多。最后,在機器學習和數據挖掘算法方面,Spark提供的MLlib使得國內外的研究重點紛紛轉移至了Spark。但Spark也僅僅是在計算模型方面可以代替MapReduce,還不能使用Hadoop進行完全替代。
隨著有關方面發展速度的不斷提升,構成Hadoop與Speark的軟件生態系統所涵蓋的子項目數量均有所增加,同時還在不斷被優化、拓展。兩者各有優點,因此各個企業更多的是將兩者結合起來統一部署,通過Yarn實現整體調度和管理,從而最大程度發揮各自的優勢。
4展望
在最近幾年的快速發展下,無論Hadoop還是Spark,均已經成為一個包含多個子項目的軟件生態系統,并且還在不斷被優化、拓展。兩者各有優點,因此各個企業更多的是將兩者結合起來統一部署,通過Yarn實現整體調度和管理,從而最大程度發揮各自的優勢。