Spark在大數(shù)據(jù)分析中的應(yīng)用與數(shù)據(jù)管道
- ??Spark??
- 創(chuàng)建DF
- Spark MLlib
- 批處理和流處理
- Spark Streaming
- Spark 功能
- ??Data Pipeline??
- 開發(fā)預(yù)測(cè)性和規(guī)定性模型
- 數(shù)據(jù)挖掘的跨行業(yè)標(biāo)準(zhǔn)流程(CRISP-DM)
Spark
大數(shù)據(jù)正在從根本上改變組織和企業(yè)的運(yùn)營和競(jìng)爭(zhēng)方式。大數(shù)據(jù)和物聯(lián)網(wǎng)也共享緊密相連的未來,提供數(shù)據(jù)驅(qū)動(dòng)的分析和洞察力。
Dataframe:
Spark中的DataFrame表示組織在命名列[33]中的分布式數(shù)據(jù)集合。DataFrame在概念上相當(dāng)于關(guān)系數(shù)據(jù)庫中的一個(gè)表、R或Python的Panda DataFrame中的數(shù)據(jù)幀,但對(duì)Spark引擎進(jìn)行了額外的優(yōu)化。DataFrames支持并可以從廣泛的來源構(gòu)建,包括結(jié)構(gòu)化數(shù)據(jù)文件,Hive表,JSON、Parquet、外部數(shù)據(jù)庫、HDFS、S3等。此外,通過spark-SQL的外部數(shù)據(jù)源API, DataFrames可以擴(kuò)展到支持任何第三方數(shù)據(jù)格式或源,包括Avro, CSV, ElasticSearch, Cassandra等。與rdd一樣,dataframe的計(jì)算是惰性的,而操作是自動(dòng)并行化的,并分布在集群上。Spark SQL Catalyst優(yōu)化器利用樹形轉(zhuǎn)換框架編織了最先進(jìn)的優(yōu)化和代碼生成。dataframe可以很容易地與其余的Hadoop生態(tài)系統(tǒng)工具和框架通過Spark Core,并提供了一個(gè)API,Python, Java, Scala和R編程
創(chuàng)建DF
為了啟動(dòng)任何Spark計(jì)算,需要使用sparkR.session()命令初始化基本的Spark會(huì)話。
DataFrames為結(jié)構(gòu)化數(shù)據(jù)操作提供了一種領(lǐng)域特定的語言
Scala、Java、Python和R. DataFrames是Scala和Java中的行數(shù)據(jù)集api。這些操作也被稱為“非類型轉(zhuǎn)換”,這與通常與強(qiáng)類型Scala或Java相關(guān)的“類型轉(zhuǎn)換”形成了對(duì)比數(shù)據(jù)集。
類型轉(zhuǎn)換:返回值是dataset
非類型轉(zhuǎn)換:使用API,返回的值是dataframe(dataset的行元素)
SparkSession上的SQL函數(shù)的優(yōu)點(diǎn)是,它允許應(yīng)用程序以編程方式運(yùn)行SQL查詢,并以DataFrame返回結(jié)果。
Spark SQL中的臨時(shí)視圖是會(huì)話作用域的,如果創(chuàng)建臨時(shí)視圖的會(huì)話終止,臨時(shí)視圖將消失。如果需要一個(gè)臨時(shí)視圖來持久化并在所有會(huì)話之間共享,直到Spark應(yīng)用程序終止,那么應(yīng)該創(chuàng)建一個(gè)全局臨時(shí)視圖。全局臨時(shí)視圖綁定到系統(tǒng)保存的數(shù)據(jù)庫global_temp,必須使用限定名來引用它,例如:SELECT * FROM global_temp.employee.
Spark MLlib
Spark MLlib是一個(gè)包含各種機(jī)器學(xué)習(xí)(ML)功能的庫,針對(duì)Spark計(jì)算框架進(jìn)行了優(yōu)化。MLlib提供大量的機(jī)器學(xué)習(xí)算法和實(shí)用工具,包括分類、回歸、聚類、關(guān)聯(lián)規(guī)則、順序模式挖掘、集成模型、分解、主題建模和協(xié)同過濾。此外,MLlib還支持各種功能,如特征提取、模型評(píng)估和驗(yàn)證。所有這些方法都經(jīng)過設(shè)計(jì)和優(yōu)化,以跨Spark集群擴(kuò)展。Spark的機(jī)器學(xué)習(xí)工具可以構(gòu)建各種管道,包括數(shù)據(jù)攝入和特征轉(zhuǎn)換、數(shù)據(jù)標(biāo)準(zhǔn)化、規(guī)范化、匯總統(tǒng)計(jì)、降維等任務(wù),以及模型構(gòu)建、超參數(shù)調(diào)優(yōu)和評(píng)估。最后,Spark通過保存和加載模型和管道實(shí)現(xiàn)了機(jī)器學(xué)習(xí)持久性
MLlib的能力使大量主要機(jī)器學(xué)習(xí)算法的利用,包括回歸(線性,廣義線性,邏輯),分類算法(包括決策樹,隨機(jī)森林,梯度增強(qiáng)樹,多層感知器,支持向量機(jī),樸素貝葉斯等),聚類
(K-means, K-medoids,平分K-means,)潛Dirichlet分配,高斯混合模型,協(xié)同過濾。此外,它還支持特征提取、變換、降維、選擇,以及設(shè)計(jì)、構(gòu)造、評(píng)價(jià)等功能。
MLlib的設(shè)計(jì)有許多優(yōu)點(diǎn),包括簡(jiǎn)單性、可伸縮性和兼容性。Spark的api設(shè)計(jì)簡(jiǎn)單,提供的實(shí)用程序看起來和典型的數(shù)據(jù)科學(xué)工具(如R和Python)很像。通過有效的參數(shù)調(diào)整,機(jī)器學(xué)習(xí)方法可以很容易地執(zhí)行。此外,MLlib提供了無縫的可伸縮性,允許在大型計(jì)算集群上執(zhí)行ML方法,對(duì)代碼進(jìn)行最小或不進(jìn)行調(diào)整。Spark兼容R、Python pandas、scikit-learn和許多其他流行的ML工具。Spark的DataFrames和MLlib提供與現(xiàn)有工作流程集成的通用數(shù)據(jù)科學(xué)工具。
大多數(shù)機(jī)器學(xué)習(xí)實(shí)驗(yàn)的目標(biāo)是創(chuàng)建一個(gè)精確的模型,以預(yù)測(cè)未來的未知數(shù)據(jù)。為了實(shí)現(xiàn)這一目標(biāo),使用訓(xùn)練數(shù)據(jù)集對(duì)模型進(jìn)行“訓(xùn)練”,并使用測(cè)試數(shù)據(jù)集對(duì)訓(xùn)練數(shù)據(jù)集上獲得的模型進(jìn)行評(píng)估和驗(yàn)證。
利用PySpark MLlib特性,傳統(tǒng)的機(jī)器學(xué)習(xí)方法現(xiàn)在可以擴(kuò)展到大型和復(fù)雜的數(shù)據(jù)集。例如,我們可以使用傳統(tǒng)的Iris數(shù)據(jù)集來演示MLlib在Spark上開發(fā)預(yù)測(cè)模型的能力。
批處理和流處理
在研究Spark Streaming如何工作的細(xì)節(jié)之前,應(yīng)該定義批處理和流處理之間的區(qū)別。通常,批處理一次性將大量數(shù)據(jù)元素收集到一個(gè)組中。然后在指定的時(shí)間以批處理的方式同時(shí)處理整個(gè)組。批量計(jì)算的時(shí)間可以用多種方法來量化。計(jì)算時(shí)間可以根據(jù)預(yù)先指定的預(yù)定時(shí)間間隔或特定的觸發(fā)條件(包括收集的數(shù)據(jù)的若干元素或數(shù)量)來確定。在不需要實(shí)時(shí)分析的情況下,批數(shù)據(jù)處理是處理一段時(shí)間內(nèi)收集的大量數(shù)據(jù)的一種非常有效的方法。在歷史上,這一直是最常見的數(shù)據(jù)處理方法。
傳統(tǒng)數(shù)據(jù)庫和數(shù)據(jù)倉庫(包括Hadoop)是批處理系統(tǒng)處理的常見例子。流處理通常使用連續(xù)數(shù)據(jù),是實(shí)現(xiàn)快速數(shù)據(jù)處理的關(guān)鍵組件。流可以在幾乎瞬間對(duì)從一個(gè)設(shè)備到另一個(gè)設(shè)備的數(shù)據(jù)流進(jìn)行數(shù)據(jù)分析。這種連續(xù)計(jì)算方法發(fā)生在數(shù)據(jù)流經(jīng)系統(tǒng)時(shí),輸出不需要時(shí)間限制。由于接近即時(shí)的數(shù)據(jù)流,系統(tǒng)不需要存儲(chǔ)大量的數(shù)據(jù)。
流方法在到達(dá)時(shí)處理每一個(gè)新的單獨(dú)的數(shù)據(jù)塊。與批處理相反,不需要等待下一個(gè)批處理間隔。術(shù)語微批處理經(jīng)常與流聯(lián)系在一起,當(dāng)批處理較小或以較小的間隔處理時(shí)。盡管處理可能以高頻率發(fā)生,但在微批處理范例中,數(shù)據(jù)仍然是一次處理一批。Spark Streaming是一個(gè)支持微批處理的系統(tǒng)的例子。如果事件非常頻繁,特別是在快速的時(shí)間間隔內(nèi),并且需要快速檢測(cè)和響應(yīng),那么流處理是非常有益的。
Spark Streaming
Spark Streaming是一個(gè)Spark組件,支持實(shí)時(shí)數(shù)據(jù)流處理,支持可擴(kuò)展、高吞吐量、容錯(cuò)的數(shù)據(jù)流處理。Spark Streaming是一個(gè)Spark組件,通過提供一個(gè)類似于Spark的API來操作數(shù)據(jù)流,從而支持實(shí)時(shí)數(shù)據(jù)流的處理核心的抽樣API。它支持可擴(kuò)展、高吞吐量、容錯(cuò)的數(shù)據(jù)流處理。Spark Streaming的API支持與Spark Core相同的高度容錯(cuò)性、吞吐量和可伸縮性。Spark Streaming接收輸入數(shù)據(jù)流,并將它們分成稱為DStreams的批。DStreams可以從很多來源創(chuàng)建,比如Kafka, Flume和Kinesis,或者通過在其他DStreams上應(yīng)用操作來創(chuàng)建。
Spark 功能
Spark Streaming接收輸入的數(shù)據(jù)流,并對(duì)數(shù)據(jù)進(jìn)行批量處理。然后,Spark引擎對(duì)這些批進(jìn)行處理,以生成最終的批結(jié)果流。離散流或DStream是Spark Streaming支持的核心概念。
它表示連續(xù)的數(shù)據(jù)流。DStream由一系列連續(xù)的rdd表示。應(yīng)用于DStreams的操作轉(zhuǎn)換為底層rdd上的操作。Spark Streaming將數(shù)據(jù)離散成小的微批。Spark Streaming receiver并行地接受數(shù)據(jù),并緩沖到工作節(jié)點(diǎn)的內(nèi)存中,Spark引擎處理這些批,同時(shí)優(yōu)化延遲,并將結(jié)果輸出到外部系統(tǒng)
Spark Streaming基于流中的數(shù)據(jù)維護(hù)狀態(tài),通常稱為有狀態(tài)計(jì)算。此外,Spark Streaming允許窗口操作,其中可以使用指定的時(shí)間框架對(duì)數(shù)據(jù)執(zhí)行操作。利用窗口長(zhǎng)度和滑動(dòng)間隔參數(shù),利用窗口中的滑動(dòng)時(shí)間間隔來更新窗口。當(dāng)窗口滑動(dòng)到源DStream上時(shí),底層rdd被組合并操作以生成窗口DStream的rdd。根據(jù)數(shù)據(jù)所在位置和可用資源動(dòng)態(tài)分配Spark任務(wù),實(shí)現(xiàn)負(fù)載均衡和故障恢復(fù)。Spark Streaming的數(shù)據(jù)流可以來源于源數(shù)據(jù)流,也可以來源于通過轉(zhuǎn)換輸入流產(chǎn)生的處理數(shù)據(jù)流。在內(nèi)部, DStream由一系列連續(xù)的rdd表示。每個(gè)輸入DStream都與Receiver相關(guān)聯(lián),Receiver從源接收數(shù)據(jù)并將其存儲(chǔ)在執(zhí)行器內(nèi)存中。
類似于Spark rdd, Spark轉(zhuǎn)換支持DStream修改。輸入DStreams支持許多適用于rdd的轉(zhuǎn)換,包括map、filter、count、countbyvalue、reduce、union等。Spark Streaming支持兩類內(nèi)置流源:基本和高級(jí)源?;驹赐ǔT赟treamingContext API中直接可用,比如文件系統(tǒng)和套接字連接。高級(jí)資源通常包括Kafka, Flume,Kinesis等,并可通過額外的實(shí)用工具類。這需要通過鏈接工具鏈接額外的依賴項(xiàng)。如果應(yīng)用程序需要多個(gè)數(shù)據(jù)流并行,可以創(chuàng)建多個(gè)DStreams??梢詣?chuàng)建多個(gè)接收器,同時(shí)接收多個(gè)數(shù)據(jù)流,通常需要分配多個(gè)核來處理所有接收器的數(shù)據(jù)
DStream向外部系統(tǒng)(包括HDFS、數(shù)據(jù)庫或其他文件系統(tǒng))的數(shù)據(jù)輸出使用的是輸出操作。輸出操作觸發(fā)由print、saveAsTextFiles、saveAsObjectFiles、saveAsHadoopFiles等操作之一定義的DStream轉(zhuǎn)換的實(shí)際執(zhí)行。DStreams類似于rdd,通過輸出操作惰性地執(zhí)行。
下面的示例演示了Spark Streaming的一個(gè)基本應(yīng)用:計(jì)算從TCP套接字偵聽的數(shù)據(jù)服務(wù)器接收到的文本數(shù)據(jù)的字?jǐn)?shù)
然后輸入你想被計(jì)算的文本,屏幕上的輸出將顯示所統(tǒng)計(jì)的字?jǐn)?shù)
這個(gè)示例演示了將數(shù)據(jù)輸入到離散流框架。DStreams允許用戶捕獲數(shù)據(jù)并執(zhí)行許多不同類型的計(jì)算,如本例中通過對(duì)傳入數(shù)據(jù)集進(jìn)行簡(jiǎn)單的單詞計(jì)數(shù)所示。DStreaming和rdd是一組關(guān)鍵的構(gòu)建塊,可以使用它們(Spark和Spark Streaming)構(gòu)建復(fù)雜的流應(yīng)用程序。
Data Pipeline對(duì)于大數(shù)據(jù),可以考慮幾個(gè)不同的成熟度級(jí)別分析。有很多組織(DAMM, Gartner, IIA, HIMMS,TDWI、IBM等),它們已經(jīng)定義了自己的分析成熟度級(jí)別版本。然而,他們都統(tǒng)一有三個(gè)總體層次。所有的組織都是從原始數(shù)據(jù)開始,然后首先轉(zhuǎn)移到清潔、標(biāo)準(zhǔn)化和有組織的數(shù)據(jù)。他們接下來發(fā)展到基本和高級(jí)報(bào)告。最后,他們可能最終會(huì)發(fā)展到建立預(yù)測(cè)模型。這個(gè)過程強(qiáng)調(diào)了分析從描述性到診斷性,再到預(yù)測(cè)性,最后到說明性建模的復(fù)雜程度。描述性分析有助于理解過去發(fā)生了什么,而診斷分析則著眼于某些事情可能發(fā)生的原因。預(yù)測(cè)分析技術(shù)建立機(jī)器學(xué)習(xí)模型來預(yù)測(cè)將要發(fā)生的事情。然后,這些模型可以被輸入到說明性模型中,說明性模型通過建議在特定條件下應(yīng)該做什么,直接將這個(gè)過程帶入決策和行動(dòng)中。
開發(fā)預(yù)測(cè)性和規(guī)定性模型
約翰·奈斯比特(John Naisbitt)有句名言:“我們淹沒在數(shù)據(jù)中,卻渴望知識(shí)!”這是一句偉大的名言,如果你想到它是在1982年說的,那就更令人驚訝了。他的觀察在今天更加正確。雖然數(shù)據(jù)的規(guī)模已經(jīng)發(fā)生了變化,但在大數(shù)據(jù)世界的混亂中尋找意義的技能、工具和技術(shù)的需求并沒有改變。收集、存儲(chǔ)和保護(hù)大數(shù)據(jù)的成本很高,而真正的投資回報(bào)率(ROI)取決于從大數(shù)據(jù)中提取可操作性的數(shù)據(jù)的能力。數(shù)據(jù)科學(xué)領(lǐng)域是研究數(shù)據(jù)洪水的一個(gè)角度。數(shù)據(jù)科學(xué)家努力提取數(shù)據(jù)的意義,并講述數(shù)據(jù)的故事,以提供洞察力和指導(dǎo)。數(shù)據(jù)科學(xué)家已經(jīng)建立了能夠在大量數(shù)據(jù)中發(fā)現(xiàn)關(guān)系和模式的技術(shù),然后可以利用這些技術(shù)來預(yù)測(cè)未來的行為和事件。例如,利用機(jī)器學(xué)習(xí)方法的預(yù)測(cè)建模技術(shù)的發(fā)展是由解決數(shù)據(jù)爆炸的必要性驅(qū)動(dòng)的。這種技術(shù)從經(jīng)驗(yàn)中學(xué)習(xí),并預(yù)測(cè)未來的結(jié)果,以推動(dòng)更好的業(yè)務(wù)決策。它從原始數(shù)據(jù)中提取規(guī)則、規(guī)則、模式和約束,目標(biāo)是從數(shù)據(jù)中發(fā)現(xiàn)隱式的、先前未知的和意外的有價(jià)值的信息。
數(shù)據(jù)挖掘的跨行業(yè)標(biāo)準(zhǔn)流程(CRISP-DM)
確定此數(shù)據(jù)挖掘過程的六個(gè)主要階段。
- 項(xiàng)目理解階段: 在進(jìn)行預(yù)測(cè)模型開發(fā)時(shí),深入理解應(yīng)用領(lǐng)域的特征是至關(guān)重要的。一旦業(yè)務(wù)問題和整個(gè)項(xiàng)目目標(biāo)得到充分理解,項(xiàng)目就進(jìn)入數(shù)據(jù)理解階段。創(chuàng)建適當(dāng)?shù)臄?shù)據(jù)集是本階段的目標(biāo)。
- 數(shù)據(jù)理解階段: 對(duì)項(xiàng)目的需求進(jìn)行了解后開始收集海量數(shù)據(jù),對(duì)于這些數(shù)據(jù)而言,它可能涉及將來自不同來源和不同類型的數(shù)據(jù)放在一起,以便能夠開發(fā)全面的模型。數(shù)據(jù)的速率、數(shù)量和質(zhì)量都要仔細(xì)考慮。此階段的執(zhí)行可能需要基于數(shù)據(jù)可用性、資源限制等因素重新考慮業(yè)務(wù)理解。即該階段不僅會(huì)推向下一階段的輸入,也會(huì)因情況回滾至第一階段重新考慮或使用該結(jié)果再修訂上一階段的內(nèi)容。
- 數(shù)據(jù)準(zhǔn)備階段:數(shù)據(jù)準(zhǔn)備階段通常是流程中最耗費(fèi)時(shí)間和資源密集的階段。在這一階段進(jìn)行的數(shù)據(jù)預(yù)處理和清理可能需要相當(dāng)大的努力,不應(yīng)低估。仔細(xì)的、高級(jí)的數(shù)據(jù)收集和存儲(chǔ)計(jì)劃可以幫助最小化在此階段所花費(fèi)的精力。
- 建模階段:一旦數(shù)據(jù)準(zhǔn)備充分,就可以啟動(dòng)建模階段。然而,典型的情況是,數(shù)據(jù)準(zhǔn)備工作將繼續(xù)進(jìn)行,并根據(jù)建模過程中所取得的進(jìn)展和獲得的見解進(jìn)行修改。建模階段包括對(duì)數(shù)據(jù)集應(yīng)用一種或多種數(shù)據(jù)科學(xué)技術(shù),以提取可操作的洞察力。即該階段不僅會(huì)推向下一階段的輸入,也會(huì)因情況回滾至第一階段重新考慮或使用該結(jié)果再修訂上一階段的內(nèi)容。建模階段和數(shù)據(jù)準(zhǔn)備階段是可以并行的,但是要求達(dá)到建模所需的一定數(shù)據(jù)量,然后可以互相反饋從而提升建模精確度。
- 評(píng)價(jià)階段: 一旦模型在建模階段被開發(fā)或訓(xùn)練,評(píng)估階段就會(huì)在原始業(yè)務(wù)理解的上下文中考慮模型的價(jià)值。通常,需要對(duì)過程進(jìn)行多次迭代才能得到一個(gè)滿意的數(shù)據(jù)挖掘解決方案。
- 部署階段:最后,部署階段處理組織內(nèi)模型的實(shí)現(xiàn)并完成流程。除了數(shù)據(jù)科學(xué)團(tuán)隊(duì)之外,這可能還涉及到來自各種團(tuán)體的多個(gè)人員和專業(yè)知識(shí)。