Spark on K8S 的最佳实践和需要注意的坑
本文來(lái)自 Data Mechanics 的 CEO Jean-Yves Stephan 和 CTO Julien Dumazert 在 Spark Summit North America 2020 的 《Running Apache Spark on Kubernetes: Best Practices and Pitfalls》議題的分享。相關(guān)視頻參見(jiàn) 視頻|在Kubernetes上運(yùn)行Spark的最佳實(shí)踐和陷阱,PPT 可以到 你要的 Spark AI Summit 2020 PPT 我已經(jīng)給你整理好了 獲取。
近年來(lái),K8S 在業(yè)界越來(lái)越流行,由于其有很多優(yōu)點(diǎn),很多企業(yè)將應(yīng)用部署到 K8S 中,Spark 從 2.3 版本開(kāi)始支持使用 K8S 作為資源管理器,參見(jiàn) https://issues.apache.org/jira/browse/SPARK-18278。本文將介紹在 K8S 上運(yùn)行 Spark 作業(yè)的最佳實(shí)踐和需要注意的坑。
在 Kubernetes 上運(yùn)行 Spark 都有哪些經(jīng)驗(yàn)的調(diào)查中顯示:
61% 的人表示從來(lái)沒(méi)用過(guò),但是對(duì)這個(gè)感到好奇;
24% 的人表示只是在測(cè)試環(huán)境中使用,但是并沒(méi)有在生產(chǎn)環(huán)境中使用;
15% 的人表示已經(jīng)在生產(chǎn)環(huán)境中使用。
本文主要結(jié)構(gòu)包括:Spark on Kubernetes:
核心概念;
配置和性能調(diào)優(yōu)技巧;
監(jiān)控和安全相關(guān)的技巧;
未來(lái)工作。
核心概念
Spark 哪個(gè)地方需要用到 K8S 呢?K8S 是 Spark 上全新的集群管理和調(diào)度系統(tǒng),其他三個(gè)資源管理和調(diào)度為 Standalone、YARN 以及 Apache Mesos。
Spark on Kubernetes 的架構(gòu)如下:
目前有兩種方法可以將 Spark 的應(yīng)用程序提交到 K8S:
?通過(guò) Spark 提供的 spark-summit 提交?這種方式是 Spark 原生提供的;?配置在 Spark config(主要)和 k8s manifests 之間傳遞;?在 Spark 3.0 之前支持自定義 Little pod;?應(yīng)用的管理主要是人工維護(hù)。?通過(guò) spark-on-k8s operator 提交?Google 開(kāi)源出來(lái)的,但是支持任意平臺(tái);?配置通過(guò) k8s 風(fēng)格的 YAML 文件進(jìn)行;?提供一些工具用于讀取日志、重啟、 kill 以及調(diào)度 作業(yè);?需要長(zhǎng)時(shí)間運(yùn)行的 system pod。
上面顯示兩種不同作業(yè)提交方式的應(yīng)用管理實(shí)踐。從上圖可以看出,通過(guò) spark-summit 方式提交的作業(yè)沒(méi)有方法查看作業(yè)的運(yùn)行及其參數(shù)配置等。而通過(guò) spark-on-k8s operator 方式,可以通過(guò)一系列的內(nèi)置工具,獲取很多作業(yè)相關(guān)的信息。
YARN 和 K8S 兩種資源管理方式比較:
YARN 集群中的 Spark 版本、Python 版本以及依賴都是全局配置的,缺乏隔離。(過(guò)往記憶大數(shù)據(jù)備注:YARN 集群上是可以運(yùn)行不同版本的 Spark 以及 Python,這個(gè)我之前有相關(guān)文章介紹的。關(guān)于依賴其實(shí)也有辦法進(jìn)行配置的。) 而 K8S 方式作業(yè)之間都是隔離的。
配置和性能調(diào)優(yōu)技巧
下面我們來(lái)介紹 Spark on K8S 的配置和性能調(diào)優(yōu)相關(guān)技巧。
假設(shè)我們有一個(gè) K8S 集群,每個(gè)實(shí)例配置是 16GB 內(nèi)存和4核;如果我們選擇以下兩種中的一種配置我們都將申請(qǐng)不到 executor:
設(shè)置 spark.executor.cores=4
設(shè)置 spark.executor.memory=11g
是不是覺(jué)得很奇怪?
上面設(shè)置之所以申請(qǐng)不到 executor,是因?yàn)?#xff1a;K8S 實(shí)例上的資源只有一部分是可以給 Spark pods 的。我們需要預(yù)留一部分資源給 K8S 以及系統(tǒng)守護(hù)進(jìn)程,這部分大概占用 5%。所以我們的節(jié)點(diǎn)只能申請(qǐng)到 95% 的資源,在這些資源中 10% 需要給一些守護(hù)進(jìn)程使用,所以整個(gè)實(shí)例我們只能申請(qǐng)到 95% * 90% = 85% 的資源。
目前 Spark on K8S 還不支持動(dòng)態(tài)資源分配的全部功能。當(dāng)我們殺掉 pod 時(shí),上面的 shuffle 文件將會(huì)被丟失。
與此同時(shí),Spark 3.0 提供了一個(gè) soft dynamic allocation 功能。只有不持有需要的 shuffle 文件的 executor 可以被刪掉。相關(guān)配置如下:
spark.dynamicAllocation.enabled=true
spark.dynamicAllocation.shuffleTracking.enabled=true
如果無(wú)法分配 pending Pods,我們可以將 k8s 配置為自動(dòng)縮放。自動(dòng)縮放在動(dòng)態(tài)資源申請(qǐng)的情況下工作非常好:
如果集群有資源,我們可以在10s內(nèi)獲取一個(gè)新的 exec pod;
如果集群需要自動(dòng)縮放,則需要 1-2 分鐘。
為了進(jìn)一步提高動(dòng)態(tài)分配的速度,我們可以過(guò)量使用低優(yōu)先級(jí)的 pause pods 來(lái)配置集群:
pause pods 強(qiáng)制 k8s 來(lái)動(dòng)態(tài)縮放;
在需要時(shí),Spark pods 將搶占 pause pods 的資源。
Spark on K8S 的場(chǎng)景下,數(shù)據(jù)的讀寫一般都是經(jīng)過(guò)對(duì)象存儲(chǔ)的。云廠商一般會(huì)為其對(duì)象存儲(chǔ)提供寫優(yōu)化的 committers,比如 S3A Committers。
如果沒(méi)有提供的話,建議使用 Spark 自帶的 version 2 Hadoop committer,可以通過(guò)以下參數(shù)配置:
spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
如果你有很多文件需要寫時(shí),這個(gè)配置可以將性能提升近2倍!
I/O 速度對(duì)于 shuffle 很重的工作負(fù)載來(lái)說(shuō)至關(guān)重要,因?yàn)?Spark 會(huì)將 shuffle 的數(shù)據(jù)寫到本地文件。但是 Docker 的文件系統(tǒng)非常慢,我們可以通過(guò) Kubernetes Volumes 來(lái)提升性能。具體參見(jiàn) https://spark.apache.org/docs/3.0.0-preview2/running-on-kubernetes.html#using-kubernetes-volumes。
監(jiān)控和安全相關(guān)的技巧
我們可以通過(guò) k8s 提供的工具來(lái)兼監(jiān)控 pod 的資源使用情況。比如 Kubernetes dashboard 或者 GKE 控制臺(tái)。
已知的問(wèn)題:上面的監(jiān)控方法比較難與 Spark jobs/stages/tasks 進(jìn)行協(xié)調(diào);當(dāng) Spark 應(yīng)用程序運(yùn)行完時(shí),Executor 的監(jiān)控?cái)?shù)據(jù)將會(huì)丟失。
上面的問(wèn)題我們可以通過(guò)按照 Spark 歷史服務(wù)器來(lái)解決。可以將 Spark 的事件日志存放在 S3/GCS/Azoure 存儲(chǔ)文件,并配置 spark.eventLog.dir 參數(shù)到相關(guān)路徑。但是這種方式我們無(wú)法獲取資源使用相關(guān)的 metrics!
Data Mechanics 的 工程師們開(kāi)發(fā)了 ?Spark Delight?,其可以解決上面的問(wèn)題。關(guān)于 Spark Delight 可以參見(jiàn)??? https://towardsdatascience.com/spark-delight-were-building-a-better-spark-ui-1b463840e243。???
Spark 利用 DropWizard 類庫(kù)來(lái)產(chǎn)生詳細(xì)的 metrics。我們可以將這些 metrics 存儲(chǔ)到時(shí)序數(shù)據(jù)庫(kù)中:
InfluxDB
Prometheus,這個(gè)在 Spark 3.0 中已經(jīng)內(nèi)置支持將監(jiān)控信息寫到 Prometheus 中。
K8S 上的安全最佳實(shí)踐對(duì) Spark on K8S 來(lái)說(shuō)是可以免費(fèi)使用的!我們可以進(jìn)行訪問(wèn)控制、密碼配置以及網(wǎng)絡(luò)安全配置等。
未來(lái)工作
Spark on K8S 未來(lái)工作主要包括:
Shuffle 相關(guān)問(wèn)題的提升;
更友好的處理節(jié)點(diǎn)的關(guān)閉;
支持上傳本地 python 依賴;
Job 隊(duì)列以及資源管理。
經(jīng)過(guò)上面的介紹,你是否打算使用 K8S 呢?
如果打算使用Spark-on-Kubernetes,上面的事項(xiàng)是需要你做的。關(guān)于 Spark on K8S 的更多內(nèi)容可以參見(jiàn) https://spark.apache.org/docs/3.0.0/running-on-kubernetes.html。
總結(jié)
以上是生活随笔為你收集整理的Spark on K8S 的最佳实践和需要注意的坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spark On K8S与Spark O
- 下一篇: Spark on K8S 的现状与挑战