摘要:隨著人工智能和大數(shù)據(jù)時(shí)代的到來,Spark+AI大數(shù)據(jù)平臺(tái)快速發(fā)展,Spark是當(dāng)今大數(shù)據(jù)領(lǐng)域最活躍、最熱門、最高效的大數(shù)據(jù)通用計(jì)算平臺(tái)。到目前為止,Spark是唯一一個(gè)將大規(guī)模數(shù)據(jù)處理與最先進(jìn)的機(jī)器學(xué)習(xí)和人工智能算法相結(jié)合的統(tǒng)一分析引擎。本文闡述了Spark大數(shù)據(jù)技術(shù)在中國電信天翼高清IPTV端到端系統(tǒng)中的應(yīng)用,以Spark大數(shù)據(jù)平臺(tái)的性能優(yōu)化及Spark在深度學(xué)習(xí)的應(yīng)用為研究對(duì)象,從Spark內(nèi)存管理、JVM GC性能調(diào)優(yōu)、數(shù)據(jù)序列化、數(shù)據(jù)類型優(yōu)化、Spark緩存優(yōu)化、數(shù)據(jù)傾斜調(diào)優(yōu)、Spark算子調(diào)優(yōu)、Spark在深度學(xué)習(xí)的應(yīng)用調(diào)優(yōu)進(jìn)行闡述,并對(duì)大數(shù)據(jù)技術(shù)未來的發(fā)展進(jìn)行了展望 。
關(guān)鍵詞: Spark;人工智能;大數(shù)據(jù);深度學(xué)習(xí);內(nèi)存優(yōu)化;Shuffle優(yōu)化;性能優(yōu)化
1 引言
Spark是當(dāng)今大數(shù)據(jù)領(lǐng)域最活躍、最熱門、最高效的大數(shù)據(jù)通用計(jì)算平臺(tái),Spark誕生于美國加州大學(xué)伯克利分校AMP實(shí)驗(yàn)室。Apache Spark已經(jīng)成為大數(shù)據(jù)領(lǐng)域最大的開源社區(qū),達(dá)到250多個(gè)組織的1400多個(gè)貢獻(xiàn)者。在任何規(guī)模的數(shù)據(jù)計(jì)算中,Spark在性能和擴(kuò)展性上都更具優(yōu)勢(shì)。近年來,Spark技術(shù)在工業(yè)界得到廣泛應(yīng)用,中國電信公司基于Spark大數(shù)據(jù)技術(shù)自研構(gòu)建了天翼高清IPTV端到端系統(tǒng),基于全國超大規(guī)模的實(shí)時(shí)數(shù)據(jù)進(jìn)行大數(shù)據(jù)分析。本文結(jié)合生產(chǎn)業(yè)務(wù)場(chǎng)景對(duì)Spark性能優(yōu)化進(jìn)行了實(shí)踐探索,從Spark內(nèi)存管理、JVM GC性能調(diào)優(yōu)、數(shù)據(jù)序列化、數(shù)據(jù)類型優(yōu)化、Spark緩存優(yōu)化、數(shù)據(jù)傾斜調(diào)優(yōu)、Spark算子調(diào)優(yōu)、Spark在深度學(xué)習(xí)的調(diào)優(yōu)進(jìn)行闡述。實(shí)踐表明,經(jīng)過一系列的優(yōu)化措施,提升了Spark集群的計(jì)算性能及Spark任務(wù)執(zhí)行速度。
2 ?天翼高清IPTV端到端系統(tǒng)案例實(shí)踐
Spark大數(shù)據(jù)技術(shù)為天翼高清IPTV端到端系統(tǒng)的穩(wěn)定運(yùn)行提供了支撐保障,在天翼高清IPTV端到端系統(tǒng)中,清洗模塊、單質(zhì)量模塊、考核模塊、多維度計(jì)算模塊、告警模塊等模塊均以Spark技術(shù)作為核心基石,各模塊基于Spark Core 、Spark SQL、Spark Streaming、Spark ML等技術(shù)進(jìn)行了設(shè)計(jì)與實(shí)現(xiàn)。
在生產(chǎn)實(shí)踐中經(jīng)常會(huì)面臨Spark性能優(yōu)化的問題,Spark應(yīng)用程序基于內(nèi)存進(jìn)行計(jì)算,系統(tǒng)運(yùn)行性能瓶頸受到集群資源的限制(例如,CPU、網(wǎng)絡(luò)帶寬、內(nèi)存、存儲(chǔ)等)。一個(gè)簡單的方法是增加Spark的計(jì)算資源。
(1)Spark內(nèi)存管理。
Spark的內(nèi)存包括執(zhí)行內(nèi)存、存儲(chǔ)內(nèi)存。執(zhí)行內(nèi)存是指在洗牌、關(guān)聯(lián)、排序及聚合中用于計(jì)算的內(nèi)存,存儲(chǔ)內(nèi)存是指在集群中存儲(chǔ)內(nèi)部數(shù)據(jù)的內(nèi)存,兩者共享一個(gè)統(tǒng)一的內(nèi)存區(qū)域,可以配置spark.memory.fraction、spark.memory.storageFraction等參數(shù)進(jìn)行調(diào)參。
(2)JVM GC性能調(diào)優(yōu)。
當(dāng)加載的數(shù)據(jù)及Shuffle讀寫操作數(shù)據(jù)量較大時(shí),可能會(huì)出現(xiàn)JVM GC的問題。如果出現(xiàn)GC,首先要收集垃圾回收發(fā)生的頻率和GC所用時(shí)間的統(tǒng)計(jì)信息,考慮將對(duì)象進(jìn)行序列化緩存,GC優(yōu)化的效果取決于應(yīng)用程序和可用內(nèi)存的多少。在案例實(shí)踐中要協(xié)調(diào)平衡Spark執(zhí)行內(nèi)存和存儲(chǔ)內(nèi)存的關(guān)系、JVM年輕代內(nèi)存和老年代內(nèi)存的關(guān)系、加載數(shù)據(jù)總量大小與批處理數(shù)據(jù)大小的關(guān)系。在JVM GC性能調(diào)優(yōu)時(shí),可以采用數(shù)據(jù)序列化、調(diào)整數(shù)據(jù)類型、數(shù)據(jù)緩存等方法。
(3)數(shù)據(jù)序列化。
Spark提供了Java序列化、kryo序列化方式,Kryo比Java序列化運(yùn)行速度更快、更緊湊。在案例實(shí)踐中采用了Kyro的序列化,將自定義的話單類型注冊(cè)給Kyro序列化器,并設(shè)置默認(rèn)緩存空間的大小。
1)調(diào)整數(shù)據(jù)類型。
Java字符串類型占用內(nèi)存空間較大,在案例實(shí)踐中將部分字段的String類型調(diào)整為Long類型,減少內(nèi)存的消耗;加載文件時(shí)候篩選業(yè)務(wù)字段,從70個(gè)字段調(diào)整為10個(gè)字段,減少了內(nèi)存空間的占用。
2)使用Spark緩存。
天翼高清IPTV端到端系統(tǒng)的播放類型包括組播、直播單播、時(shí)移、回看、點(diǎn)播、直播
及點(diǎn)播匯總等各個(gè)類型,每次都加載HDFS數(shù)據(jù),運(yùn)行時(shí)間較長。使用Spark緩存進(jìn)行優(yōu)化,先從HDFS文件系統(tǒng)中加載數(shù)據(jù),然后將加載的數(shù)據(jù)緩存到集群內(nèi)存中,遍歷播放類型時(shí)可以直接讀取緩存中的數(shù)據(jù),計(jì)算性能大幅提升。
3)Spark數(shù)據(jù)傾斜調(diào)優(yōu)。
數(shù)據(jù)傾斜是Spark分布式計(jì)算必須面臨的問題,也是作大數(shù)據(jù)分析不能繞開的問題,
稍微復(fù)雜一點(diǎn)的業(yè)務(wù),SparK大數(shù)據(jù)分析都需解決數(shù)據(jù)傾斜。在天翼高清IPTV端到端系統(tǒng)中,多維度模塊(區(qū)域播放類型、單節(jié)目統(tǒng)計(jì))要按省、地、縣統(tǒng)計(jì),將每一條記錄匯聚到省、地、縣編碼,進(jìn)行reducebykey聚合操作將導(dǎo)致省級(jí)編碼記錄數(shù)據(jù)傾斜的現(xiàn)象,我們使用隨機(jī)Key實(shí)現(xiàn)雙重聚合及從業(yè)務(wù)層面解決數(shù)據(jù)傾斜的問題。在第一次聚合時(shí),使用reduceByKey算子進(jìn)行Key-Value聚合,在區(qū)域播放類型、單節(jié)目模塊將每個(gè)區(qū)域編碼加上隨機(jī)數(shù)前綴打散,組成一個(gè)新的Key值,調(diào)用reduceByKey操作。第二次聚合時(shí),再去掉每個(gè)區(qū)域編碼的前綴隨機(jī)數(shù),再調(diào)用一次reduceByKey操作,得到按區(qū)域統(tǒng)計(jì)的全局聚合結(jié)果。
在業(yè)務(wù)層面,單節(jié)目模塊包括直播、點(diǎn)播,需根據(jù)區(qū)域編碼、節(jié)目編碼、播放類型等字段進(jìn)行聚合計(jì)算,直播節(jié)目的記錄包括省、地、縣的記錄,點(diǎn)播記錄包括省級(jí)的記錄,如果將直播、點(diǎn)播記錄合在一起進(jìn)行聚合計(jì)算,將發(fā)生數(shù)據(jù)傾斜的情況,某一些任務(wù)運(yùn)行特別緩慢,不能進(jìn)行實(shí)時(shí)統(tǒng)計(jì)分析。
4)Spark算子調(diào)優(yōu)。
在天翼高清IPTV端到端系統(tǒng)中,單節(jié)目模塊月維度的統(tǒng)計(jì)原采用collect方法將數(shù)據(jù)
全部收集到Driver節(jié)點(diǎn)寫入HDFS及數(shù)據(jù)庫,單節(jié)目數(shù)據(jù)量較大,導(dǎo)致運(yùn)行時(shí)間較長及內(nèi)存溢出。在案例實(shí)踐中將foreach算子調(diào)整為foreachPartition算子,對(duì)每一個(gè)分區(qū)建立一個(gè)連接,按分區(qū)寫入數(shù)據(jù),提升了系統(tǒng)運(yùn)行性能。
3 Spark在深度學(xué)習(xí)的調(diào)優(yōu)
Pytorch 、Tensorflow深度學(xué)習(xí)框架是科研界、工業(yè)界運(yùn)用最廣泛的人工智能框架,基于Databricks及亞馬遜(Amazon)公司的云計(jì)算平臺(tái),將Spark與Pytorch 、Tensorflow無縫集成,實(shí)現(xiàn)基于Spark的數(shù)據(jù)預(yù)處理、單節(jié)點(diǎn)、分布式深度學(xué)習(xí)訓(xùn)練及分布式深度學(xué)習(xí)預(yù)測(cè)推理。Spark在深度學(xué)習(xí)層面可能的一些調(diào)優(yōu)方法,包括:
深度學(xué)習(xí)模型本身的性能調(diào)優(yōu)。例如,ResNet-50模型加載預(yù)訓(xùn)練模型+微調(diào)網(wǎng)絡(luò)全部參數(shù);或者,凍結(jié)輸出層以外的所有網(wǎng)絡(luò),微調(diào)輸出層參數(shù)。
分布式深度學(xué)習(xí)預(yù)測(cè)中數(shù)據(jù)輸入管道的調(diào)優(yōu)。如果數(shù)據(jù)輸入是瓶頸,可以使用Spark加載數(shù)據(jù),轉(zhuǎn)換為Spark DataFrame作為模型的輸入,合理設(shè)置Spark批處理的記錄數(shù),以提升系統(tǒng)吞吐量。
4 未來展望
Spark官網(wǎng)即將發(fā)布 Apache Spark 3.0版本,新版本將包含許多重要的新特性,包括支持GPU 感知調(diào)度、Spark Graph 圖增強(qiáng)、PySpark 可用性進(jìn)一步提升等。FaceBook、谷歌、Amazon等業(yè)界最領(lǐng)先的人工智能公司,正在全面的轉(zhuǎn)向深度學(xué)習(xí)。人工智能學(xué)習(xí)的核心是深度學(xué)習(xí),深度學(xué)習(xí)是目前商業(yè)界最有價(jià)值和潛力的,深度學(xué)習(xí)應(yīng)用于自動(dòng)駕駛和演示人工智能武器等,增強(qiáng)學(xué)習(xí)的核心是實(shí)時(shí)的與環(huán)境進(jìn)行交互,交互的能力可從環(huán)境交互中不斷提升自己的能力,增強(qiáng)學(xué)習(xí)和深度學(xué)習(xí)的聯(lián)合體,將使增強(qiáng)學(xué)習(xí)爆發(fā)出終極的潛力,也使深度學(xué)習(xí)的價(jià)值最大化。
參考文獻(xiàn)
[1]《Spark大數(shù)據(jù)商業(yè)實(shí)戰(zhàn)三部曲》第二版:清華大學(xué)出版社,王家林、段智華.
[2]《Spark大數(shù)據(jù)商業(yè)實(shí)戰(zhàn)三部曲》:清華大學(xué)出版社,王家林、段智華、夏陽.
[3]《Spark內(nèi)核機(jī)制解析及性能調(diào)優(yōu)》:機(jī)械工業(yè)出版社,王家林、段智華.
[4]《Spark SQL大數(shù)據(jù)實(shí)例開發(fā)教程》:機(jī)械工業(yè)出版社,王家林、段智華.