通过此Spark教程获得有关Kubernetes中大数据的炒作培训
动机/前奏
在上一篇文章中,我解释了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,然后在完成工作后清理它们:
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.jar10000000
/<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,如下所示:
您还可以像这样检查日志:
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)