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

Tenxcloud · · 1366 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

在本文的例子中,你将使用 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中查看。 ## 第一步:创建命名空间 ```go $ kubectl create -f examples/spark/namespace-spark-cluster.yaml ``` 现在列出所有命名空间: ```go $ kubectl get namespaces NAME LABELS STATUS default <none> Active spark-cluster name=spark-cluster Active ``` 对于kubectl 客户端使用的命名空间,我们定义一个环境并使用它: ```go $ kubectl config set-context spark --namespace=spark-cluster --cluster=${CLUSTER_NAME} --user=${USER_NAME} $ kubectl config use-context spark ``` 你可以在Kubernetes配置文件~/.kube/config中查看集群名称以及用户名称。 ## 第二步:启动你的master服务 Master service 是 Spark集群的master服务。 使用 examples/spark/spark-master-controller.yaml 文件来创建一个replication controller 运行Spark Master服务。 ```go $ kubectl create -f examples/spark/spark-master-controller.yaml replicationcontroller "spark-master-controller" created ``` 然后,用examples/spark/spark-master-service.yaml 文件来创建一个逻辑上的服务端点,Spark workers可以使用该服务来访问Master pod ```go $ kubectl create -f examples/spark/spark-master-service.yaml service "spark-master" created ``` 然后你可以为Spark Master WebUI 创建一个服务: ```go $ kubectl create -f examples/spark/spark-webui.yaml service "spark-webui" created ``` 查看 Master 是否能运行和可访问 ```go $ kubectl get podsNAME READY STATUS RESTARTS AGEspark-master-controller-5u0q5 1/1 Running 0 8m ``` 检查日志以查看master的状态。(使用上一条指令输出的pod名称) ```go {{{$ 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 Spark Command: /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 -Xmx1g org.apache.spark.deploy.master.Master --ip spark-master --port 7077 - --webui-port 8080 ======================================== 15/10/27 21:25:05 INFO Master: Registered signal handlers for [TERM, HUP, INT] 15/10/27 21:25:05 INFO SecurityManager: Changing view acls to: root 15/10/27 21:25:05 INFO SecurityManager: Changing modify acls to: root 15/10/27 21:25:05 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root) 15/10/27 21:25:06 INFO Slf4jLogger: Slf4jLogger started 15/10/27 21:25:06 INFO Remoting: Starting remoting 15/10/27 21:25:06 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkMaster@spark-master:7077] 15/10/27 21:25:06 INFO Utils: Successfully started service 'sparkMaster' on port 7077. 15/10/27 21:25:07 INFO Master: Starting Spark master at spark://spark-master: 7077 15/10/27 21:25:07 INFO Master: Running Spark version 1.5.1 15/10/27 21:25:07 INFO Utils: Successfully started service 'MasterUI' on port 8080. 15/10/27 21:25:07 INFO MasterWebUI: Started MasterWebUI at http:// spark-master:8080 15/10/27 21:25:07 INFO Utils: Successfully started service on port 6066. 15/10/27 21:25:07 INFO StandaloneRestServer: Started REST server for submitting applications on port 6066 15/10/27 21:25:07 INFO Master: I have been elected leader! New state: ALIVE}}} ``` 确认master正常运行后,你可以使用k8s集群代理访问Spark WebUI: ```go 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 。 ```go $ kubectl create -f examples/spark/spark-worker-controller.yaml replicationcontroller "spark-worker-controller" created ``` 查看 workers 是否正常运行 如果你启动Spark WebUI,当worker就绪后应该出现在UI 中。(这可能需要一些时间来拉取镜像并启动pods。)你也可以用以下方式查询状态: ```go $ kubectl get pods NAME READY STATUS RESTARTS AGE spark-master-controller-5u0q5 1/1 Running 0 25m spark-worker-controller-e8otp 1/1 Running 0 6m spark-worker-controller-fiivl 1/1 Running 0 6m spark-worker-controller-ytc7o 1/1 Running 0 6m $ kubectl logs spark-master-controller-5u0q5 [...] 15/10/26 18:20:14 INFO Master: Registering worker 10.244.1.13:53567 with 2 cores, 6.3 GB RAM 15/10/26 18:20:14 INFO Master: Registering worker 10.244.2.7:46195 with 2 cores, 6.3 GB RAM 15/10/26 18:20:14 INFO Master: Registering worker 10.244.3.8:39926 with 2 cores, 6.3 GB 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架构。 ```go $ kubectl create -f examples/spark/zeppelin-controller.yaml replicationcontroller "zeppelin-controller" created ``` Zeppelin 需要 Master service处于运行状态。 查看 Zeppelin 是否正常运行 ```go $ kubectl get pods -l component=zeppelin NAME READY STATUS RESTARTS AGE zeppelin-controller-ja09s 1/1 Running 0 53s ``` ## 第五步:操作集群 现在你有两个选择:可以通过图形界面访问Spark 集群,也可以保持使用CLI。 **快速使用pyspark** 使用 kubectl exec连接到Zeppelin 驱动并运行pipeline。 使用 kubectl exec连接到Zeppelin 驱动并运行pipeline。 ```go $ kubectl exec zeppelin-controller-ja09s -it pyspark Python 2.7.9 (default, Mar 1 2015, 12:57:24) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /__ / .__/\_,_/_/ /_/\_\ 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的转发端口: ```go $ kubectl port-forward zeppelin-controller-ja09s 8080:8080 ``` 这条指令将访问localhost 8080端口的请求转发到容器中的8080端口。然后你可以通过https://localhost:8080/ 访问Zeppelin。 创建一个“New Notebook”。在其中输入: ```go %pyspark print sc.textFile("gs://dataflow-samples/shakespeare/*").map (lambda s: len(s.split())).sum() ``` **结论** 现在你已为Spark master,Spark workers 和 Spark driver创建了service和replication controller。你可以用这个例子来进行下一步,并开始使用刚才创建的Apache Spark集群,更多信息见Spark 文档。 ** tl;dr** ```go kubectl create -f examples/spark ``` 设置后: ```go kubectl get pods # Make sure everything is running kubectl proxy --port=8001 # Start an application proxy, if you want to see the Spark Master WebUI kubectl get pods -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交互: ```go kubectl port-forward zeppelin-controller-abc123 8080:8080 & kubectl port-forward zeppelin-controller-abc123 8080: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。 本文由[时速云][1]翻译,如若转载,需注明转载自“[时速云][1]” 原文链接: https://github.com/kubernetes/kubernetes/blob/release-1.3/examples/spark/README.md [1]:https://www.tenxcloud.com/

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1366 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传