中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

六、spark--spark調(diào)優(yōu)-創(chuàng)新互聯(lián)

[TOC]

創(chuàng)新互聯(lián)建站長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為華龍企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,華龍網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一、spark調(diào)優(yōu)概論

1.1 什么是spark調(diào)優(yōu)

? spark的計(jì)算本質(zhì)是分布式計(jì)算,程序的性能受集群中的任何因素的影響,如:CPU、網(wǎng)絡(luò)帶寬、內(nèi)存等。一般情況下,如果內(nèi)存足夠大,那么其他因素影響性能。然后出現(xiàn)調(diào)優(yōu)需求時(shí),更多是因?yàn)橘Y源不夠用的情況,所以才需要調(diào)節(jié)資源的使用情況,更加高效的使用資源。比如如果內(nèi)存比較緊張,不足以存放所有數(shù)據(jù)(10億條),需要針對(duì)內(nèi)存的使用,進(jìn)行調(diào)優(yōu)來減少內(nèi)存的消耗

1.2 spark調(diào)優(yōu)的主要方向

? Spark的性能優(yōu)化,大部分的工作,是對(duì)于內(nèi)存的使用,進(jìn)行調(diào)優(yōu)。通常情況下,Spark 處理的程序數(shù)據(jù)量較小,內(nèi)存足夠使用,只要保證網(wǎng)絡(luò)通常,一般不會(huì)出現(xiàn)大的性能問題。但是,Spark應(yīng)用程序的性能問題往往出現(xiàn)在針對(duì)大數(shù)據(jù)量進(jìn)行計(jì)算時(shí)(數(shù)據(jù)突增)。這種情況往往是現(xiàn)環(huán)境是無法滿足的,所以可能導(dǎo)致集群崩潰。
? 除了內(nèi)存調(diào)優(yōu)之外,還有一些手段可以優(yōu)化性能。比如spark使用過程中有和mysql交互的話,此時(shí)調(diào)優(yōu)也要考慮到mysql的性能問題。

1.3 spark調(diào)優(yōu)的主要技術(shù)手段

1、使用高性能序列化類庫。目的減少序列化時(shí)間以及序列化后數(shù)據(jù)的大小
2、優(yōu)化數(shù)據(jù)結(jié)構(gòu)。目的減少內(nèi)存占用
3、對(duì)多次使用的RDD進(jìn)行持久化(RDD cache)、checkpoint
4、使用序列化的持久化級(jí)別:MEMORY_ONLY不序列化,MEMORY_ONLY_SER序列化。
MEMORY_ONLY比MEMORY_ONLY_SER要占用更多內(nèi)存空間。
但是要注意,序列化會(huì)增加cpu使用成本,所以要權(quán)衡好
5、Java虛擬機(jī)垃圾回收調(diào)優(yōu)。
6、Shuffle調(diào)優(yōu),90%的問題都是shuffle導(dǎo)致(1.x版本時(shí)此問題嚴(yán)重,到2.x版本,官網(wǎng)基本已優(yōu)化,所以到2.x版本,這個(gè)問題可忽略)

其他性能優(yōu)化的方式:
提高計(jì)算并行度
廣播共享數(shù)據(jù)

下面會(huì)針對(duì)這6點(diǎn)調(diào)優(yōu)手段進(jìn)行分析

二、診斷spark內(nèi)存使用情況

2.1 內(nèi)存花費(fèi)(對(duì)象內(nèi)存花費(fèi))

1、每個(gè) java/scala對(duì)象,由兩部分組成,一個(gè)是對(duì)象頭,占用16字節(jié),主要包含對(duì)象的一些元信息,比如指向它的類的指針。另一個(gè)是對(duì)象本身。如果對(duì)象比較小,比如int,它的對(duì)象頭比自己對(duì)象本身都大。

2、String對(duì)象,會(huì)比他內(nèi)部的原始數(shù)據(jù),多出40個(gè)字節(jié),用于保存string類型的元信息
String內(nèi)部使用char數(shù)組來保存字符串序列,并且還要保存諸如數(shù)組長度之類的信息。String使用UTF-16編碼,所以每個(gè)字符會(huì)占用2個(gè)字節(jié)。
比如:包含10個(gè)字符的String,占用 2*10 + 40 個(gè)字節(jié)。

3、集合類型,比如HashMap和LinkedList,內(nèi)部使用鏈表數(shù)據(jù)結(jié)構(gòu),對(duì)鏈表中的每個(gè)數(shù)據(jù),使用Entry對(duì)象包裝。Entry對(duì)象,不光有對(duì)象頭,還有指向下一個(gè)Entry的指針,占用8個(gè)字節(jié)。所以一句話就是,這種內(nèi)部還包含多個(gè)對(duì)象的類型,占用內(nèi)存更多。因?yàn)閷?duì)象多了,除了對(duì)象本身數(shù)據(jù)占用內(nèi)存之外,更多對(duì)象也就會(huì)有更多對(duì)象頭,占用了不少內(nèi)存空間。

4、基本數(shù)據(jù)類型的集合,比如int集合,內(nèi)部會(huì)使用對(duì)象的包裝類 Integer來存儲(chǔ)元素。

2.2 獲取spark程序內(nèi)存使用情況

到driver日志目錄下查看程序運(yùn)行日志

less ${spark_home}/work/app-xxxxxx/0/stderr
觀察到類似如下信息:
INFO MemoryStore: Block broadcast_1 stored as values in memory (estimated size 320.9 KB, free 366.0 MB)
        19/07/05 05:57:47 INFO MemoryStore: Block rdd_3_1 stored as values in memory (estimated size 26.0 MB, free 339.9 MB)
        19/07/05 05:57:47 INFO Executor: Finished task 1.0 in stage 0.0 (TID 1). 2212 bytes result sent to driver
        19/07/05 05:57:48 INFO MemoryStore: Block rdd_3_0 stored as values in memory (estimated size 26.7 MB, free 313.2 MB)

estimated size 320.9 KB:當(dāng)前使用的內(nèi)存大概大小
free 366.0 MB:剩余空閑內(nèi)存大小

這樣就可以知道任務(wù)使用內(nèi)存的情況了

三、spark調(diào)優(yōu)技術(shù)手段

2.1 使用高性能序列化類庫

2.1.1 spark序列化的使用情況

? spark作為一個(gè)分布式系統(tǒng),和其他分布式系統(tǒng)一樣,都需要序列化。任何一個(gè)分布式系統(tǒng)中,序列化都是很重要的一環(huán)。如果使用的序列化技術(shù),操作很慢,序列化后數(shù)據(jù)量大,會(huì)導(dǎo)致分布式系統(tǒng)應(yīng)用程序性能下降很多。所以,Spark性能優(yōu)化的第一步,就是進(jìn)行序列化性能的優(yōu)化。
? spark在一些地方是會(huì)使用序列化,比如shuffle的時(shí)候,但是spark對(duì)便捷性和性能進(jìn)行了取舍,spark為了便捷性,默認(rèn)使用了java的序列化機(jī)制,java的序列化機(jī)制之前也講過,性能不高,序列化速度慢,序列化后數(shù)據(jù)大。所以一般生產(chǎn)中,最好修改spark使用 的序列化機(jī)制

2.1.2 配置spark使用kryo來序列化

? spark支持使用kryo來實(shí)現(xiàn)序列化。kryo序列化速度比java快,占用空間小,大概小10倍。但是使用起來,相對(duì)沒有那么便捷。
配置spark使用kryo:

spark在讀取配置時(shí),會(huì)讀取conf目錄下的配置文件,其中有一個(gè) spark-defaults.conf 文件就是用來指定spark的一些工作參數(shù)的。

vim spark-defaults.conf
spark.serializer        org.apache.spark.serializer.KryoSerializer

這就配置了使用kryo,當(dāng)然也可以在spark程序中使用 conf對(duì)象來來設(shè)置
conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")

2.1.3 kryo類庫的優(yōu)化

(1)優(yōu)化緩存大小
如果注冊(cè)的序列化的自定義類型,本身特別大,比如包含了100個(gè)以上字段,就會(huì)導(dǎo)致序列化的對(duì)象過大。此時(shí)需要對(duì)kyro本身進(jìn)行優(yōu)化。因?yàn)閗yro本身內(nèi)部緩存不夠存放這么大的對(duì)象。

