- Spark編程基礎
- 林子雨 賴永炫 陶繼平
- 5385字
- 2020-09-18 18:33:46
1.2 代表性大數據技術
大數據技術的發展步伐很快,不斷有新的技術涌現,這里著重介紹幾種目前市場上具有代表性的一些大數據技術,包括Hadoop、Spark、Flink、Beam等。
1.2.1 Hadoop
Hadoop是Apache軟件基金會旗下的一個開源分布式計算平臺,為用戶提供了系統底層細節透明的分布式計算架構。Hadoop是基于Java語言開發的,具有很好的跨平臺特性,并且可以部署在廉價的計算機集群中。Hadoop的核心是分布式文件系統(Hadoop Distributed File System,HDFS)和MapReduce。借助于Hadoop,程序員可以輕松地編寫分布式并行程序,將其運行在廉價的計算機集群上,完成海量數據的存儲與計算。經過多年的發展,Hadoop生態系統不斷完善和成熟,目前已經包含多個子項目(見圖1-1)。除了核心的HDFS和MapReduce以外,Hadoop生態系統還包括YARN、Zookeeper、HBase、Hive、Pig、Mahout、Sqoop、Flume、Ambari等功能組件。

圖1-1 Hadoop生態系統
這里簡要介紹一下這些組件的功能,要了解Hadoop的更多細節內容,可以訪問本教材官網,學習《大數據技術原理與應用》在線視頻的內容。
1. HDFS
Hadoop分布式文件系統HDFS是針對谷歌分布式文件系統(Google File System,GFS)的開源實現,它是Hadoop兩大核心組成部分之一,提供了在廉價服務器集群中進行大規模分布式文件存儲的能力。HDFS具有很好的容錯能力,并且兼容廉價的硬件設備,因此,可以以較低的成本利用現有機器實現大流量和大數據量的讀寫。
HDFS采用了主從(Master/Slave)結構模型,一個HDFS集群包括一個名稱節點和若干個數據節點(見圖1-2)。名稱節點作為中心服務器,負責管理文件系統的命名空間及客戶端對文件的訪問。集群中的數據節點一般是一個節點運行一個數據節點進程,負責處理文件系統客戶端的讀/寫請求,在名稱節點的統一調度下進行數據塊的創建、刪除和復制等操作。

圖1-2 HDFS的體系結構
用戶在使用HDFS時,仍然可以像在普通文件系統中那樣,使用文件名去存儲和訪問文件。實際上,在系統內部,一個文件會被切分成若干個數據塊,這些數據塊被分布存儲到若干個數據節點上。當客戶端需要訪問一個文件時,首先把文件名發送給名稱節點,名稱節點根據文件名找到對應的數據塊(一個文件可能包括多個數據塊),再根據每個數據塊信息找到實際存儲各個數據塊的數據節點的位置,并把數據節點位置發送給客戶端,最后,客戶端直接訪問這些數據節點獲取數據。在整個訪問過程中,名稱節點并不參與數據的傳輸。這種設計方式,使得一個文件的數據能夠在不同的數據節點上實現并發訪問,大大提高了數據的訪問速度。
2. MapReduce
MapReduce是一種分布式并行編程模型,用于大規模數據集(大于1TB)的并行運算,它將復雜的、運行于大規模集群上的并行計算過程高度抽象到兩個函數:Map和Reduce。MapReduce極大方便了分布式編程工作,編程人員在不會分布式并行編程的情況下,也可以很容易將自己的程序運行在分布式系統上,完成海量數據集的計算。
在MapReduce中(見圖1-3),一個存儲在分布式文件系統中的大規模數據集,會被切分成許多獨立的小數據塊,這些小數據塊可以被多個Map任務并行處理。MapReduce框架會為每個Map任務輸入一個數據子集,Map任務生成的結果會繼續作為Reduce任務的輸入,最終由Reduce任務輸出最后結果,并寫入分布式文件系統。

