- Spark核心技術與高級應用
- 于俊等
- 216字
- 2019-01-01 01:24:30
1.2 Spark的重要擴展
大家知道,在Hadoop中完成即席查詢(ad-hoc queries)、批處理(batch processing),流式處理(stream processing),需要構建不同的團隊,每個團隊需要不同的技術和經驗,很難做到共享。而Spark實現了平臺融合,一個基礎平臺解決所有的問題,一個團隊擁有相同的技術和經驗完成所有的任務。
基于Spark的基礎平臺擴展了5個主要的Spark庫,包括支持結構化數據的Spark SQL、處理實時數據的Spark Streaming、用于機器學習的MLlib、用于圖計算的GraphX、用于統計分析的SparkR,各種程序庫與Spark核心API高度整合在一起,并在持續不斷改進。
1.2.1 Spark SQL和DataFrame
Spark SQL是Spark的一個處理結構化數據的模塊,提供一個DataFrame編程抽象。它可以看作是一個分布式SQL查詢引擎,主要由Catalyst優化、Spark SQL內核、Hive支持三部分組成。
相對于傳統的MapReduce API,Spark的RDD API有了數量級的飛躍,從Spark SQL 1.3.0開始,在原有SchemaRDD的基礎上提供了與R風格類似的DataFrame API。
DataFrame是以指定列(named columns)組織的分布式數據集合,在Spark SQL中,相當于關系數據庫的一個表,或R/Python的一個數據框架,但后臺更加優化。
DataFrames支持多種數據源構建,包括:結構化數據文件(Parquet、JSON)加載、Hive表讀取、外部數據庫讀取、現有RDD轉化,以及SQLContext運行SQL查詢結果創建DataFrame,如圖1-4所示。

圖1-4 DataFrame數據來源
新的DataFrame API一方面大幅度降低了開發者學習門檻,同時支持Scala、Java、Python和R語言,且支持通過Spark Shell、Pyspark Shell和SparkR Shell提交任務。由于來源于SchemaRDD,DataFrame天然適用于分布式大數據場景。
關于Spark SQL更具體的內容和案例會在后面第6章詳細介紹。
1.2.2 Spark Streaming
Spark Streaming屬于核心Spark API的擴展,它支持高吞吐量和容錯的實時流數據處理,它可以接受來自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的數據源,使用復雜的算法表達和高級功能來進行處理,如Map、Reduce、Join、Window等,處理的結果數據能夠存入文件系統、數據庫。還可以直接使用內置的機器學習算法、圖形處理算法來處理數據,數據輸入/輸出示意圖如圖1-5所示。

圖1-5 基于Spark Streaming的數據輸入/輸出示意圖
Spark Streaming的數據處理流程如圖1-6所示,接收到實時數據后,首先對數據進行分批次處理,然后傳給Spark Engine處理,最后生成該批次最后的結果。

