成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你Spark性能調(diào)優(yōu)

大數(shù)據(jù) Spark
日前接到反饋,集群部分 spark 任務(wù)執(zhí)行很慢,且經(jīng)常出錯,參數(shù)改來改去怎么都無法優(yōu)化其性能和解決頻繁隨機報錯的問題。

0、背景

日前接到反饋,集群部分 spark 任務(wù)執(zhí)行很慢,且經(jīng)常出錯,參數(shù)改來改去怎么都無法優(yōu)化其性能和解決頻繁隨機報錯的問題。

看了下任務(wù)的歷史運行情況,平均時間 3h 左右,而且極其不穩(wěn)定,偶爾還會報錯:

手把手教你Spark性能調(diào)優(yōu)

1、優(yōu)化思路

任務(wù)的運行時間跟什么有關(guān)?

(1)數(shù)據(jù)源大小差異

在有限的計算下,job的運行時長和數(shù)據(jù)量大小正相關(guān),在本例中,數(shù)據(jù)量大小基本穩(wěn)定,可以排除是日志量級波動導(dǎo)致的問題:

(2)代碼本身邏輯缺陷

比如代碼里重復(fù)創(chuàng)建、初始化變量、環(huán)境、RDD資源等,隨意持久化數(shù)據(jù)等,大量使用 shuffle 算子等,比如reduceByKey、join等算子。

在這份100行的代碼里,一共有 3 次 shuffle 操作,任務(wù)被 spark driver 切分成了 4 個 stage 串行執(zhí)行,代碼位置如下:

手把手教你Spark性能調(diào)優(yōu)

 

咱們需要做的就是從算法和業(yè)務(wù)角度盡可能減少 shuffle 和 stage,提升并行計算性能,這塊是個大的話題,本次不展開詳述。

(3)參數(shù)設(shè)置不合理

這塊技巧相對通用,咱們來看看之前的核心參數(shù)設(shè)置:

  1. num-executors=10 || 20 ,executor-cores=1 || 2, executor-memory= 10 || 20,driver-memory=20,spark.default.parallelism=64 

假設(shè)咱們的 spark 隊列資源情況如下:

  1. memory=1T,cores=400 

參數(shù)怎么設(shè)置在這里就有些技巧了,首先得明白 spark 資源的分配和使用原理:

在默認的非動態(tài)資源分配場景下, spark 是預(yù)申請資源,任務(wù)還沒起跑就獨占資源,一直到整個 job 所有 task 結(jié)束,比如你跳板機起了一個 spark-shell 一直沒退出,也沒執(zhí)行任務(wù),那也會一直占有所有申請的資源。(如果設(shè)置了 num-executors,動態(tài)資源分配會失效)

注意上面這句話,spark 的資源使用分配方式和 mapreduce/hive 是有很大差別的,如果不理解這個問題就會在參數(shù)設(shè)置上引發(fā)其它問題。

比如 executor-cores 設(shè)多少合適?少了任務(wù)并行度不行,多了會把整個隊列資源獨占耗光,其他同學(xué)的任務(wù)都無法執(zhí)行,比如上面那個任務(wù),在 num-executors=20 executor-cores=1 executor-memory= 10 的情況下,會獨占20個cores,200G內(nèi)存,一直持續(xù)3個小時。

那針對本case中的任務(wù),結(jié)合咱們現(xiàn)有的資源,如何設(shè)置這 5 個核心參數(shù)呢?

  • 1) executor_cores*num_executors 不宜太小或太大!一般不超過總隊列 cores 的 25%,比如隊列總 cores 400,***不要超過100,最小不建議低于 40,除非日志量很小。
  • 2) executor_cores 不宜為1!否則 work 進程中線程數(shù)過少,一般 2~4 為宜。
  • 3) executor_memory 一般 6~10g 為宜,***不超過 20G,否則會導(dǎo)致 GC 代價過高,或資源浪費嚴重。
  • 4) spark_parallelism 一般為 executor_cores*num_executors 的 1~4 倍,系統(tǒng)默認值 64,不設(shè)置的話會導(dǎo)致 task 很多的時候被分批串行執(zhí)行,或大量 cores 空閑,資源浪費嚴重。
  • 5) driver-memory 早前有同學(xué)設(shè)置 20G,其實 driver 不做任何計算和存儲,只是下發(fā)任務(wù)與yarn資源管理器和task交互,除非你是 spark-shell,否則一般 1-2g 就夠了。

Spark Memory Manager:

  • 6)spark.shuffle.memoryFraction(默認 0.2) ,也叫 ExecutionMemory。這片內(nèi)存區(qū)域是為了解決 shuffles,joins, sorts and aggregations 過程中為了避免頻繁IO需要的buffer。如果你的程序有大量這類操作可以適當(dāng)調(diào)高。
  • 7)spark.storage.memoryFraction(默認0.6),也叫 StorageMemory。這片內(nèi)存區(qū)域是為了解決 block cache(就是你顯示調(diào)用dd.cache, rdd.persist等方法), 還有就是broadcasts,以及task results的存儲。可以通過參數(shù),如果你大量調(diào)用了持久化操作或廣播變量,那可以適當(dāng)調(diào)高它。
  • 8)OtherMemory,給系統(tǒng)預(yù)留的,因為程序本身運行也是需要內(nèi)存的, ​(默認為0.2)。Other memory在1.6也做了調(diào)整,保證至少有300m可用。你也可以手動設(shè)置 spark.testing.reservedMemory . 然后把實際可用內(nèi)存減去這個reservedMemory得到 usableMemory。 ExecutionMemory 和 StorageMemory 會共享usableMemory * 0.75的內(nèi)存。0.75可以通過 新參數(shù) spark.memory.fraction 設(shè)置。目前spark.memory.storageFraction 默認值是0.5,所以ExecutionMemory,StorageMemory默認情況是均分上面提到的可用內(nèi)存的。