圖1-3 MapReduce的工作流程
MapReduce設計的一個理念就是“計算向數據靠攏”,而不是“數據向計算靠攏”,因為移動數據需要大量的網絡傳輸開銷,尤其是在大規模數據環境下,這種開銷尤為驚人,所以,移動計算要比移動數據更加經濟。本著這個理念,在一個集群中,只要有可能,MapReduce框架就會將Map程序就近地在HDFS數據所在的節點運行,即將計算節點和存儲節點放在一起運行,從而減少了節點間的數據移動開銷。
3. YARN
YARN是負責集群資源調度管理的組件。YARN的目標就是實現“一個集群多個框架”,即在一個集群上部署一個統一的資源調度管理框架YARN,在YARN之上可以部署其他各種計算框架(見圖1-4),比如MapReduce、Tez、Storm、Giraph、Spark、OpenMPI等,由YARN為這些計算框架提供統一的資源調度管理服務(包括CPU、內存等資源),并且能夠根據各種計算框架的負載需求,調整各自占用的資源,實現集群資源共享和資源彈性收縮。通過這種方式,可以實現一個集群上的不同應用負載混搭,有效提高了集群的利用率,同時,不同計算框架可以共享底層存儲,在一個集群上集成多個數據集,使用多個計算框架來訪問這些數據集,從而避免了數據集跨集群移動,最后,這種部署方式也大大降低了企業運維成本。目前,可以運行在YARN之上的計算框架包括離線批處理框架MapReduce、內存計算框架Spark、流計算框架Storm和DAG計算框架Tez等。和YARN一樣提供類似功能的其他資源管理調度框架還包括Mesos、Torca、Corona、Borg等。

圖1-4 在YARN上部署各種計算框架
4. HBase
HBase是針對谷歌BigTable的開源實現,是一個高可靠、高性能、面向列、可伸縮的分布式數據庫,主要用來存儲非結構化和半結構化的松散數據。HBase可以支持超大規模數據存儲,它可以通過水平擴展的方式,利用廉價計算機集群處理由超過10億行元素和數百萬列元素組成的數據表。
圖1-5描述了Hadoop生態系統中HBase與其他部分的關系。HBase利用MapReduce來處理HBase中的海量數據,實現高性能計算;利用Zookeeper作為協同服務,實現穩定服務和失敗恢復;使用HDFS作為高可靠的底層存儲,利用廉價集群提供海量數據存儲能力,當然,HBase也可以在單機模式下使用,直接使用本地文件系統而不用HDFS作為底層數據存儲方式,不過,為了提高數據可靠性和系統的健壯性,發揮HBase處理大量數據等功能,一般都使用HDFS作為HBase的底層數據存儲方式。此外,為了方便在HBase上進行數據處理,Sqoop為HBase提供了高效、便捷的RDBMS數據導入功能,Pig和Hive為HBase提供了高層語言支持。

