為了滿足挖掘分析與交互式實時查詢的計算需求,騰訊大數(shù)據(jù)使用了Spark平臺來支持挖掘分析類計算、交互式實時查詢計算以及允許誤差范圍的快速查詢計算,目前騰訊大數(shù)據(jù)擁有**過200臺的Spark集群,并獨立維護Spark和Shark分支。Spark集群已穩(wěn)定運行2年,我們積累了大量的案例和運營經(jīng)驗能力,另外多個業(yè)務的大數(shù)據(jù)查詢與分析應用,已在陸續(xù)上線并穩(wěn)定運行。在SQL查詢性能方面普遍比MapReduce高出2倍以上,利用內(nèi)存計算和內(nèi)存表的特性,性能至少在10倍以上。在迭代計算與挖掘分析方面,精準推薦將小時和天級別的模型訓練轉變?yōu)镾park的分鐘級別的訓練,同時簡潔的編程接口使得算法實現(xiàn)比MR在時間成本和代碼量上高出許多。
Spark VS MapReduce
盡管MapReduce適用大多數(shù)批處理工作,并且在大數(shù)據(jù)時代成為企業(yè)大數(shù)據(jù)處理的可以選擇技術,但由于以下幾個限制,它對一些場景并不是較優(yōu)選擇:
缺少對迭代計算以及DAG運算的支持
Shuffle過程多次排序和落地,MR之間的數(shù)據(jù)需要落Hdfs文件系統(tǒng)
Spark在很多方面都彌補了MapReduce的不足,比MapReduce的通用性較好,迭代運算效率較高,作業(yè)延遲較低,它的主要優(yōu)勢包括:
提供了一套支持DAG圖的分布式并行計算的編程框架,減少多次計算之間中間結果寫到Hdfs的開銷
提供Cache機制來支持需要反復迭代計算或者多次數(shù)據(jù)共享,減少數(shù)據(jù)讀取的IO開銷
使用多線程池模型來減少task啟動開稍,shuffle過程中避免不必要的sort操作以及減少磁盤IO操作
廣泛的數(shù)據(jù)集操作類型
MapReduce由于其設計上的約束只適合處理離線計算,在實時查詢和迭代計算上仍有較大的不足,而隨著業(yè)務的發(fā)展,業(yè)界對實時查詢和迭代分析有更多的需求,單純依靠MapReduce框架已經(jīng)不能滿足業(yè)務的需求了。Spark由于其可伸縮、基于內(nèi)存計算等特點,且可以直接讀寫Hadoop上任何格式的數(shù)據(jù),成為滿足業(yè)務需求的較佳候選者。
應用Spark的成功案例
目前大數(shù)據(jù)在互聯(lián)網(wǎng)公司主要應用在廣告、報表、推薦系統(tǒng)等業(yè)務上。在廣告業(yè)務方面需要大數(shù)據(jù)做應用分析、效果分析、定向優(yōu)化等,在推薦系統(tǒng)方面則需要大數(shù)據(jù)優(yōu)化相關排名、個性化推薦以及熱點點擊分析等。
這些應用場景的普遍特點是計算量大、效率要求高。Spark恰恰滿足了這些要求,該項目一經(jīng)推出便受到開源社區(qū)的廣泛關注和**。并在近兩年內(nèi)發(fā)展成為大數(shù)據(jù)處理領域較炙手可熱的開源項目。
本章將列舉國內(nèi)外應用Spark的成功案例。
1. 騰訊
廣點通是較早使用Spark的應用之一。騰訊大數(shù)據(jù)精準推薦借助Spark快速迭代的優(yōu)勢,圍繞“數(shù)據(jù)+算法+系統(tǒng)”這套技術方案,實現(xiàn)了在“數(shù)據(jù)實時采集、算法實時訓練、系統(tǒng)實時預測”的全流程實時并行高維算法,較終成功應用于廣點通pCTR投放系統(tǒng)上,支持每天上百億的請求量。
基于日志數(shù)據(jù)的快速查詢系統(tǒng)業(yè)務構建于Spark之上的Shark,利用其快速查詢以及內(nèi)存表等優(yōu)勢,承擔了日志數(shù)據(jù)的即席查詢工作。在性能方面,普遍比Hive高2-10倍,如果使用內(nèi)存表的功能,性能將會比Hive快百倍。
2. Yahoo
Yahoo將Spark用在Audience Expansion中的應用。Audience Expansion是廣告中尋找目標用戶的一種方法:首先廣告者提供一些觀看了廣告并且購買產(chǎn)品的樣本客戶,據(jù)此進行學習,尋找更多可能轉化的用戶,對他們定向廣告。Yahoo采用的算法是logistic regression。同時由于有些SQL負載需要較高的服務質量,又加入了專門跑Shark的大內(nèi)存集群,用于取代商業(yè)BI/OLAP工具,承擔報表/儀表盤和交互式/即席查詢,同時與桌面BI工具對接。目前在Yahoo部署的Spark集群有112臺節(jié)點,9.2TB內(nèi)存。
3. 淘寶
阿里搜索和廣告業(yè)務,較初使用Mahout或者自己寫的MR來解決復雜的機器學習,導致效率低而且代碼不易維護。淘寶技術團隊使用了Spark來解決多次迭代的機器學習算法、高計算復雜度的算法等。將Spark運用于淘寶的推薦相關算法上,同時還利用Graphx解決了許多生產(chǎn)問題,包括以下計算場景:基于度分布的**節(jié)點發(fā)現(xiàn)、基于較大連通圖的社區(qū)發(fā)現(xiàn)、基于三角形計數(shù)的關系衡量、基于隨機游走的用戶屬性傳播等。
4. 優(yōu)酷土豆
優(yōu)酷土豆在使用Hadoop集群的**問題主要包括:**是商業(yè)智能BI方面,分析師提交任務之后需要等待很久才得到結果;*二就是大數(shù)據(jù)量計算,比如進行一些模擬廣告投放之時,計算量非常大的同時對效率要求也比較高,最后就是機器學習和圖計算的迭代運算也是需要耗費大量資源且速度很慢。
較終發(fā)現(xiàn)這些應用場景并不適合在MapReduce里面去處理。通過對比,發(fā)現(xiàn)Spark性能比MapReduce提升很多。首先,交互查詢響應快,性能比Hadoop提高若干倍;模擬廣告投放計算效率高、延遲?。ㄍ琱adoop比延遲至少降低一個數(shù)量級);機器學習、圖計算等迭代計算,大大減少了網(wǎng)絡傳輸、數(shù)據(jù)落地等,較大的提高的計算性能。目前Spark已經(jīng)廣泛使用在優(yōu)酷土豆的視頻推薦(圖計算)、廣告業(yè)務等。
Spark與Shark的原理
1.Spark生態(tài)圈
如下圖所示為Spark的整個生態(tài)圈,較底層為資源管理器,采用Mesos、Yarn等資源管理集群或者Spark自帶的Standalone模式,底層存儲為文件系統(tǒng)或者其他格式的存儲系統(tǒng)如HBase。Spark作為計算框架,為上層多種應用提供服務。Graphx和MLBase提供數(shù)據(jù)挖掘服務,如圖計算和挖掘迭代計算等。Shark提供SQL查詢服務,兼容Hive語法,性能比Hive快3-50倍,BlinkDB是一個通過權衡數(shù)據(jù)精確度來提升查詢晌應時間的交互SQL查詢引擎,二者都可作為交互式查詢使用。Spark Streaming將流式計算分解成一系列短小的批處理計算,并且提供高可靠和吞吐量服務。
2.Spark基本原理
Spark運行框架如下圖所示,首先有集群資源管理服務(Cluster Manager)和運行作業(yè)任務的結點(Worker Node),然后就是每個應用的任務控制結點Driver和每個機器節(jié)點上有具體任務的執(zhí)行進程(Executor)。
與MR計算框架相比,Executor有二個優(yōu)點:一個是多線程來執(zhí)行具體的任務,而不是像MR那樣采用進程模型,減少了任務的啟動開稍。二個是Executor上會有一個BlockManager存儲模塊,類似于KV系統(tǒng)(內(nèi)存和磁盤共同作為存儲設備),當需要迭代多輪時,可以將中間過程的數(shù)據(jù)先放到這個存儲系統(tǒng)上,下次需要時直接讀該存儲上數(shù)據(jù),而不需要讀寫到hdfs等相關的文件系統(tǒng)里,或者在交互式查詢場景下,事先將表Cache到該存儲系統(tǒng)上,提高讀寫IO性能。另外Spark在做Shuffle時,在Groupby,Join等場景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二種模式,Spark還提供了較加豐富全面的運算操作如filter,groupby,join等。
Spark采用了Scala來編寫,在函數(shù)表達上Scala有**的優(yōu)勢,因此在表達復雜的機器學習算法能力比其他語言較強且簡單易懂。提供各種操作函數(shù)來建立起RDD的DAG計算模型。把每一個操作都看成構建一個RDD來對待,而RDD則表示的是分布在多臺機器上的數(shù)據(jù)集合,并且可以帶上各種操作函數(shù)。如下圖所示:
首先從hdfs文件里讀取文本內(nèi)容構建成一個RDD,然后使用filter()操作來對上次的RDD進行過濾,再使用map()操作**記錄的**個字段,最后將其cache在內(nèi)存上,后面就可以對之前cache過的數(shù)據(jù)做其他的操作。整個過程都將形成一個DAG計算圖,每個操作步驟都有容錯機制,同時還可以將需要多次使用的數(shù)據(jù)cache起來,供后續(xù)迭代使用。
3.Shark的工作原理
Shark是基于Spark計算框架之上且兼容Hive語法的SQL執(zhí)行引擎,由于底層的計算采用了Spark,性能比MapReduce的Hive普遍快2倍以上,如果是純內(nèi)存計算的SQL,要快5倍以上,當數(shù)據(jù)全部load在內(nèi)存的話,將快10倍以上,因此Shark可以作為交互式查詢應用服務來使用。
上圖就是整個Shark的框架圖,與其他的SQL引擎相比,除了基于Spark的特性外,Shark是完全兼容Hive的語法,表結構以及UDF函數(shù)等,已有的HiveSql可以直接進行遷移至Shark上。
與Hive相比,Shark的特性如下:
1.以在線服務的方式執(zhí)行任務,避免任務進程的啟動和銷毀開稍,通常MapReduce里的每個任務都是啟動和關閉進程的方式來運行的,而在Shark中,Server運行后,所有的工作節(jié)點也隨之啟動,隨后以常駐服務的形式不斷的接受Server發(fā)來的任務。
2.Groupby和Join操作不需要Sort工作,當數(shù)據(jù)量內(nèi)存能裝下時,一邊接收數(shù)據(jù)一邊執(zhí)行計算操作。在Hive中,不管任何操作在Map到Reduce的過程都需要對Key進行Sort操作。
3.對于性能要求較高的表,提供分布式Cache系統(tǒng)將表數(shù)據(jù)事先Cache至內(nèi)存中,后續(xù)的查詢將直接訪問內(nèi)存數(shù)據(jù),不再需要磁盤開稍。
4.還有很多Spark的特性,如可以采用Torrent來廣播變量和小數(shù)據(jù),將執(zhí)行計劃直接傳送給Task,DAG過程中的中間數(shù)據(jù)不需要落地到Hdfs文件系統(tǒng)。
騰訊大數(shù)據(jù)Spark的概況
騰訊大數(shù)據(jù)綜合了多個業(yè)務線的各種需求和特性,目前正在進行以下工作:
1.經(jīng)過改造和優(yōu)化的Shark和Spark吸收了TDW平臺的功能,如Hive的特有功能:元數(shù)據(jù)重構,分區(qū)優(yōu)化等,同時可以通過IDE或者洛子調(diào)度來直接執(zhí)行HiveSql查詢和定時調(diào)度Spark的任務;
2.與Gaia和TDW的底層存儲直接兼容,可以直接安全且高效地使用TDW集群上的數(shù)據(jù);
3.對Spark底層的使用門檻,資源管理與調(diào)度,任務監(jiān)控以及容災等多個功能進行完善,并支持快速的遷移和擴容。