搭建Spark集群?没想到你是这样的k8s

在本文的例子中,你将使用 Kubernetes 和 Docker 创建一个功能型Apache Spark集群。

你将使用Spark standalone模式 安装一个 Spark master服务和一组Spark workers。

对于已熟悉这部分内容的读者,可以直接跳到 tl;dr 章节。

源代码

Docker 镜像主要基于https://github.com/mattf/docker-spark。源码托管在https://github.com/kubernetes/application-images/tree/master/spark

步骤零:准备工作

本示例假定你已经具备以下条件:

● 有已安装并运行的 kubernetes集群。

● 已在某个path路径中安装了kubectl 命令行工具。

● 已运行了一个spark-master的k8s service,可以使用‘spark-master’域名在kube DNS实例中自动发现该服务。

更多详细内容可在源码的Dockerfile中查看。

第一步:创建命名空间

$ kubectl create-f examples/spark/namespace-spark-cluster.yaml

现在列出所有命名空间:

$ kubectlgetnamespaces

NAME          LABELS            STATUS

defaultActive

spark-cluster name=spark-clusterActive

对于kubectl 客户端使用的命名空间,我们定义一个环境并使用它:

$ kubectl configset-context spark--namespace=spark-cluster--cluster=${CLUSTER_NAME}--user=${USER_NAME}

$ kubectl configuse-context spark

你可以在Kubernetes配置文件~/.kube/config中查看集群名称以及用户名称。

第二步:启动你的master服务

Master service 是 Spark集群的master服务。

使用 examples/spark/spark-master-controller.yaml 文件来创建一个replication controller 运行Spark Master服务。

$ kubectl create-f examples/spark/spark-master-controller.yaml

replicationcontroller"spark-master-controller"created

然后,用examples/spark/spark-master-service.yaml 文件来创建一个逻辑上的服务端点,Spark workers可以使用该服务来访问Master pod

$ kubectl create-f examples/spark/spark-master-service.yaml

service"spark-master"created

然后你可以为Spark Master WebUI 创建一个服务:

$ kubectl create-f examples/spark/spark-webui.yaml

service"spark-webui"created

查看 Master 是否能运行和可访问

$ kubectlgetpodsNAME                            READY    STATUS    RESTARTSAGEspark-master-controller-5u0q51/1Running08m

检查日志以查看master的状态。(使用上一条指令输出的pod名称)