圖1-5 Hadoop生態系統中HBase與其他部分的關系
5. Hive
Hive是一個基于Hadoop的數據倉庫工具,可以用于對存儲在Hadoop文件中的數據集進行數據整理、特殊查詢和分析處理。Hive的學習門檻比較低,因為它提供了類似于關系數據庫SQL語言的查詢語言——HiveQL,可以通過HiveQL語句快速實現簡單的MapReduce統計,Hive自身可以自動將HiveQL語句快速轉換成MapReduce任務進行運行,而不必開發專門的MapReduce應用程序,因而十分適合數據倉庫的統計分析。
6. Flume
Flume是Cloudera公司開發的一個高可用的、高可靠的、分布式的海量日志采集、聚合和傳輸系統。Flume支持在日志系統中定制各類數據發送方,用于收集數據;同時,Flume提供對數據進行簡單處理,并寫到各種數據接收方的能力。
7. Sqoop
Sqoop是SQL-to-Hadoop的縮寫,主要用來在Hadoop和關系數據庫之間交換數據,可以改進數據的互操作性。通過Sqoop,可以方便地將數據從MySQL、Oracle、PostgreSQL等關系數據庫中導入Hadoop(比如導入到HDFS、HBase或Hive中),或者將數據從Hadoop導出到關系數據庫,使得傳統關系數據庫和Hadoop之間的數據遷移變得非常方便。
1.2.2 Spark
1. Spark簡介
Spark最初誕生于美國加州大學伯克利分校的AMP實驗室,是一個可應用于大規模數據處理的快速、通用引擎,如今是Apache軟件基金會下的頂級開源項目之一。Spark最初的設計目標是使數據分析更快——不僅運行速度快,也要能快速、容易地編寫程序。為了使程序運行更快,Spark提供了內存計算和基于DAG的任務調度執行機制,減少了迭代計算時的I/O開銷;而為了使編寫程序更為容易,Spark使用簡練、優雅的Scala語言編寫,基于Scala提供了交互式的編程體驗。同時,Spark支持Scala、Java、Python、R等多種編程語言。
Spark的設計遵循“一個軟件棧滿足不同應用場景”的理念,逐漸形成了一套完整的生態系統,既能夠提供內存計算框架,也可以支持SQL即席查詢(Spark SQL)、流式計算(Spark Streaming)、機器學習(MLlib)和圖計算(GraphX)等。Spark可以部署在資源管理器YARN之上,提供一站式的大數據解決方案。因此,Spark所提供的生態系統同時支持批處理、交互式查詢和流數據處理。
2. Spark與Hadoop的對比
Hadoop雖然已成為大數據技術的事實標準,但其本身還存在諸多缺陷,最主要的缺陷是MapReduce計算模型延遲過高,無法勝任實時、快速計算的需求,因而只適用于離線批處理的應用場景。總體而言,Hadoop中的MapReduce計算框架主要存在以下缺點:
? 表達能力有限。計算都必須要轉化成Map和Reduce兩個操作,但這并不適合所有的情況,難以描述復雜的數據處理過程;
? 磁盤I/O開銷大。每次執行時都需要從磁盤讀取數據,并且在計算完成后需要將中間結果寫入到磁盤中,I/O開銷較大;
? 延遲高。一次計算可能需要分解成一系列按順序執行的MapReduce任務,任務之間的銜接由于涉及I/O開銷,會產生較高延遲。而且,在前一個任務執行完成之前,其他任務無法開始,因此,難以勝任復雜、多階段的計算任務。
Spark在借鑒MapReduce優點的同時,很好地解決了MapReduce所面臨的問題。相比于MapReduce,Spark主要具有如下優點:
? Spark的計算模式也屬于MapReduce,但不局限于Map和Reduce操作,還提供了多種數據集操作類型,編程模型比MapReduce更靈活;
? Spark提供了內存計算,中間結果直接放到內存中,帶來了更高的迭代運算效率;
? Spark基于DAG的任務調度執行機制,要優于MapReduce的迭代執行機制。
如圖1-6所示,對比Hadoop MapReduce與Spark的執行流程,可以看到,Spark最大的特點就是將計算數據、中間結果都存儲在內存中,大大減少了I/O開銷,因而,Spark更適合于迭代運算比較多的數據挖掘與機器學習運算。

圖1-6 Hadoop MapReduce與Spark的執行流程對比
使用Hadoop MapReduce進行迭代計算非常耗資源,因為每次迭代都需要從磁盤中寫入、讀取中間數據,I/O開銷大。而Spark將數據載入內存后,之后的迭代計算都可以直接使用內存中的中間結果作運算,避免了從磁盤中頻繁讀取數據。如圖1-7所示,Hadoop與Spark在執行邏輯斯蒂回歸(Logistic Regression)時所需的時間相差巨大。

圖1-7 Hadoop與Spark執行邏輯斯蒂回歸的時間對比
在實際進行開發時,使用Hadoop需要編寫不少相對底層的代碼,不夠高效。相對而言,Spark提供了多種高層次、簡潔的API,通常情況下,對于實現相同功能的應用程序,Spark的代碼量要比Hadoop少很多。更重要的是,Spark提供了實時交互式編程反饋,可以方便地驗證、調整算法。
近年來,大數據機器學習和數據挖掘的并行化算法研究,成為大數據領域一個較為重要的研究熱點。在Spark崛起之前,學術界和業界普遍關注的是Hadoop平臺上的并行化算法設計。但是,MapReduce的網絡和磁盤讀寫開銷大,難以高效地實現需要大量迭代計算的機器學習并行化算法。因此,近年來國內外的研究重點開始轉向到如何在Spark平臺上實現各種機器學習和數據挖掘的并行化算法設計。為了方便一般應用領域的數據分析人員,使用熟悉的R語言在Spark平臺上完成數據分析,Spark提供了一個稱為Spark R的編程接口,使得一般應用領域的數據分析人員,可以在R語言的環境里方便地使用Spark的并行化編程接口和強大計算能力。
3. Spark與Hadoop的統一部署
Spark正以其結構一體化、功能多元化的優勢,逐漸成為當今大數據領域最熱門的大數據計算平臺。目前,越來越多的企業放棄MapReduce,轉而使用Spark開發企業應用。但是,需要指出的是,Spark作為計算框架,只是取代了Hadoop生態系統中的計算框架MapReduce,而Hadoop中的其他組件依然在企業大數據系統中發揮著重要的作用。比如,企業依然需要依賴Hadoop分布式文件系統HDFS和分布式數據庫HBase,來實現不同類型數據的存儲和管理,并借助于YARN實現集群資源的管理和調度。因此,在許多企業實際應用中,Hadoop和Spark的統一部署是一種比較現實合理的選擇。由于MapReduce、Storm和Spark等,都可以運行在資源管理框架YARN之上,因此,可以在YARN之上統一部署各個計算框架(見圖1-8)。這些不同的計算框架統一運行在YARN中,具有以下幾個優點:
? 計算資源按需伸縮;
? 不用負載應用混搭,集群利用率高;
? 共享底層存儲,避免數據跨集群遷移。