例如,如果需要加載大的字典文件,可以增大executor中 StorageMemory 的大小,這樣就可以避免全局字典換入換出,減少GC,在這種情況下,我們相當(dāng)于用內(nèi)存資源來換取了執(zhí)行效率。

效果如下:

手把手教你Spark性能調(diào)優(yōu)

(4)通過執(zhí)行日志分析性能瓶頸

***的任務(wù)還需要一個小時,那這一個小時究竟耗在哪了?按我的經(jīng)驗和理解,一般單天的數(shù)據(jù)如果不是太大,不涉及復(fù)雜迭代計算,不應(yīng)該超過半小時才對。

由于集群的 Spark History Server 還沒安裝調(diào)試好,沒法通過 spark web UI 查看歷史任務(wù)的可視化執(zhí)行細節(jié),所以我寫了個小腳本分析了下前后具體的計算耗時信息,可以一目了然的看到是哪個 stage 的問題,有針對性的優(yōu)化。

可以看到優(yōu)化后的瓶頸主要在***寫 redis 的階段,要把 60G 的數(shù)據(jù),25億條結(jié)果寫入 redis,這對 redis 來說是個挑戰(zhàn),這個就只能從寫入數(shù)據(jù)量和 kv 數(shù)據(jù)庫選型兩個角度來優(yōu)化了。

手把手教你Spark性能調(diào)優(yōu)

(5)其它優(yōu)化角度

當(dāng)然,優(yōu)化和高性能是個很泛、很有挑戰(zhàn)的話題,除了前面提到的代碼、參數(shù)層面,還有怎樣防止或減少數(shù)據(jù)傾斜等,這都需要針對具體的場景和日志來分析,此處也不展開。

2、spark 初學(xué)者的一些誤區(qū)

對于初學(xué)者來說 spark 貌似無所不能而且高性能,甚至在某些博客、技術(shù)人眼里 spark 取代 mapreduce、hive、storm 分分鐘的事情,是大數(shù)據(jù)批處理、機器學(xué)習(xí)、實時處理等領(lǐng)域的銀彈。但事實確實如此嗎?

從上面這個 case 可以看到,會用 spark、會調(diào) API 和能用好 spark,用的恰到好處是兩碼事,這要求咱們不僅了解其原理,還要了解業(yè)務(wù)場景,將合適的技術(shù)方案、工具和合適的業(yè)務(wù)場景結(jié)合——這世上本就不存在什么銀彈。。。

說道 spark 的性能,想要它快,就得充分利用好系統(tǒng)資源,尤其是內(nèi)存和CPU:核心思想就是能用內(nèi)存 cache 就別 spill 落磁盤,CPU 能并行就別串行,數(shù)據(jù)能 local 就別 shuffle。

別手握屠龍寶刀,卻用來切水果,還嫌不利索。:)

責(zé)任編輯:未麗燕 來源: 網(wǎng)絡(luò)大數(shù)據(jù)
相關(guān)推薦

2017-07-07 11:01:04

Spark性能調(diào)優(yōu)

2011-02-22 13:46:27

微軟SQL.NET

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2021-06-07 09:35:11

架構(gòu)運維技術(shù)

2022-03-08 11:17:54

函數(shù)指針回調(diào)函數(shù)C語言

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2024-03-05 18:27:43

2024-04-02 08:58:13

2020-08-12 07:41:39

SQL 優(yōu)化語句

2021-07-01 09:31:50

MySQL SQL 語句數(shù)據(jù)庫

2011-04-28 15:09:15

jQueryjqPlot
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 精品久久久久久久久久久 | 欧美日韩国产高清视频 | 91视频在线观看免费 | 日韩免费视频一区二区 | 日韩av美女电影 | 欧美国产日本一区 | 成人激情视频在线播放 | 日韩精品免费在线观看 | 天堂成人国产精品一区 | 激情 亚洲 | 狠狠久久久 | 欧美日韩在线视频一区二区 | 91精品成人久久 | 国产探花 | 特一级毛片 | 中文日韩在线 | 亚洲电影中文字幕 | 久久精品欧美一区二区三区不卡 | 亚洲精品视频在线播放 | 免费在线观看av片 | 91一区二区三区在线观看 | 中文字幕在线国产 | 久久中文字幕一区 | 久久精品国产一区二区电影 | 精品国产乱码久久久久久丨区2区 | av网站在线免费观看 | 9久9久9久女女女九九九一九 | 亚洲精品中文字幕在线观看 | 午夜精品久久久久久久99黑人 | 日本免费一区二区三区四区 | 日日天天 | 成在线人视频免费视频 | 一级免费在线视频 | 亚洲毛片 | 国产成人91视频 | 国产精品福利网 | 鲁一鲁资源影视 | 日本高清aⅴ毛片免费 | 欧洲高清转码区一二区 | 久久美女网 | 日韩一区二区av |