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