圖1-6 基于Spark Streaming的數據處理流程
Spark Streaming提供一種名為離散流(DStream)的高級抽象連續數據流。DStream直接支持Kafka、Flume的數據源創建,或者通過高級操作其他DStream創建,一個DStream是一個序列化的RDD。
關于Spark Streaming更具體的內容和案例會在第7章詳細介紹。
1.2.3 Spark MLlib和ML
MLlib是Spark對常用的機器學習算法的實現庫,同時包括相關的測試和數據生成器。MLlib目前支持4種常見的機器學習問題:二元分類、回歸、聚類和協同過濾,以及一個底層的梯度下降優化基礎算法。
MLlib基于RDD,天生就可以與Spark SQL、GraphX、Spark Streaming無縫集成,MLlib是MLBase的一部分,MLBase通過邊界定義,力圖將MLBase打造成一個機器學習平臺,讓機器學習開發的門檻更低,讓一些并不了解機器學習的用戶也能方便地使用MLBase這個工具來處理自己的數據。
MLlib支持將本地向量和矩陣存儲在單個機器中,也包括有一個或更多的RDD支持的分布式矩陣。在目前的實現中,本地向量和矩陣都是為公共接口服務的簡單數據模式,MLlib使用了線性代數包Breeze。在監督學習中使用到的樣本在MLlib中成為標記點。
Spark MLlib架構由底層基礎、算法庫和應用程序三部分構成。底層基礎包括Spark的運行庫、進行線性代數相關技術的矩陣庫和向量庫。算法庫包括Spark MLlib實現的具體機器學習算法,以及為這些算法提供的各類評估方法;主要實現算法包括建立在廣義線性回歸模型的分類和回歸,以及協同過濾、聚類和決策樹。在最新的Spark 1.5.0版本中還新增了基于前饋神經網絡的分類器算法MultilayerPerceptronClassif ier(MLPC),頻繁項挖掘算法Pref ixSpan、AssociationRules,實現Kolmogorov-Smirnov檢驗等等算法,隨著版本的演進,算法庫也會越來越強大。應用程序包括測試數據的生成以及外部數據的加載等功能。
Spark的ML庫基于DataFrame提供高性能API,幫助用戶創建和優化實用的機器學習流水線(pipeline),包括特征轉換獨有的Pipelines API。相比較MLlib,變化主要體現在:
1)從機器學習的Library開始轉向構建一個機器學習工作流的系統,ML把整個機器學習的過程抽象成Pipeline,一個Pipeline是由多個Stage組成,每個Stage是Transformer或者Estimator。
2)ML框架下所有的數據源都是基于DataFrame,所有模型也盡量都基于Spark的數據類型表示,ML的API操作也從RDD向DataFrame全面轉變。
關于MLlib和ML庫更具體的內容和案例會在第8章詳細介紹。
1.2.4 GraphX
從社交網絡到語言建模,圖數據規模和重要性的不斷增長,推動了數不清的新型并行圖系統(例如,Giraph和GraphLab)的發展。通過限制可以表達的計算類型和引入新的技術來分割和分發圖,這些系統可以以高于普通的數據并行系統幾個數量級的速度執行復雜的圖算法,如圖1-7所示。

圖1-7 基于GraphX的并行圖計算與其他方式的比較
GraphX是用于圖和并行圖計算的新Spark API。從上層來看,GraphX通過引入彈性分布式屬性圖(resilient distributed property graph)擴展了Spark RDD。這種圖是一種偽圖,圖中的每個邊和節點都有對應的屬性。
為了支持圖計算,GraphX給出了一系列基礎的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的優化變體。除此之外,GraphX還包含了一個不斷擴展的圖算法和構建器集合,以便簡化圖分析的任務。
關于GraphX更具體的內容和案例會在第9章中詳細介紹。
1.2.5 SparkR
SparkR是AMPLab發布的一個R開發包,為Apache Spark提供了輕量的前端。SparkR提供了Spark中彈性分布式數據集(RDD)的API,用戶可以在集群上通過R shell交互性地運行Job。例如,我們可以在HDFS上讀取或寫入文件,也可以使用lapply函數進行方法調用,定義對應每一個RDD元素的運算。
Spark具有快速(fast)、可擴展(scalable)、交互(interactive)的特點,R具有統計(statistics)、繪圖(plots)的優勢,R和Spark的有效結合,解決了R語言中無法級聯擴展的難題,也極大地豐富了Spark在機器學習方面能夠使用的Lib庫。
除了常見的RDD函數式算子Reduce、reduceByKey、groupByKey和Collect之外,SparkR也支持利用lapplyWithPartition對每個RDD的分區進行操作。SparkR也支持常見的閉包(closure)功能:用戶定義的函數中所引用到的變量會自動被發送到集群中的其他的機器上。
SparkR的工作原理如圖1-8所示,首先加載R方法包和rJava包,然后通過SparkR初始化SparkContext。

圖1-8 SparkR工作原理
關于SparkR處理數據挖掘更具體的內容和案例會在第10章詳細介紹。
- Python數據分析入門:從數據獲取到可視化
- 劍破冰山:Oracle開發藝術
- Spark大數據分析實戰
- SQL查詢:從入門到實踐(第4版)
- 數據庫系統原理及應用教程(第4版)
- Python數據分析:基于Plotly的動態可視化繪圖
- Flutter Projects
- INSTANT Android Fragmentation Management How-to
- Oracle數據庫管理、開發與實踐
- 大數據技術原理與應用:概念、存儲、處理、分析與應用
- Unity Game Development Blueprints
- ECharts數據可視化:入門、實戰與進階
- Arquillian Testing Guide
- 數字化轉型方法論:落地路徑與數據中臺
- Access 2007數據庫應用