官术网_书友最值得收藏!

1.2 Spark的重要擴展

大家知道,在Hadoop中完成即席查詢(ad-hoc queries)、批處理(batch processing),流式處理(stream processing),需要構(gòu)建不同的團隊,每個團隊需要不同的技術(shù)和經(jīng)驗,很難做到共享。而Spark實現(xiàn)了平臺融合,一個基礎(chǔ)平臺解決所有的問題,一個團隊擁有相同的技術(shù)和經(jīng)驗完成所有的任務(wù)。

基于Spark的基礎(chǔ)平臺擴展了5個主要的Spark庫,包括支持結(jié)構(gòu)化數(shù)據(jù)的Spark SQL、處理實時數(shù)據(jù)的Spark Streaming、用于機器學習的MLlib、用于圖計算的GraphX、用于統(tǒng)計分析的SparkR,各種程序庫與Spark核心API高度整合在一起,并在持續(xù)不斷改進。

1.2.1 Spark SQL和DataFrame

Spark SQL是Spark的一個處理結(jié)構(gòu)化數(shù)據(jù)的模塊,提供一個DataFrame編程抽象。它可以看作是一個分布式SQL查詢引擎,主要由Catalyst優(yōu)化、Spark SQL內(nèi)核、Hive支持三部分組成。

相對于傳統(tǒng)的MapReduce API,Spark的RDD API有了數(shù)量級的飛躍,從Spark SQL 1.3.0開始,在原有SchemaRDD的基礎(chǔ)上提供了與R風格類似的DataFrame API。

DataFrame是以指定列(named columns)組織的分布式數(shù)據(jù)集合,在Spark SQL中,相當于關(guān)系數(shù)據(jù)庫的一個表,或R/Python的一個數(shù)據(jù)框架,但后臺更加優(yōu)化。

DataFrames支持多種數(shù)據(jù)源構(gòu)建,包括:結(jié)構(gòu)化數(shù)據(jù)文件(Parquet、JSON)加載、Hive表讀取、外部數(shù)據(jù)庫讀取、現(xiàn)有RDD轉(zhuǎn)化,以及SQLContext運行SQL查詢結(jié)果創(chuàng)建DataFrame,如圖1-4所示。

圖1-4 DataFrame數(shù)據(jù)來源

新的DataFrame API一方面大幅度降低了開發(fā)者學習門檻,同時支持Scala、Java、Python和R語言,且支持通過Spark Shell、Pyspark Shell和SparkR Shell提交任務(wù)。由于來源于SchemaRDD,DataFrame天然適用于分布式大數(shù)據(jù)場景。

關(guān)于Spark SQL更具體的內(nèi)容和案例會在后面第6章詳細介紹。

1.2.2 Spark Streaming

Spark Streaming屬于核心Spark API的擴展,它支持高吞吐量和容錯的實時流數(shù)據(jù)處理,它可以接受來自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的數(shù)據(jù)源,使用復(fù)雜的算法表達和高級功能來進行處理,如Map、Reduce、Join、Window等,處理的結(jié)果數(shù)據(jù)能夠存入文件系統(tǒng)、數(shù)據(jù)庫。還可以直接使用內(nèi)置的機器學習算法、圖形處理算法來處理數(shù)據(jù),數(shù)據(jù)輸入/輸出示意圖如圖1-5所示。

圖1-5 基于Spark Streaming的數(shù)據(jù)輸入/輸出示意圖

Spark Streaming的數(shù)據(jù)處理流程如圖1-6所示,接收到實時數(shù)據(jù)后,首先對數(shù)據(jù)進行分批次處理,然后傳給Spark Engine處理,最后生成該批次最后的結(jié)果。

圖1-6 基于Spark Streaming的數(shù)據(jù)處理流程

Spark Streaming提供一種名為離散流(DStream)的高級抽象連續(xù)數(shù)據(jù)流。DStream直接支持Kafka、Flume的數(shù)據(jù)源創(chuàng)建,或者通過高級操作其他DStream創(chuàng)建,一個DStream是一個序列化的RDD。

關(guān)于Spark Streaming更具體的內(nèi)容和案例會在第7章詳細介紹。

1.2.3 Spark MLlib和ML

MLlib是Spark對常用的機器學習算法的實現(xiàn)庫,同時包括相關(guān)的測試和數(shù)據(jù)生成器。MLlib目前支持4種常見的機器學習問題:二元分類、回歸、聚類和協(xié)同過濾,以及一個底層的梯度下降優(yōu)化基礎(chǔ)算法。

MLlib基于RDD,天生就可以與Spark SQL、GraphX、Spark Streaming無縫集成,MLlib是MLBase的一部分,MLBase通過邊界定義,力圖將MLBase打造成一個機器學習平臺,讓機器學習開發(fā)的門檻更低,讓一些并不了解機器學習的用戶也能方便地使用MLBase這個工具來處理自己的數(shù)據(jù)。

MLlib支持將本地向量和矩陣存儲在單個機器中,也包括有一個或更多的RDD支持的分布式矩陣。在目前的實現(xiàn)中,本地向量和矩陣都是為公共接口服務(wù)的簡單數(shù)據(jù)模式,MLlib使用了線性代數(shù)包Breeze。在監(jiān)督學習中使用到的樣本在MLlib中成為標記點。

