邱麗娟
(廈門南洋職業(yè)學(xué)院,福建 廈門 361102)
大數(shù)據(jù)處理平臺(tái)Spark基礎(chǔ)實(shí)踐研究
邱麗娟
(廈門南洋職業(yè)學(xué)院,福建 廈門 361102)
Spark是主流的大數(shù)據(jù)并行計(jì)算框架。文章將通過幾段Scala腳本,演示在Spark環(huán)境下通過Map-Reduce框架處理大數(shù)據(jù)。
大數(shù)據(jù);Spark;Map-Reduce 框架
Spark基于內(nèi)存計(jì)算,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實(shí)時(shí)性。與很多分布式軟件系統(tǒng)相同,用戶可以將Spark部署在大量廉價(jià)的Linux硬件之上,形成性價(jià)比很高的計(jì)算集群。Spark提供了一個(gè)更快、更通用的數(shù)據(jù)處理平臺(tái)。和Hadoop相比,Spark可以讓程序在內(nèi)存中運(yùn)行時(shí)速度提升100倍,或者在磁盤上運(yùn)行時(shí)速度提升10倍。在100 TB Daytona GraySort比賽中,Spark戰(zhàn)勝了Hadoop,它只使用了十分之一的內(nèi)在,但運(yùn)行速度提升了3倍。Spark也已經(jīng)成為針對(duì)PB級(jí)別數(shù)據(jù)排序的最快的開源引擎。
理解Spark大數(shù)據(jù)處理,一個(gè)關(guān)鍵概念便是RDD。由于Map-Reduce Schema on Read處理方式會(huì)引起較大的處理開銷。Spark抽象出分布式內(nèi)存存儲(chǔ)結(jié)構(gòu)彈性分布式數(shù)據(jù)集RDD進(jìn)行數(shù)據(jù)的存儲(chǔ)。RDD模型很適合粗粒度的全局?jǐn)?shù)據(jù)并行計(jì)算,但不適合細(xì)粒度的、需要異步更新的計(jì)算。RDD是Spark的基本計(jì)算單元,一組RDD可形成執(zhí)行的有向無環(huán)圖RDD Graph。
Spark的整體工作流程為:客戶端提交應(yīng)用,主節(jié)點(diǎn)找到一個(gè)工作節(jié)點(diǎn)啟動(dòng)Driver,Driver向主節(jié)點(diǎn)或者資源管理器申請(qǐng)資源,之后將應(yīng)用轉(zhuǎn)化為RDD Graph,再由DAGScheduler將RDD Graph轉(zhuǎn)化為Stage的有向無環(huán)圖提交給TaskScheduler,由TaskScheduler提交任務(wù)給Executor執(zhí)行。
單詞計(jì)數(shù)是最常見的大數(shù)據(jù)處理場(chǎng)景,也是理解Map-Reduce的最佳范例。
所謂Map-Reduce,就是指把任意復(fù)雜的計(jì)算任務(wù),分解為兩個(gè)函數(shù):(1)map函數(shù):接受一個(gè)鍵值對(duì),值是一行數(shù)據(jù),鍵是根據(jù)值計(jì)算獲得的哈希。map函數(shù)產(chǎn)生一組中間鍵值對(duì),Map-Reduce框架會(huì)將map函數(shù)產(chǎn)生的中間鍵值對(duì)當(dāng)中的鍵相同的值傳遞給reduce函數(shù)。(2)reduce函數(shù):接受一個(gè)中間鍵值對(duì),鍵是唯一的,值是一個(gè)數(shù)組。reduce對(duì)值進(jìn)行歸并。
正是借助Map-Reduce框架,才解決了把計(jì)算任務(wù)“切片”交給大規(guī)模集群的問題,任務(wù)得以并行計(jì)算,最后匯總結(jié)果。這里為簡(jiǎn)化起見,不考慮標(biāo)點(diǎn)符號(hào)對(duì)計(jì)算結(jié)果的影響,并假設(shè)所有的單詞之間以空格間隔。
倒排索引(inverted index)源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來查找記錄。在索引表中,每一項(xiàng)均包含一個(gè)屬性值和一個(gè)具有該屬性值的各記錄的地址。由于記錄的位置由屬性值確定,而不是由記錄確定,因而稱為倒排索引。
搜索引擎的關(guān)鍵步驟便是建立倒排索引。相當(dāng)于為海量的網(wǎng)頁做了一個(gè)索引,用戶想看與哪一個(gè)主題相關(guān)的內(nèi)容,直接根據(jù)索引即可找到相關(guān)的頁面。
假設(shè)存在6篇文章,每篇文章的ID已知,文章ID與文章內(nèi)容之間以Tab建間隔:
對(duì)以上文章創(chuàng)建倒排索引的Scala程序如下:
/*讀取數(shù)據(jù),數(shù)據(jù)格式為一個(gè)大的HDFS文件中用 分隔不同的文件,用 分隔文件ID和文件內(nèi)容,用" "分隔文件內(nèi)的詞匯*/
/*將(詞,文檔ID)的數(shù)據(jù)進(jìn)行聚集,相同詞對(duì)應(yīng)的文檔ID統(tǒng)計(jì)到一起,形成(詞,"文檔ID1,文檔ID2,文檔ID3……”),形成簡(jiǎn)單的倒排索引*/
統(tǒng)計(jì)海量數(shù)據(jù)時(shí),經(jīng)常需要預(yù)估中位數(shù),由中位數(shù)大致了解某列數(shù)據(jù),做機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的很多公式中也需要用到中位數(shù)。
假設(shè)數(shù)據(jù)按照下面的格式存儲(chǔ):1 2 3 4 5 6 8 9 11 12 13 15 18 20 22 23 25 27 29
計(jì)算中位數(shù)的思路是:將整體的數(shù)據(jù)分為K個(gè)桶,統(tǒng)計(jì)每個(gè)桶內(nèi)的數(shù)據(jù)量,然后統(tǒng)計(jì)整個(gè)數(shù)據(jù)量;根據(jù)桶的數(shù)量和總的數(shù)據(jù)量,可以判斷數(shù)據(jù)落在哪個(gè)桶里以及中位數(shù)的偏移量;取出這個(gè)中位數(shù)。Scala腳本如下:
Research on Spark basis practice of big data processing platform
Qiu Lijuan
(Xiamen Nanyang University, Xiamen 361102, China)
Spark is the major framework of parallel computing of big data. This article will illustrate how to process big data through Map-Reduce framework under the background of Spark by several Scala scripts.
big data; Spark; Map-Reduce framework
邱麗娟(1978— ),女,江西南昌,本科,講師;研究方向:程序設(shè)計(jì)。