如何在60分鐘內從源代碼構建Spark並將其部署到Kubernetes集群

通過此Spark教程獲得有關Kubernetes中大數據的炒作培訓

> Match made in heaven? Sources: Spark Logo, k8s Logo, Emoji

動機/前奏

在上一篇文章中,我解釋了Hadoop生態系統的廣泛特徵,您可以在此處閱讀有關它的內容。 這篇文章的重點是結尾,我將在我的另一篇文章中公然竊,因為它也是這篇文章的開始:

現在,如果您過去幾年一直在聆聽Hadoop的生態系統,您會發現市場上兩個最大的參與者– Cloudera和Hortonworks –大約在一年前合併了,這是由於Hadoop大數據市場的放緩 。 加上這樣一個事實,人們對Kubernetes的興趣似乎比對諸如資源管理和編排的YARN等較早的Hadoop特定技術更感興趣,對PyTorch等DL框架的快速採用使您對老化的Hadoop堆棧形成了完美的風暴。 儘管如此,諸如Apache Spark之類的項目正在通過諸如 引入Kubernetes替代YARN。 生態系統的激動人心的時刻!

介紹

本文的目的是向您展示2020年大數據生態系統中一些很棒的孩子正在做什麼; 試圖將東西塞進Kubernetes(這是一件好事!)。 更具體地說,使用Spark的本地Spark驅動程序和執行器的實驗性實現,其中Kubernetes是資源管理器(而不是YARN)

……讓我們在60分鐘內完成此操作:

· 從GitHub克隆Spark項目

· 使用Maven構建Spark發行版

· 在本地構建Docker映像

· 使用多個執行程序副本運行Spark Pi作業

· 使用端口轉發在瀏覽器中顯示Spark UI並檢查Spark作業

如果就這麼簡單,為什麼我們需要這篇文章? 請繼續閱讀,以瞭解這是如何花費我幾天時間來解決的。

免責聲明:您在60分鐘內的行駛里程可能會有所不同,但是在您通常知道如何在計算機上進行操作(包括設置本地k8s集群並運行bash腳本等)的前提下,這確實可行。 此外,如果計算機速度較慢,則構建Spark可能需要一段時間;)

現在所有人都參加了,讓我們在Kubernetes上部署Spark。 為此,您可以使用筆記本電腦運行的磨機minikube設置,而不是僅為此練習而在公共雲中租用服務器。 除非您想全力以赴,否則您將被敬禮。

步驟1-3(克隆存儲庫,構建Spark,構建Docker映像):

這實際上就是樂趣的開始-在"最簡單"的步驟上。 好吧,戴上安全帶並檢查一下(雙關語意):

如果您在此處克隆官方的Spark信息庫,並且無意遵循此處在k8s中運行Spark的官方Spark指南,則會遇到我幾天前在Spark的Jira待辦事項中打開的問題。

也就是說,Dockerfile中存在多個錯誤的引用,因此,僅運行Dockerfile註釋中所述的docker build命令將不起作用。

更新:好吧,事實證明,您實際上可以按照文檔中的描述運行內容,但前提是您需要特別注意。

而不是Run

./build/mvn -Pkubernetes -DskipTests clean package

你需要Run

dev/make-distribution.sh -Pkubernetes

這會創建一個Spark發行版本,而不僅僅是正常的裝配點滴,但我想我跳過了他們教程中的精簡版,因此我相應地更新了本文。

tl; dr完成步驟1-3只需執行以下操作:

<code>

git

clone git@github.com:apache/spark.git

cd

spark

-Pkubernetes

cd

dist

docker

build -t spark:latest -f kubernetes/dockerfiles/spark/Dockerfile .

/<code>

此時,您應該在本地Docker註冊表中有一個Spark映像!

步驟4:在Kubernetes中使用多個執行程序副本運行Spark Pi作業:

我在上面鏈接的Spark文章提到但並未作為熱門話題進行解釋,是由於Kubernetes的RBAC(基於角色的訪問控制),您不能簡單地將Spark部署到集群中,因為Spark需要對Kubernetes擁有一些附加權利 集群來管理吊艙。 這是由於Spark的體系結構-您部署了一個Spark驅動程序,該驅動程序可以在pod中創建Spark Executor,然後在完成工作後清理它們:

> Spark's architecture on Kubernetes from their documentation

tl; dr我們需要使用kubectl for Spark創建一個服務帳戶:

<code>kubectl create serviceaccount spark kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=

default

:spark --

namespace

=

default

/<code>

下一步是使用我們本地構建的Docker映像運行Spark Pi:

<code>bin/spark-submit \

local

:///opt/spark/examples/jars/spark-examples_2

.12

-3.1

.0

-SNAPSHOT.jar

10000000

/<code>

好的,但是這裡實際發生了什麼。 好了,這就是將Spark驅動程序部署到Kubernetes集群中的方式! 讓我們遍歷這些參數,以便您隨後可以真正開始使用它:

· 定義Kubernetes集群(使用kubectl cluster-info查找)。 是的,需要有點奇怪的k8s://前綴。

· 定義部署模式(集群,duh)

· 定義Spark驅動程序的名稱(這也是您的窗格名稱的開頭)

· 定義Spark Pi示例

· 在Kubernetes上運行帶有2個副本的Spark Executor,這些副本將由您的Spark驅動程序生成

· 使用我們的本地星火:最新圖片

· 將Kubernetes映像拉策略定義為從不,因此可以使用具有該名稱的本地映像。 如果您對k8的內部運作不是很熟悉,那肯定要花一分鐘的時間來找出……

· 定義服務帳戶(還記得RBAC嗎?)

· 指向帶有參數10000000的本地jar路徑(該路徑與Dockerfile中的所有其他示例一起復制到指定路徑)(如果您不知道該數字的含義,請查看Spark Pi源代碼和文檔)。 是的,local:///是正確的,不是錯字。

kubectl get pods

現在應該返回正在運行的Pod列表! 並且不必擔心它們最終何時終止—這是此實現的默認設置。

步驟5:使用端口轉發顯示Spark UI

kubectl port-forward 4040:4040

然後,您應該能夠從瀏覽器上方的第一個命令使用localhost:4040訪問Spark UI,如下所示:

> This is a screenshot of my localhost:4040 with port forwarding

您還可以像這樣檢查日誌:

kubectl -n=default logs -f

結論

如果您非常瞭解Spark和Kubernetes,則使用config和Dockerfile進行此精確設置可能非常簡單,否則就可能有些噩夢。 我希望這可以幫助您在幾分鐘內完成此操作!

你從這裡去哪裡? 任何你想的地點都可以。 本文的目標是使用適用於Spark的新式高級資源管理器快速入門並使其運行。 我建議您與其他Spark應用程序一起使用此設置,作為下一步-將來我可能只寫一些更復雜的示例的文章(讓我知道是否可以)。

玩Kubernetes!


備擇方案

這是2020年4月20日的更新,您還可以使用Google的本地Kubernetes運營商,這似乎很有希望,並且可以將手動部署步驟刪除到您的集群中:

例如,目前正在使用它。 Salesforce和Microsoft已投入生產,Uber和Lyft正在對其生產進行評估。 將來需要注意的事情!

(本文翻譯自Nikolay Dimolarov的文章《How to build Spark from source and deploy it to a Kubernetes cluster in 60 minutes》,參考:
https://towardsdatascience.com/how-to-build-spark-from-source-and-deploy-it-to-a-kubernetes-cluster-in-60-minutes-225829b744f9)