Spark MLlib架構(gòu)由底層基礎(chǔ)、算法庫和應(yīng)用程序三部分構(gòu)成。底層基礎(chǔ)包括Spark的運行庫、進行線性代數(shù)相關(guān)技術(shù)的矩陣庫和向量庫。算法庫包括Spark MLlib實現(xiàn)的具體機器學習算法,以及為這些算法提供的各類評估方法;主要實現(xiàn)算法包括建立在廣義線性回歸模型的分類和回歸,以及協(xié)同過濾、聚類和決策樹。在最新的Spark 1.5.0版本中還新增了基于前饋神經(jīng)網(wǎng)絡(luò)的分類器算法MultilayerPerceptronClassif ier(MLPC),頻繁項挖掘算法Pref ixSpan、AssociationRules,實現(xiàn)Kolmogorov-Smirnov檢驗等等算法,隨著版本的演進,算法庫也會越來越強大。應(yīng)用程序包括測試數(shù)據(jù)的生成以及外部數(shù)據(jù)的加載等功能。

Spark的ML庫基于DataFrame提供高性能API,幫助用戶創(chuàng)建和優(yōu)化實用的機器學習流水線(pipeline),包括特征轉(zhuǎn)換獨有的Pipelines API。相比較MLlib,變化主要體現(xiàn)在:

1)從機器學習的Library開始轉(zhuǎn)向構(gòu)建一個機器學習工作流的系統(tǒng),ML把整個機器學習的過程抽象成Pipeline,一個Pipeline是由多個Stage組成,每個Stage是Transformer或者Estimator。

2)ML框架下所有的數(shù)據(jù)源都是基于DataFrame,所有模型也盡量都基于Spark的數(shù)據(jù)類型表示,ML的API操作也從RDD向DataFrame全面轉(zhuǎn)變。

關(guān)于MLlib和ML庫更具體的內(nèi)容和案例會在第8章詳細介紹。

1.2.4 GraphX

從社交網(wǎng)絡(luò)到語言建模,圖數(shù)據(jù)規(guī)模和重要性的不斷增長,推動了數(shù)不清的新型并行圖系統(tǒng)(例如,Giraph和GraphLab)的發(fā)展。通過限制可以表達的計算類型和引入新的技術(shù)來分割和分發(fā)圖,這些系統(tǒng)可以以高于普通的數(shù)據(jù)并行系統(tǒng)幾個數(shù)量級的速度執(zhí)行復(fù)雜的圖算法,如圖1-7所示。

圖1-7 基于GraphX的并行圖計算與其他方式的比較

GraphX是用于圖和并行圖計算的新Spark API。從上層來看,GraphX通過引入彈性分布式屬性圖(resilient distributed property graph)擴展了Spark RDD。這種圖是一種偽圖,圖中的每個邊和節(jié)點都有對應(yīng)的屬性。

為了支持圖計算,GraphX給出了一系列基礎(chǔ)的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的優(yōu)化變體。除此之外,GraphX還包含了一個不斷擴展的圖算法和構(gòu)建器集合,以便簡化圖分析的任務(wù)。

關(guān)于GraphX更具體的內(nèi)容和案例會在第9章中詳細介紹。

1.2.5 SparkR

SparkR是AMPLab發(fā)布的一個R開發(fā)包,為Apache Spark提供了輕量的前端。SparkR提供了Spark中彈性分布式數(shù)據(jù)集(RDD)的API,用戶可以在集群上通過R shell交互性地運行Job。例如,我們可以在HDFS上讀取或?qū)懭胛募部梢允褂胠apply函數(shù)進行方法調(diào)用,定義對應(yīng)每一個RDD元素的運算。

Spark具有快速(fast)、可擴展(scalable)、交互(interactive)的特點,R具有統(tǒng)計(statistics)、繪圖(plots)的優(yōu)勢,R和Spark的有效結(jié)合,解決了R語言中無法級聯(lián)擴展的難題,也極大地豐富了Spark在機器學習方面能夠使用的Lib庫。

除了常見的RDD函數(shù)式算子Reduce、reduceByKey、groupByKey和Collect之外,SparkR也支持利用lapplyWithPartition對每個RDD的分區(qū)進行操作。SparkR也支持常見的閉包(closure)功能:用戶定義的函數(shù)中所引用到的變量會自動被發(fā)送到集群中的其他的機器上。

SparkR的工作原理如圖1-8所示,首先加載R方法包和rJava包,然后通過SparkR初始化SparkContext。

圖1-8 SparkR工作原理

關(guān)于SparkR處理數(shù)據(jù)挖掘更具體的內(nèi)容和案例會在第10章詳細介紹。

主站蜘蛛池模板: 鄂托克前旗| 石河子市| 韶关市| 保康县| 宜州市| 温泉县| 文登市| 兴山县| 揭东县| 四子王旗| 利川市| 嘉峪关市| 高阳县| 南岸区| 烟台市| 界首市| 威信县| 雷山县| 丽江市| 桃江县| 周口市| 宜阳县| 江口县| 城固县| 冕宁县| 巨野县| 荣昌县| 淅川县| 津市市| 会同县| 固安县| 社旗县| 永安市| 郧西县| 新蔡县| 伊吾县| 屏南县| 泗水县| 连山| 东海县| 奉新县|