<ins id="jxy61"><option id="jxy61"><menu id="jxy61"></menu></option></ins>
          1. 煉數成金 門戶 大數據 架構 查看內容

            Spark on K8S 的最佳實踐和需要注意的坑

            2020-7-30 18:20| 發布者: 煉數成金_小數| 查看: 68456| 評論: 0|來自: 過往記憶大數據

            摘要: Spark 哪個地方需要用到 K8S 呢?K8S 是 Spark 上全新的集群管理和調度系統,其他三個資源管理和調度為 Standalone、YARN 以及 Apache Mesos。YARN 集群中的 Spark 版本、Python 版本以及依賴都是全局配置的,缺乏隔 ...
            本文來自 Data Mechanics 的 CEO Jean-Yves Stephan 和 CTO Julien Dumazert 在 Spark Summit North America 2020 的 《Running Apache Spark on Kubernetes: Best Practices and Pitfalls》議題的分享。相關視頻參見 視頻|在Kubernetes上運行Spark的較佳實踐和陷阱,PPT 可以到 你要的 Spark AI Summit 2020 PPT 我已經給你整理好了 獲取。

            近年來,K8S 在業界越來越流行,由于其有很多優點,很多企業將應用部署到 K8S 中,Spark 從 2.3 版本開始支持使用 K8S 作為資源管理器,參見 https://issues.apache.org/jira/browse/SPARK-18278。本文將介紹在 K8S 上運行 Spark 作業的較佳實踐和需要注意的坑。

            在 Kubernetes 上運行 Spark 都有哪些經驗的調查中顯示:
            61% 的人表示從來沒用過,但是對這個感到好奇;
            24% 的人表示只是在測試環境中使用,但是并沒有在生產環境中使用;
            15% 的人表示已經在生產環境中使用。

            本文主要結構包括:Spark on Kubernetes:
            核心概念;
            配置和性能調優技巧;
            監控和安全相關的技巧;
            未來工作。

            核心概念
            Spark 哪個地方需要用到 K8S 呢?K8S 是 Spark 上全新的集群管理和調度系統,其他三個資源管理和調度為 Standalone、YARN 以及 Apache Mesos。

            Spark on Kubernetes 的架構如下:

            目前有兩種方法可以將 Spark 的應用程序提交到 K8S:

            •通過 Spark 提供的 spark-summit 提交
            •這種方式是 Spark 原生提供的;
            •配置在 Spark config(主要)和 k8s manifests 之間傳遞;
            •在 Spark 3.0 之前支持自定義 Little pod;
            •應用的管理主要是人工維護。
            •通過 spark-on-k8s operator 提交
            •Google 開源出來的,但是支持任意平臺;
            •配置通過 k8s 風格的 YAML 文件進行;
            •提供一些工具用于讀取日志、重啟、 kill 以及調度 作業;
            •需要長時間運行的 system pod。

            上面顯示兩種不同作業提交方式的應用管理實踐。從上圖可以看出,通過 spark-summit 方式提交的作業沒有方法查看作業的運行及其參數配置等。而通過 spark-on-k8s operator 方式,可以通過一系列的內置工具,獲取很多作業相關的信息。


            YARN 和 K8S 兩種資源管理方式比較:
            YARN 集群中的 Spark 版本、Python 版本以及依賴都是全局配置的,缺乏隔離。(過往記憶大數據備注:YARN 集群上是可以運行不同版本的 Spark 以及 Python,這個我之前有相關文章介紹的。關于依賴其實也有辦法進行配置的。) 而 K8S 方式作業之間都是隔離的。

            配置和性能調優技巧
            下面我們來介紹 Spark on K8S 的配置和性能調優相關技巧。

            假設我們有一個 K8S 集群,每個實例配置是 16GB 內存和4核;如果我們選擇以下兩種中的一種配置我們都將申請不到 executor:
            設置 spark.executor.cores=4
            設置 spark.executor.memory=11g

            是不是覺得很奇怪?

            上面設置之所以申請不到 executor,是因為:K8S 實例上的資源只有一部分是可以給 Spark pods 的。我們需要預留一部分資源給 K8S 以及系統守護進程,這部分大概占用 5%。所以我們的節點只能申請到 95% 的資源,在這些資源中 10% 需要給一些守護進程使用,所以整個實例我們只能申請到 95% * 90% = 85% 的資源。


            目前 Spark on K8S 還不支持動態資源分配的全部功能。當我們殺掉 pod 時,上面的 shuffle 文件將會被丟失。

            與此同時,Spark 3.0 提供了一個 soft dynamic allocation 功能。只有不持有需要的 shuffle 文件的 executor 可以被刪掉。相關配置如下:
            spark.dynamicAllocation.enabled=true
            spark.dynamicAllocation.shuffleTracking.enabled=true

            如果無法分配 pending Pods,我們可以將 k8s 配置為自動縮放。自動縮放在動態資源申請的情況下工作非常好:
            如果集群有資源,我們可以在10s內獲取一個新的 exec pod;
            如果集群需要自動縮放,則需要 1-2 分鐘。

            為了進一步提高動態分配的速度,我們可以過量使用低優先級的 pause pods 來配置集群:
            pause pods 強制 k8s 來動態縮放;
            在需要時,Spark pods 將搶占 pause pods 的資源。

            Spark on K8S 的場景下,數據的讀寫一般都是經過對象存儲的。云廠商一般會為其對象存儲提供寫優化的 committers,比如 S3A Committers。

            如果沒有提供的話,建議使用 Spark 自帶的 version 2 Hadoop committer,可以通過以下參數配置:
            spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2
            如果你有很多文件需要寫時,這個配置可以將性能提升近2倍!


            I/O 速度對于 shuffle 很重的工作負載來說至關重要,因為 Spark 會將 shuffle 的數據寫到本地文件。但是 Docker 的文件系統非常慢,我們可以通過 Kubernetes Volumes 來提升性能。具體參見 https://spark.apache.org/docs/3.0.0-preview2/running-on-kubernetes.html#using-kubernetes-volumes。

            監控和安全相關的技巧

            我們可以通過 k8s 提供的工具來兼監控 pod 的資源使用情況。比如 Kubernetes dashboard 或者 GKE 控制臺。

            已知的問題:上面的監控方法比較難與  Spark jobs/stages/tasks 進行協調;當 Spark 應用程序運行完時,Executor 的監控數據將會丟失。


            上面的問題我們可以通過按照 Spark 歷史服務器來解決?梢詫 Spark 的事件日志存放在 S3/GCS/Azoure 存儲文件,并配置 spark.eventLog.dir 參數到相關路徑。但是這種方式我們無法獲取資源使用相關的 metrics!

            Data Mechanics 的 工程師們開發了 Spark Delight,其可以解決上面的問題。關于 Spark Delight 可以參見 https://towardsdatascience.com/spark-delight-were-building-a-better-spark-ui-1b463840e243。

            Spark 利用 DropWizard 類庫來產生詳細的 metrics。我們可以將這些 metrics 存儲到時序數據庫中:
            InfluxDB
            Prometheus,這個在 Spark 3.0 中已經內置支持將監控信息寫到 Prometheus 中。

            K8S 上的安全較佳實踐對 Spark on K8S 來說是可以免費使用的!我們可以進行訪問控制、密碼配置以及網絡安全配置等。

            未來工作


            Spark on K8S 未來工作主要包括:
            Shuffle 相關問題的提升;
            更友好的處理節點的關閉;
            支持上傳本地 python 依賴;
            Job 隊列以及資源管理。
            經過上面的介紹,你是否打算使用 K8S 呢?

            如果打算使用Spark-on-Kubernetes,上面的事項是需要你做的。關于 Spark on K8S 的更多內容可以參見 https://spark.apache.org/docs/3.0.0/running-on-kubernetes.html。

            聲明:文章收集于網絡,版權歸原作者所有,為傳播信息而發,如有侵權,請聯系小編刪除,謝謝!

            歡迎加入本站公開興趣群
            軟件開發技術群
            興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發經驗交流,各種框架使用,外包項目機會,學習、培訓、跳槽等交流
            QQ群:26931708

            Hadoop源代碼研究群
            興趣范圍包括:Hadoop源代碼解讀,改進,優化,分布式系統場景定制,與Hadoop有關的各種開源項目,總之就是玩轉Hadoop
            QQ群:288410967 

            鮮花

            握手

            雷人

            路過

            雞蛋

            相關閱讀

            最新評論

            熱門頻道

            • 大數據

            即將開課

             

            GMT+8, 2021-5-1 18:00 , Processed in 0.191645 second(s), 24 queries .

            年轻人手机在线观看