1. 程式人生 > 其它 >遷移到Spark Operator和S3的4個整合步驟

遷移到Spark Operator和S3的4個整合步驟

技術標籤:雲原生kubernetesspark雲端儲存hdfs

2020年CNCF中國雲原生調查

10人將獲贈CNCF商店$100美元禮券!

你填了嗎?

image

問卷連結(https://www.wjx.cn/jq/97146486.aspx


客座文章作者:萬事達卡首席軟體開發工程師Allison Richardet

在萬事達,內部雲團隊維護我們的Kubernetes平臺。我們的工作包括維護Kubernetes叢集,這是我們所依賴的核心部署,併為租戶提供了日誌、監控等服務,併為租戶提供了良好的體驗。

我們的租戶之一,資料倉庫團隊,曾經在YARN和HDFS上使用過原生Apache Spark。他們找了我們的團隊,希望將他們的大資料工作轉移到Kubernetes;他們想要實現雲原生化,而我們也有機會在Kubernetes上與Apache Spark合作。

所以,我們的旅程從Spark Operator開始。向Kubernetes和Operators的遷移將為我們的內部客戶資料倉庫團隊開啟雲原生的可能性。我們有機會幫助他們利用可伸縮性和成本改進的優勢,而切換到S3將進一步實現這些目標。

背景

操作器(operator)是什麼,為什麼我們,或者你,對此感興趣?首先,操作器使用自定義資源擴充套件了Kubernetes API。操作器還定義了一個自定義控制器來監視其資源型別。將自定義資源與自定義控制器結合在一起會產生一個宣告性API,在這個API中,操作器會協調叢集宣告狀態與實際狀態之間的差異。換句話說,操作器處理與其資源相關的自動化。

有了這些好處,我們的團隊很高興能夠利用Kubernetes的Spark操作器來支援我們的租戶。通常,原生Apache Spark使用HDFS。然而,遷移到雲端並在Kuberentes上執行Spark操作器,S3是HDFS的一個很好的替代方案,因為它具有成本優勢,並且能夠根據需要進行擴充套件。有趣的是,S3在預設情況下不能與Spark操作器一起使用。我們參考了Spark操作器以及Hadoop-AWS整合文件。此外,我們將分享以下4個步驟的詳細資訊:映象更新、SparkApplication配置、S3憑據和S3樣式。遵循我們的步驟,將S3與你的Spark作業和Kubernetes的Spark操作器進行整合。

工作流程

與我們部署到Kubernetes叢集的大多數應用程式一樣,我們使用Helm chart。Kubernetes的Apache Spark操作器的Helm chart可以在這裡找到。

Values & Helm 模板

我們更新values.yaml,然後執行helm template生成我們將部署到Kubernetes叢集的清單。我們發現,對將要建立的內容具有可見性和對部署的控制是值得額外步驟的;模板儲存在git中,我們的CD工具負責部署。

預設的chart values將允許你快速啟動和執行。根據你的需要,以下是你可能需要做的一些修改:

  • 啟用webhook:預設情況下,不啟用Mutating Admission Webhook。啟用允許自定義SparkApplication驅動程式和執行程式pod,包括掛載卷、ConfigMaps、親和性/非親和性等等。
  • 定義ingressUrlFormat:Spark UI可選的ingress。

請參閱快速入門指南和預設values.yaml獲取更多詳細資訊和選項。

需求

要執行使用S3的SparkApplication,需要SparkApplication的附加配置,包括一個自定義docker映象。Hadoop S3AConnector是一種可以對S3進行讀寫的工具。

1. 映象更新

SparkApplication使用的docker映象需要新增兩個jar(hadoop-aws和aws-java-sdk或aws-java-sdk-bundle),版本根據Spark版本和Hadoop配置檔案。

在這一步中有幾件事情要記住。

  • 使用者和許可權
  • 額外的Jar

如果使用spark映象作為起點,在新增jar時引用它們各自的dockerfile以正確對齊使用者和位置。

讓我們來看看python Dockerfile。在執行任何安裝任務之前,使用者被設定為root,然後重置為${spark_uid}。

通過檢查基本映象,可以看到jar位於/opt/spark/jars或$SPARK_HOME/jars中。最後,更新jar的許可權,以便能夠使用它們。

上傳到S3的文件提供了使用jar檔案的資訊;然而,我們需要一個包含fs.s3a.path.style.access配置的新Hadoop版本——我們將在後面一節中討論這個問題。在編寫本文時,我們使用spark操作器版本v1beta2-1.2.0-3.0.0,其中包含基本spark版本3.0.0。使用gcr.io/spark-operator/spark-py:v3.0.0-hadoop3映象作為起點,我們添加了以下jar:hadoop-aws-3.1.0.jar和aws-java-sdk-bundle-1.11.271.jar。它需要一些實驗來確定最終能工作的正確映象組合。

2. SparkApplication配置

SparkApplication需要額外的配置才能與S3通訊。spec.sparkConf中要求的最小配置如下:

sparkConf:
    spark.hadoop.fs.s3a。端點:<端點>
    spark.hadoop.fs.s3a。impl: org.apache.hadoop.fs.s3a.S3AFileSystem

還必須提供訪問S3的憑據。有類似於上面的配置選項;但是,這是非常喪氣的,因為它們是字串值,因此與安全最佳實踐相違背。

3. S3憑證

我們不在SparkApplication的sparkConf中提供s3憑據,而是建立一個Kubernetes祕密,併為驅動程式和執行程式定義環境變數。Spark操作器文件提供了幾種使用secret的選項,以及用於掛載祕密指定環境變數的完整示例。

接下來,因為我們使用環境變數來驗證S3,我們在sparkConf中設定以下選項:

sparkConf:
     spark.hadoop.fs.s3a.aws.credentials.provider: com.amazonaws.auth.EnvironmentVariableCredentialsProvider

這是不需要的,如果沒有提供,將嘗試按照以下順序來嘗試憑據提供程式類:

  1. org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider
  2. com.amazonaws.auth.EnvironmentVariableCredentialsProvider
  3. com.amazonaws.auth.InstanceProfileCredentialsProvider

4. S3樣式

在SparkApplication的sparkConf中有一些其他的選項需要記住,這些選項是基於你特定的S3的:

sparkConf:
    extraJavaOptions: -Dcom.amazonaws.services.s3.enableV4=true
    spark.hadoop.fs.s3a.path.style.access: “true”
    spark.hadoop.fs.s3a.connection.ssl.enabled: “true”

路徑樣式訪問——通過啟用路徑樣式訪問,將禁用虛擬主機(預設啟用)。啟用路徑樣式訪問可以消除為預設虛擬主機設定DNS的需求。

啟用SSL——如果你正在使用TLS/SSL,請確保在SparkApplication的sparkConf中啟用這個選項。

額外的Java選項——根據你的需要而變化。

使用S3

現在你已經完成了使用S3的所有設定,現在有兩種選擇:利用S3處理依賴項或上傳到S3。

S3處理依賴項

mainApplicationFile和spark作業使用的附加依賴項(包括檔案或jar)也可以從S3中儲存和獲取。它們可以在spec.deps欄位中的SparkApplication中與其他依賴項一起定義。spark-submit會分別使用spec.deps.jar和spec.deps.files中指定的jar或檔案。s3中訪問依賴的格式為s3a://bucket/path/to/file。

上傳到S3

上傳到S3時,檔案位置的格式為s3a://bucket/path/to/destination。bucket必須存在,否則上傳失敗。如果destination檔案已經存在,上載將失敗。

總結

我們介紹了啟動並執行Spark操作器和S3所需的4個步驟:映象更新、SparkApplication的sparkConf中所需的選項、S3憑據以及基於特定S3的其他選項。最後,我們給出了一些關於如何利用S3來實現依賴關係和上傳到S3的建議。

最後,我們幫助我們的內部客戶,資料倉庫團隊,將他們的大資料工作負載從原生Apache Spark轉移到Kubernetes。Kubernetes上的Spark操作器在雲端計算方面有很大的優勢,我們想與更大的社群分享我們的經驗。我們希望這個關於Spark操作器和S3整合的演練將幫助你和/或你的團隊啟動並執行Spark操作器和S3。

點選閱讀網站原文


CNCF (Cloud Native Computing Foundation)成立於2015年12月,隸屬於Linux Foundation,是非營利性組織。
CNCF(雲原生計算基金會)致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新為大眾所用。掃描二維碼關注CNCF微信公眾號。
在這裡插入圖片描述