如何在60分钟内从源代码构建Spark并将其部署到Kubernetes集群

通过此Spark教程获得有关Kubernetes中大数据的炒作培训

如何在60分钟内从源代码构建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 [email protected]: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,然后在完成工作后清理它们:

如何在60分钟内从源代码构建Spark并将其部署到Kubernetes集群

> 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,如下所示:

如何在60分钟内从源代码构建Spark并将其部署到Kubernetes集群

> 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)


分享到:


相關文章: