提高Apache Spark工作性能的技巧有哪些,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
黎平網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司自2013年起到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
使您的Apache Spark應(yīng)用程序運行速度更快,而對代碼的更改最少!
介紹
在開發(fā)Spark應(yīng)用程序時,最耗時的部分之一是優(yōu)化。 在此博客文章中,我將提供一些性能提示,以及(至少對我而言)啟動時可能會使用的未知配置參數(shù)。
因此,我將介紹以下主題:
多個小文件作為源
隨機分區(qū)參數(shù)
強制廣播Join
分區(qū)vs合并vs隨機分區(qū)參數(shù)設(shè)置
我們可以改善什么?
1. 使用多個小文件?
OpenCostInBytes(來自文檔)—可以同時掃描打開文件的估計成本(以字節(jié)數(shù)衡量)。 將多個文件放入分區(qū)時使用。 最好高估一下,然后,具有較小文件的分區(qū)將比具有較大文件的分區(qū)(首先安排)更快。 默認(rèn)值為4MB。
spark.conf.set("spark.files.openCostInBytes", SOME_COST_IN_BYTES)
我對包含12,000個文件的1GB文件夾,包含800個文件的7.8GB文件夾和包含1.6k個文件的18GB文件夾進行了測試。 我的目的是弄清楚輸入文件是否較小,最好使用低于默認(rèn)值的文件。
因此,當(dāng)測試1GB和7.8GB文件夾時-肯定是較低的值,但是測試大約11MB的文件時,較大的參數(shù)值會更好。
使用接近您的小文件大小的openCostInBytes大小。 這樣會更有效率!
2. 隨機分區(qū)
開始使用Spark時,我莫名其妙地想到了在創(chuàng)建Spark會話時設(shè)置的配置是不可變的。 天哪,我怎么錯。
因此,通常,在進行聚集或聯(lián)接時,spark分區(qū)在spark中是一個靜態(tài)數(shù)字(默認(rèn)為200)。 根據(jù)您的數(shù)據(jù)大小,這會導(dǎo)致兩個問題:
數(shù)據(jù)集很小-200太多,數(shù)據(jù)分散且效率不高
數(shù)據(jù)集巨大-200太少了。 數(shù)據(jù)被浪費了,我們沒有充分利用我們想要的所有資源。
因此,在遇到此類問題時遇到了一些麻煩,我在Google上花費了很多時間,發(fā)現(xiàn)了這個美麗的東西
spark.conf.set("spark.sql.shuffle.partitions", X)
可以在運行時中途隨時隨地更改此整潔的配置,它會影響設(shè)置后觸發(fā)的步驟。 您也可以在創(chuàng)建Spark會話時使用這個壞男孩。 在對聯(lián)接或聚合進行數(shù)據(jù)混排時,將使用此分區(qū)數(shù)量。 還獲得數(shù)據(jù)幀分區(qū)計數(shù):
df.rdd.getNumPartitions()
您可以估計最合適的混搭分區(qū)數(shù),以進行進一步的聯(lián)接和聚合。
也就是說,您有一個巨大的數(shù)據(jù)框,并且想要保留一些信息。 這樣就得到了大數(shù)據(jù)幀的分區(qū)數(shù)。 將shuffle分區(qū)參數(shù)設(shè)置為此值。 這樣一來,加入后就不會成為默認(rèn)值200! 更多并行性-我們來了!
3. 廣播Join
非常簡單的情況:我們有一個龐大的表,其中包含所有用戶,而我們的表中包含內(nèi)部用戶,質(zhì)量檢查人員和其他不應(yīng)包含在內(nèi)的用戶。 目標(biāo)只是離開非內(nèi)部人員。
讀兩個表
Huge_table 左防聯(lián)接小表
它看起來像是一個簡單且性能明智的好解決方案。 如果您的小型表小于10MB,則您的小型數(shù)據(jù)集將在沒有任何提示的情況下進行廣播。 如果在代碼中添加提示,則可能會使它在更大的數(shù)據(jù)集上運行,但這取決于優(yōu)化程序的行為。
但是,假設(shè)它是100-200MB,并且提示您不要強制廣播它。 因此,如果您確信它不會影響代碼的性能(或引發(fā)一些OOM錯誤),則可以使用它并覆蓋默認(rèn)值:
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", SIZE_OF_SMALLER_DATASET)
在這種情況下,它將廣播給所有執(zhí)行者,并且加入應(yīng)該工作得更快。
當(dāng)心OOM錯誤!
4. 分區(qū)vs合并vs隨機分區(qū)配置設(shè)置
如果您使用的是Spark,則可能知道重新分區(qū)方法。 對我來說,來自SQL后臺方法合并的方式有不同的含義! 顯然,在分區(qū)上進行火花合并時,其行為方式有所不同-它移動并將多個分區(qū)組合在一起。 基本上,我們將數(shù)據(jù)改組和移動減到最少。
如果我們只需要減少分區(qū)數(shù),則應(yīng)該使用合并而不是重新分區(qū),因為這樣可以最大程度地減少數(shù)據(jù)移動并且不會觸發(fā)交換。 如果我們想更均勻地在分區(qū)之間劃分?jǐn)?shù)據(jù),請重新分區(qū)。
但是,假設(shè)我們有一個重復(fù)出現(xiàn)的模式,我們執(zhí)行聯(lián)接/轉(zhuǎn)換并得到200個分區(qū),但是我們不需要200個分區(qū),即100個甚至1個。
讓我們嘗試進行比較。 我們將讀取11MB的文件夾,并像以前一樣進行匯總。
通過將數(shù)據(jù)幀持久存儲在僅存儲選件磁盤上,我們可以估計數(shù)據(jù)幀大小。 所以small_df只有10 MB,但是分區(qū)數(shù)是200。等等? 平均每個分區(qū)可提供50KB的數(shù)據(jù),這效率不高。 因此,我們將讀取大數(shù)據(jù)幀,并將聚合后的分區(qū)計數(shù)設(shè)置為1,并強制Spark執(zhí)行,最后我們將其算作一項操作。
這是我們?nèi)N情況的執(zhí)行計劃:
> Setting shuffle partition parameter
> Coalesce action
> Repartitioning
因此,在所有可見的設(shè)置中,我們不會調(diào)用Coalesce / Exchange的其他步驟(重新分區(qū)操作)。 因此,我們可以通過跳過它來節(jié)省一些執(zhí)行時間。 如果我們看一下執(zhí)行時間:Shuffle Partition設(shè)置在7.1分鐘,Coalesce 8.1,Repartition 8.3中完成。
這只是一個簡單的示例,它仍然顯示了通過設(shè)置一個配置參數(shù)可以節(jié)省多少時間!
關(guān)于如何使您的Apache Spark應(yīng)用程序更快,更高效地運行,有許多小而簡單的技巧和竅門。 不幸的是,使用Spark時,大多數(shù)情況下解決方案都是單獨的。 為了使其正常工作,大多數(shù)時候您必須了解Spark內(nèi)部組件的內(nèi)幕,并從頭到尾閱讀文檔多次。
我提到了如何更快地讀取多個小文件,如何強制建議廣播連接,選擇何時使用shuffle分區(qū)參數(shù),合并和重新分區(qū)。
看完上述內(nèi)容,你們掌握提高Apache Spark工作性能的技巧有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站題目:提高ApacheSpark工作性能的技巧有哪些
鏈接地址:http://www.rwnh.cn/article28/jgjjjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、手機網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站排名、App設(shè)計、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)