設(shè)置:spark.kryoserializer.buffer.max  參數(shù)值調(diào)大,即可。

(2)提前注冊(cè)自定義類型
使用kryo時(shí),為了更高的性能,最好提前注冊(cè)需要序列化的類,如:

在sparkConf 對(duì)象中注冊(cè)
conf.registerKryoClasses(Array(classof[Student],classof[Teacher]))

注意:這里基本都針對(duì)自定義的類,而且用scala編寫spark項(xiàng)目時(shí),其實(shí)不會(huì)涉及到太多自定義類,不像java

2.2 優(yōu)化數(shù)據(jù)結(jié)構(gòu)

2.2.1 概述

優(yōu)化數(shù)據(jù)結(jié)構(gòu),主要在于避免語法特性中所導(dǎo)致的額外內(nèi)存開銷。
核心:優(yōu)化算子函數(shù)內(nèi)部使用到的局部數(shù)據(jù)或者算子外部的數(shù)據(jù)。
目的:減少對(duì)內(nèi)存的消耗和占用。

2.2.2 具體手段

(1)優(yōu)先使用數(shù)組以及字符串,而不是集合類。

即:優(yōu)先使用array,而不是ArrayList,LinkedList,hashMap
使用int[] 比 List<Integer> 節(jié)省內(nèi)存。

前面也說過,集合類包含更多的額外數(shù)據(jù),以及復(fù)雜的類結(jié)構(gòu),所以占用內(nèi)存多。此舉就是為了將結(jié)構(gòu)簡單化,滿足使用的情況下,越簡單越好

(2)將對(duì)象轉(zhuǎn)換成字符串。

在企業(yè)中,將HashMap,List這種數(shù)據(jù),統(tǒng)一使用String拼接成特殊格式的字符串。
舉例:
Map<Integer,Person> persons = new HashMap<>()
優(yōu)化為:
id:name,address,idCardNum,family......|id:name,address,idCardNum,family......

(3)避免使用多層嵌套對(duì)象結(jié)構(gòu)。

public class Teacher{private List<Student> students = new ArrayList<>()}
以上例子不好,因?yàn)門eacher類的內(nèi)部又嵌套了大量的小的Student對(duì)象。
改進(jìn):
轉(zhuǎn)成json,處理字符串
{"teacherId":1,....,students[{"studentId":1,.....}]}

(4)對(duì)于能夠避免的場(chǎng)景,使用int代替String

雖然String性能比List高,但是int占用更少內(nèi)存。
比如:數(shù)據(jù)庫主鍵,id,推薦使用自增主鍵,而不是uuid。

2.3 RDD緩存

這個(gè)就很簡單了,主要是將多次使用的RDD緩存在內(nèi)存中,避免再次使用時(shí)重復(fù)計(jì)算。實(shí)現(xiàn)方法看前面spark core的文章

2.4 使用序列化來進(jìn)行緩存

默認(rèn)情況下,進(jìn)行RDD緩存時(shí),RDD對(duì)象是沒有序列化的,也就是持久化級(jí)別為 MEMORY_ONLY。建議使用 MEMORY_ONLY_SER進(jìn)行持久化,因?yàn)檫@種方式同時(shí)會(huì)進(jìn)行序列化,序列化后占用更少的內(nèi)存的空間。實(shí)現(xiàn)方法看前面spark core的文章

2.5 jvm調(diào)優(yōu)

2.5.1 背景

? 如果在持久化RDD的時(shí)候,持久化了大量的數(shù)據(jù),那么Java虛擬機(jī)的垃圾回收就可能成為一個(gè)性能瓶頸。Java虛擬機(jī)會(huì)定期進(jìn)行垃圾回收,此時(shí)就會(huì)追蹤所有Java對(duì)象,并且在垃圾回收時(shí),追中找到那些已經(jīng)不再使用的對(duì)象,清理舊對(duì)象,給新對(duì)象騰出空間。
? 垃圾回收的性能開銷,和內(nèi)存中的對(duì)象數(shù)量成正比。而且要注意一點(diǎn), 在做Java虛擬機(jī)調(diào)優(yōu)前,必須要做好上面其他調(diào)優(yōu)工作,這樣才有意義。因?yàn)樯厦娴恼{(diào)優(yōu)工作,是為了節(jié)省內(nèi)存的開銷,更好、更高效的使用內(nèi)存。上面的優(yōu)化比起進(jìn)行jvm調(diào)優(yōu)獲得的好處要大得多。并且jvm調(diào)優(yōu)好了,但是上層應(yīng)用沒有好的內(nèi)存使用方式,jvm優(yōu)化了也白搭。

2.5.2 gc原理

這里提到這個(gè),更多是讓讀者自己去理解這個(gè)原理,隨便百度都可以找到了,這里不重復(fù)。

2.5.3 檢測(cè)垃圾回收

我們可以對(duì)垃圾回收進(jìn)行監(jiān)測(cè),包括多久進(jìn)行一次垃圾回收,以及每次垃圾回收耗費(fèi)的時(shí)間。
在 spark-submit腳本中,添加一個(gè)配置:

--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimesStamps"

注意:輸出到worker的日志中,而不是driver日志。

/usr/local/spark-2.1.0-bin-hadoop2.7/work/app-20190705055405-0000/0
這是driver日志

/usr/local/spark-2.1.0-bin-hadoop2.7/logs
這是worker日志

2.5.4 優(yōu)化Executor內(nèi)存比例

? 對(duì)于GC調(diào)優(yōu)來說,最重要的調(diào)節(jié),RDD緩存占用的內(nèi)存空間 與 算子執(zhí)行是創(chuàng)建對(duì)象所占用的內(nèi)存空間 的比例。默認(rèn)情況下,Spark使用每個(gè)Executor 60%的內(nèi)存空間來緩存RDD,那么在task執(zhí)行期間創(chuàng)建的對(duì)象,只有40%的內(nèi)存空間來存放對(duì)象。
? 在這種情況下,很有可能因?yàn)閮?nèi)存不足,task創(chuàng)建的對(duì)象過大,導(dǎo)致40%的內(nèi)存空間不夠用,觸發(fā)Java虛擬機(jī)垃圾回收操作。在極端的情況下,垃圾回收操作會(huì)被頻繁觸發(fā)。
? 根據(jù)實(shí)際情況,可以增大對(duì)象存儲(chǔ)空間,減少gc發(fā)生概率,方式:

conf.set("spark.storage.memoryFraction",0.5)
將RDD緩存占用空間比例降低到50%

2.6 shuffle

? 以往在spark1.x版本中,如果有shuffle時(shí),那么每個(gè)map task就會(huì)根據(jù)result task(也可以叫reduce task)的個(gè)數(shù),對(duì)map結(jié)果進(jìn)行分區(qū),分別給不同的result task處理,每個(gè)分區(qū)產(chǎn)生一個(gè)文件。當(dāng)map數(shù)量很多時(shí),就會(huì)產(chǎn)生大量文件,這會(huì)帶來性能問題。
? 在spark2.x中,將一個(gè)map task輸出的數(shù)據(jù)都放在一個(gè)文件中,然后加上一個(gè)索引文件,用于標(biāo)識(shí)不同分區(qū)數(shù)據(jù)在文件中的位置,這樣就保證了一個(gè)task只產(chǎn)生一個(gè)文件。從而降低了IO壓力

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章題目:六、spark--spark調(diào)優(yōu)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.rwnh.cn/article8/dcdcop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司、ChatGPT商城網(wǎng)站、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
甘谷县| 陆丰市| 乌鲁木齐县| 马鞍山市| 麟游县| 北票市| 修武县| 兴和县| 北票市| 靖边县| 教育| 南乐县| 高唐县| 阳信县| 平罗县| 遵义县| 崇信县| 永靖县| 遵义市| 淮北市| 尼勒克县| 呼和浩特市| 巴青县| 太康县| 翼城县| 凌云县| 金沙县| 土默特右旗| 从江县| 桂东县| 宁波市| 漠河县| 库车县| 泗阳县| 石棉县| 射阳县| 三门峡市| 楚雄市| 霍邱县| 黄骅市| 金平|