圖1-8 Hadoop和Spark的統一部署
1.2.3 Flink
Flink是Apache軟件基金會的頂級項目之一,是一個針對流數據和批數據的分布式計算框架,設計思想主要來源于Hadoop、MPP數據庫、流計算系統等。Flink主要是由Java代碼實現的,目前主要還是依靠開源社區的貢獻而發展。Flink所要處理的主要場景是流數據,批數據只是流數據的一個特例而已,也就是說,Flink會把所有任務當成流來處理。Flink可以支持本地的快速迭代以及一些環形的迭代任務。
Flink以層級式系統形式組建其軟件棧(見圖1-9),不同層的棧建立在其下層基礎上。具體而言,Flink的典型特性如下:
? 提供了面向流處理的DataStream API和面向批處理的DataSet API。DataSet API支持Java、Scala和Python,DataStream API支持Java和Scala;
? 提供了多種候選部署方案,比如本地模式(Local)、集群模式(Cluster)和云模式(Cloud)。對于集群模式而言,可以采用獨立模式(Standalone)或者YARN;
? 提供了一些類庫,包括Table(處理邏輯表查詢)、FlinkML(機器學習)、Gelly(圖像處理)和CEP(復雜事件處理);
? 提供了較好的Hadoop兼容性,不僅可以支持YARN,還可以支持HDFS、HBase等數據源。

圖1-9 Flink架構圖
Flink和Spark一樣,都是基于內存的計算框架,因此,都可以獲得較好的實時計算性能。當全部運行在Hadoop YARN之上時,Flink的性能甚至還要略好于Spark,因為,Flink支持增量迭代,具有對迭代進行自動優化的功能。Flink和Spark都支持流計算,二者的區別在于,Flink是一行一行地處理數據,而Spark是基于RDD的小批量處理,所以,Spark在流式處理方面,不可避免地會增加一些延時,實時性沒有Flink好。Flink的流計算性能和Storm差不多,可以支持毫秒級的響應,而Spark則只能支持秒級響應。總體而言,Flink和Spark都是非常優秀的基于內存的分布式計算框架,但是,Spark的市場影響力和社區活躍度明顯超過Flink,這在一定程度上限制了Flink的發展空間。
1.2.4 Beam
Beam是由谷歌貢獻的Apache頂級項目,是一個開源的統一的編程模型,開發者可以使用Beam SDK來創建數據處理管道,然后,這些程序可以在任何支持的執行引擎上運行,比如運行在Spark、Flink上。如圖1-10所示,終端用戶用Beam來實現自己所需的流計算功能,使用的終端語言可能是Python、Java等,Beam為每種語言提供了一個對應的SDK,用戶可以使用相應的SDK創建數據處理管道,用戶寫出的程序可以被運行在各個Runner上,每個Runner都實現了從Beam管道到平臺功能的映射。通過這種方式,Beam使用一套高層抽象的API屏蔽了多種計算引擎的區別,開發者只需要編寫一套代碼就可以運行在不同的計算引擎之上。

圖1-10 Beam使用一套高層抽象的API屏蔽多種計算引擎的區別
Beam是2017年發布的Apache項目,由于誕生時間較短,目前市場接受度有限,尚未形成廣泛影響力,是否能夠最終獲得市場認可,還有待時間的檢驗。