{{{$ kubectl logs spark-master-controller-5u0q5

starting org.apache.spark.deploy.master.Master,logging to/opt/spark

-1.5.1-bin-hadoop2.6/sbin/../logs/spark--org.apache.spark.deploy.master.

-Master-1-spark-

master-controller-g0oao.out

SparkCommand:/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java-cp/

opt/spark-1.5.1-bin-hadoop2.6/sbin/../conf/:/opt/spark-1.5.1-bin-

hadoop2.6/lib/spark-assembly-1.5.1-hadoop2.6.0.jar:/opt/spark-1.5.1

-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar:/opt/spark-1.5.1-bin

--hadoop2.6/lib/datanucleus-core-3.2.10.jar:/opt/spark-1.5.1-bin-

-hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar-Xms1g-Xmx1gorg.apache.spark.deploy.master.Master--ip spark-master--port7077

---webui-port8080

========================================

15/10/2721:25:05INFOMaster:Registeredsignal handlersfor

[TERM,HUP,INT]

15/10/2721:25:05INFOSecurityManager:Changingview acls to:root

15/10/2721:25:05INFOSecurityManager:Changingmodify acls to:root

15/10/2721:25:05INFOSecurityManager:SecurityManager:authentication

disabled;ui acls disabled;userswithview permissions:Set(root);userswith

modify permissions:Set(root)

15/10/2721:25:06INFOSlf4jLogger:Slf4jLoggerstarted

15/10/2721:25:06INFORemoting:Startingremoting

15/10/2721:25:06INFORemoting:Remotingstarted;listening on addresses:[akka.tcp://sparkMaster@spark-master:7077]

15/10/2721:25:06INFOUtils:Successfullystarted service'sparkMaster'on port

7077.

15/10/2721:25:07INFOMaster:StartingSparkmaster at spark://spark-master:

7077

15/10/2721:25:07INFOMaster:RunningSparkversion1.5.1

15/10/2721:25:07INFOUtils:Successfullystarted service'MasterUI'on

port8080.

15/10/2721:25:07INFOMasterWebUI:StartedMasterWebUIat http://

spark-master:8080

15/10/2721:25:07INFOUtils:Successfullystarted service on port6066.

15/10/2721:25:07INFOStandaloneRestServer:StartedREST serverfor

submitting applications on port6066

15/10/2721:25:07INFOMaster:I have been elected leader!Newstate:ALIVE}}}

确认master正常运行后,你可以使用k8s集群代理访问Spark WebUI:

kubectl proxy--port=8001

此时可以通过http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-webui/访问UI

第三步:启动 Spark workers

Spark workers 在 Spark 集群中扮演十分重要的角色。他们为程序提供执行资源和数据缓存功能。

Spark workers 需要 Master service处于运行状态。

使用examples/spark/spark-worker-controller.yaml 文件创建一个replication controller来管理 worker pods 。

$ kubectl create-f examples/spark/spark-worker-controller.yaml

replicationcontroller"spark-worker-controller"created

查看 workers 是否正常运行

如果你启动Spark WebUI,当worker就绪后应该出现在UI 中。(这可能需要一些时间来拉取镜像并启动pods。)你也可以用以下方式查询状态:

$ kubectlgetpods

NAME                            READY    STATUS    RESTARTS  AGE

spark-master-controller-5u0q51/1Running025m

spark-worker-controller-e8otp1/1Running06m

spark-worker-controller-fiivl1/1Running06m

spark-worker-controller-ytc7o1/1Running06m

$ kubectl logs spark-master-controller-5u0q5

[...]

15/10/2618:20:14INFOMaster:Registeringworker10.244.1.13:53567

with2cores,6.3GB RAM

15/10/2618:20:14INFOMaster:Registeringworker10.244.2.7:46195

with2cores,6.3GB RAM

15/10/2618:20:14INFOMaster:Registeringworker10.244.3.8:39926

with2cores,6.3GB RAM

假如上一节中kubectl proxy仍在运行,你应该也能在UI中看到workers。注:UI 将含有到 worker Web UI的超链接。 这些链接是不能正常工作的(链接将尝试连接到集群IP,而Kubernetes不会自动代理的集群IP)。

第四步:在 Spark 集群中启动 Zeppelin UI来加载工作任务

Zeppelin UI pod可以用来在Spark集群加载jobs,加载操作既可以通过web端的笔记本完成,也可以通过传统的Spark命令行方式完成。更多细节见 Zeppelin和 Spark architecture架构。

$ kubectl create-f examples/spark/zeppelin-controller.yaml

replicationcontroller"zeppelin-controller"created

Zeppelin 需要 Master service处于运行状态。

查看 Zeppelin 是否正常运行

$ kubectlgetpods-l component=zeppelin

NAME                        READY    STATUS    RESTARTS  AGE

zeppelin-controller-ja09s1/1Running053s

第五步:操作集群

现在你有两个选择:可以通过图形界面访问Spark 集群,也可以保持使用CLI。

快速使用pyspark

使用 kubectl exec连接到Zeppelin 驱动并运行pipeline。

使用 kubectl exec连接到Zeppelin 驱动并运行pipeline。

$ kubectlexeczeppelin-controller-ja09s-it pyspark

Python2.7.9(default,Mar12015,12:57:24)

[GCC4.9.2]on linux2

Type"help","copyright","credits"or"license"formore

information.

Welcometo

____              __

/__/__  ___ _____//__

_\ \/ _ \/ _`/ __/  '_/

/__ / .__/\_,_/_/ /_/\_\  version 1.5.1

/_/

Using Python version 2.7.9 (default, Mar  1 2015 12:57:24)

SparkContext available as sc, HiveContext available as sqlContext.

>>> sc.textFile("gs://dataflow-samples/shakespeare/*").map

(lambda s: len(s.split())).sum()

939193

恭喜你,你把所有莎士比亚戏剧中的单词个数统计出来了。

使用图形界面,亮瞎你的眼!

使用之前创建的Zeppelin pod,设置WebUI的转发端口:

$ kubectl port-forward zeppelin-controller-ja09s8080:8080

这条指令将访问localhost 8080端口的请求转发到容器中的8080端口。然后你可以通过https://localhost:8080/访问Zeppelin。

创建一个“New Notebook”。在其中输入:

%pyspark

printsc.textFile("gs://dataflow-samples/shakespeare/*").map

(lambdas:len(s.split())).sum()

结论

现在你已为Spark master,Spark workers 和 Spark driver创建了service和replication controller。你可以用这个例子来进行下一步,并开始使用刚才创建的Apache Spark集群,更多信息见Spark 文档。

tl;dr

kubectl create-f examples/spark

设置后:

kubectlgetpods# Make sure everything is running

kubectl proxy--port=8001# Start an application proxy, if you want

to see theSparkMasterWebUI

kubectlgetpods-lcomponent=zeppelin# Get the driver pod to interact

with.

此时Master UI 可以通过http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-webui/访问。

你可以通过kubectl exec使用传统的spark-shell / spark-subsubmit / pyspark 命令行与Spark 集群进行交互,或者如果你想与Zeppelin交互:

kubectl port-forward zeppelin-controller-abc1238080:8080&

kubectl port-forward zeppelin-controller-abc1238080:8080&

然后访问http://localhost:8080/

使用Spark 的已知问题

● 该方案提供了一个仅限于集群网络的Spark 配置,这意味着Spark master 只能通过集群service访问。如果你需要在 zeppelin pod 中使用除了Zeppelin 或spark-submit 之外的外部客户端来提交 jobs ,你需要为客户端提供一种访问examples/spark/spark-master-service.yaml 的方式。参见service以了解更多信息。

使用 Zeppelin 的已知问题

● Zeppelin pod 很大,因此拉取镜像可能会消耗一段时间,拉取速度取决于你的网络条件。Zeppelin pod 的尺寸是我们正要解决的问题,详见问题# 17231。

● 第一次运行Zeppelin 时, pipeline可能会花费很多时间(约一分钟)。似乎需要相当多的时间来加载。

● 在GKE环境中, kubectl port-forward 不可能长时间保持稳定状态。如果你发现Zeppelin变成断开状态,port-forward很可能出现故障,并需要重启。详见# 12179。

本文由时速云翻译,如若转载,需注明转载自“时速云”

原文链接:

https://github.com/kubernetes/kubernetes/blob/release-1.3/examples/spark/README.md

你可能感兴趣的:(搭建Spark集群?没想到你是这样的k8s)