《Spark核心技术与高级应用》——1.2节Spark的重要扩展
本節(jié)書(shū)摘來(lái)自華章社區(qū)《Spark核心技術(shù)與高級(jí)應(yīng)用》一書(shū)中的第1章,第1.2節(jié)Spark的重要擴(kuò)展,作者于俊 向?!〈滗h 馬海平,更多章節(jié)內(nèi)容可以訪問(wèn)云棲社區(qū)“華章社區(qū)”公眾號(hào)查看
1.2 Spark的重要擴(kuò)展
大家知道,在Hadoop中完成即席查詢(ad-hoc queries)、批處理(batch processing),流式處理(stream processing),需要構(gòu)建不同的團(tuán)隊(duì),每個(gè)團(tuán)隊(duì)需要不同的技術(shù)和經(jīng)驗(yàn),很難做到共享。而Spark實(shí)現(xiàn)了平臺(tái)融合,一個(gè)基礎(chǔ)平臺(tái)解決所有的問(wèn)題,一個(gè)團(tuán)隊(duì)擁有相同的技術(shù)和經(jīng)驗(yàn)完成所有的任務(wù)。
基于Spark的基礎(chǔ)平臺(tái)擴(kuò)展了5個(gè)主要的Spark庫(kù),包括支持結(jié)構(gòu)化數(shù)據(jù)的Spark SQL、處理實(shí)時(shí)數(shù)據(jù)的Spark Streaming、用于機(jī)器學(xué)習(xí)的MLlib、用于圖計(jì)算的GraphX、用于統(tǒng)計(jì)分析的SparkR,各種程序庫(kù)與Spark核心API高度整合在一起,并在持續(xù)不斷改進(jìn)。
1.2.1 Spark SQL和DataFrame
Spark SQL是Spark的一個(gè)處理結(jié)構(gòu)化數(shù)據(jù)的模塊,提供一個(gè)DataFrame編程抽象。它可以看作是一個(gè)分布式SQL查詢引擎,主要由Catalyst優(yōu)化、Spark SQL內(nèi)核、Hive支持三部分組成。
相對(duì)于傳統(tǒng)的MapReduce API,Spark的RDD API有了數(shù)量級(jí)的飛躍,從Spark SQL 1.3.0開(kāi)始,在原有SchemaRDD的基礎(chǔ)上提供了與R風(fēng)格類(lèi)似的DataFrame API。
DataFrame是以指定列(named columns)組織的分布式數(shù)據(jù)集合,在Spark SQL中,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)的一個(gè)表,或R/Python的一個(gè)數(shù)據(jù)框架,但后臺(tái)更加優(yōu)化。
DataFrames支持多種數(shù)據(jù)源構(gòu)建,包括:結(jié)構(gòu)化數(shù)據(jù)文件(Parquet、JSON)加載、Hive表讀取、外部數(shù)據(jù)庫(kù)讀取、現(xiàn)有RDD轉(zhuǎn)化,以及SQLContext運(yùn)行SQL查詢結(jié)果創(chuàng)建DataFrame,如圖1-4所示。
新的DataFrame API一方面大幅度降低了開(kāi)發(fā)者學(xué)習(xí)門(mén)檻,同時(shí)支持Scala、Java、Python和R語(yǔ)言,且支持通過(guò)Spark Shell、Pyspark Shell和SparkR Shell提交任務(wù)。由于來(lái)源于SchemaRDD,DataFrame天然適用于分布式大數(shù)據(jù)場(chǎng)景。
關(guān)于Spark SQL更具體的內(nèi)容和案例會(huì)在后面第6章詳細(xì)介紹。
1.2.2 Spark Streaming
Spark Streaming屬于核心Spark API的擴(kuò)展,它支持高吞吐量和容錯(cuò)的實(shí)時(shí)流數(shù)據(jù)處理,它可以接受來(lái)自Kafka、Flume、Twitter、ZeroMQ或TCP Socket的數(shù)據(jù)源,使用復(fù)雜的算法表達(dá)和高級(jí)功能來(lái)進(jìn)行處理,如Map、Reduce、Join、Window等,處理的結(jié)果數(shù)據(jù)能夠存入文件系統(tǒng)、數(shù)據(jù)庫(kù)。還可以直接使用內(nèi)置的機(jī)器學(xué)習(xí)算法、圖形處理算法來(lái)處理數(shù)據(jù),數(shù)據(jù)輸入/輸出示意圖如圖1-5所示。
Spark Streaming提供一種名為離散流(DStream)的高級(jí)抽象連續(xù)數(shù)據(jù)流。DStream直接支持Kafka、Flume的數(shù)據(jù)源創(chuàng)建,或者通過(guò)高級(jí)操作其他DStream創(chuàng)建,一個(gè)DStream是一個(gè)序列化的RDD。
關(guān)于Spark Streaming更具體的內(nèi)容和案例會(huì)在第7章詳細(xì)介紹。
1.2.3 Spark MLlib和ML
MLlib是Spark對(duì)常用的機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn)庫(kù),同時(shí)包括相關(guān)的測(cè)試和數(shù)據(jù)生成器。MLlib目前支持4種常見(jiàn)的機(jī)器學(xué)習(xí)問(wèn)題:二元分類(lèi)、回歸、聚類(lèi)和協(xié)同過(guò)濾,以及一個(gè)底層的梯度下降優(yōu)化基礎(chǔ)算法。
MLlib基于RDD,天生就可以與Spark SQL、GraphX、Spark Streaming無(wú)縫集成,MLlib是MLBase的一部分,MLBase通過(guò)邊界定義,力圖將MLBase打造成一個(gè)機(jī)器學(xué)習(xí)平臺(tái),讓機(jī)器學(xué)習(xí)開(kāi)發(fā)的門(mén)檻更低,讓一些并不了解機(jī)器學(xué)習(xí)的用戶也能方便地使用MLBase這個(gè)工具來(lái)處理自己的數(shù)據(jù)。
MLlib支持將本地向量和矩陣存儲(chǔ)在單個(gè)機(jī)器中,也包括有一個(gè)或更多的RDD支持的分布式矩陣。在目前的實(shí)現(xiàn)中,本地向量和矩陣都是為公共接口服務(wù)的簡(jiǎn)單數(shù)據(jù)模式,MLlib使用了線性代數(shù)包Breeze。在監(jiān)督學(xué)習(xí)中使用到的樣本在MLlib中成為標(biāo)記點(diǎn)。
Spark MLlib架構(gòu)由底層基礎(chǔ)、算法庫(kù)和應(yīng)用程序三部分構(gòu)成。底層基礎(chǔ)包括Spark的運(yùn)行庫(kù)、進(jìn)行線性代數(shù)相關(guān)技術(shù)的矩陣庫(kù)和向量庫(kù)。算法庫(kù)包括Spark MLlib實(shí)現(xiàn)的具體機(jī)器學(xué)習(xí)算法,以及為這些算法提供的各類(lèi)評(píng)估方法;主要實(shí)現(xiàn)算法包括建立在廣義線性回歸模型的分類(lèi)和回歸,以及協(xié)同過(guò)濾、聚類(lèi)和決策樹(shù)。在最新的Spark 1.5.0版本中還新增了基于前饋神經(jīng)網(wǎng)絡(luò)的分類(lèi)器算法MultilayerPerceptronClassif?ier(MLPC),頻繁項(xiàng)挖掘算法Pref?ixSpan、AssociationRules,實(shí)現(xiàn)Kolmogorov-Smirnov檢驗(yàn)等等算法,隨著版本的演進(jìn),算法庫(kù)也會(huì)越來(lái)越強(qiáng)大。應(yīng)用程序包括測(cè)試數(shù)據(jù)的生成以及外部數(shù)據(jù)的加載等功能。
Spark的ML庫(kù)基于DataFrame提供高性能API,幫助用戶創(chuàng)建和優(yōu)化實(shí)用的機(jī)器學(xué)習(xí)流水線(pipeline),包括特征轉(zhuǎn)換獨(dú)有的Pipelines API。相比較MLlib,變化主要體現(xiàn)在:
1)從機(jī)器學(xué)習(xí)的Library開(kāi)始轉(zhuǎn)向構(gòu)建一個(gè)機(jī)器學(xué)習(xí)工作流的系統(tǒng),ML把整個(gè)機(jī)器學(xué)習(xí)的過(guò)程抽象成Pipeline,一個(gè)Pipeline是由多個(gè)Stage組成,每個(gè)Stage是Transformer或者Estimator。
2)ML框架下所有的數(shù)據(jù)源都是基于DataFrame,所有模型也盡量都基于Spark的數(shù)據(jù)類(lèi)型表示,ML的API操作也從RDD向DataFrame全面轉(zhuǎn)變。
關(guān)于MLlib和ML庫(kù)更具體的內(nèi)容和案例會(huì)在第8章詳細(xì)介紹。
1.2.4 GraphX
從社交網(wǎng)絡(luò)到語(yǔ)言建模,圖數(shù)據(jù)規(guī)模和重要性的不斷增長(zhǎng),推動(dòng)了數(shù)不清的新型并行圖系統(tǒng)(例如,Giraph和GraphLab)的發(fā)展。通過(guò)限制可以表達(dá)的計(jì)算類(lèi)型和引入新的技術(shù)來(lái)分割和分發(fā)圖,這些系統(tǒng)可以以高于普通的數(shù)據(jù)并行系統(tǒng)幾個(gè)數(shù)量級(jí)的速度執(zhí)行復(fù)雜的圖算法,如圖1-7所示。
GraphX是用于圖和并行圖計(jì)算的新Spark API。從上層來(lái)看,GraphX通過(guò)引入彈性分布式屬性圖(resilient distributed property graph)擴(kuò)展了Spark RDD。這種圖是一種偽圖,圖中的每個(gè)邊和節(jié)點(diǎn)都有對(duì)應(yīng)的屬性。
為了支持圖計(jì)算,GraphX給出了一系列基礎(chǔ)的操作(例如,subgraph、joinVertices、和MapReduceTriplets)以及基于Pregel API的優(yōu)化變體。除此之外,GraphX還包含了一個(gè)不斷擴(kuò)展的圖算法和構(gòu)建器集合,以便簡(jiǎn)化圖分析的任務(wù)。
關(guān)于GraphX更具體的內(nèi)容和案例會(huì)在第9章中詳細(xì)介紹。
1.2.5 SparkR
SparkR是AMPLab發(fā)布的一個(gè)R開(kāi)發(fā)包,為Apache Spark提供了輕量的前端。SparkR提供了Spark中彈性分布式數(shù)據(jù)集(RDD)的API,用戶可以在集群上通過(guò)R shell交互性地運(yùn)行Job。例如,我們可以在HDFS上讀取或?qū)懭胛募?#xff0c;也可以使用lapply函數(shù)進(jìn)行方法調(diào)用,定義對(duì)應(yīng)每一個(gè)RDD元素的運(yùn)算。
Spark具有快速(fast)、可擴(kuò)展(scalable)、交互(interactive)的特點(diǎn),R具有統(tǒng)計(jì)(statistics)、繪圖(plots)的優(yōu)勢(shì),R和Spark的有效結(jié)合,解決了R語(yǔ)言中無(wú)法級(jí)聯(lián)擴(kuò)展的難題,也極大地豐富了Spark在機(jī)器學(xué)習(xí)方面能夠使用的Lib庫(kù)。
除了常見(jiàn)的RDD函數(shù)式算子Reduce、reduceByKey、groupByKey和Collect之外,SparkR也支持利用lapplyWithPartition對(duì)每個(gè)RDD的分區(qū)進(jìn)行操作。SparkR也支持常見(jiàn)的閉包(closure)功能:用戶定義的函數(shù)中所引用到的變量會(huì)自動(dòng)被發(fā)送到集群中的其他的機(jī)器上。
SparkR的工作原理如圖1-8所示,首先加載R方法包和rJava包,然后通過(guò)SparkR初始化SparkContext。
關(guān)于SparkR處理數(shù)據(jù)挖掘更具體的內(nèi)容和案例會(huì)在第10章詳細(xì)介紹。
總結(jié)
以上是生活随笔為你收集整理的《Spark核心技术与高级应用》——1.2节Spark的重要扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《Android 应用案例开发大全(第二
- 下一篇: 《敏捷迭代开发:管理者指南》—第2章2.