Spark

Kubernetes 从 v1.8 开始支持 原生的 Apache Spark 应用(需要 Spark 支持 Kubernetes,比如 v2.3),可以通过 spark-submit 命令直接提交 Kubernetes 任务。比如计算圆周率

bin/spark-submit \
  --deploy-mode cluster \
  --class org.apache.spark.examples.SparkPi \
  --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
  --kubernetes-namespace default \
  --conf spark.executor.instances=5 \
  --conf spark.app.name=spark-pi \
  --conf spark.kubernetes.driver.docker.image=kubespark/spark-driver:v2.2.0-kubernetes-0.4.0 \
  --conf spark.kubernetes.executor.docker.image=kubespark/spark-executor:v2.2.0-kubernetes-0.4.0 \
  local:///opt/spark/examples/jars/spark-examples_2.11-2.2.0-k8s-0.4.0.jar

或者使用 Python 版本

Spark on Kubernetes 部署

Kubernetes 示例 github 上提供了一个详细的 spark 部署方法,由于步骤复杂,这里简化一些部分让大家安装的时候不用去多设定一些东西。

部署条件

  • 一个 kubernetes 群集, 可参考 集群部署

  • kube-dns 正常运作

创建一个命名空间

namespace-spark-cluster.yaml

这边原文提到需要将 kubectl 的执行环境转到 spark-cluster, 这边为了方便我们不这样做, 而是将之后的佈署命名空间都加入 spark-cluster

部署 Master Service

建立一个 replication controller, 来运行 Spark Master 服务

创建 master 服务

spark-master-service.yaml

检查 Master 是否正常运行

若 master 已经被建立与运行, 我们可以透过 Spark 开发的 webUI 来察看我们 spark 的群集状况, 我们将佈署 specialized proxy

spark-ui-proxy-controller.yaml

提供一个 service 做存取, 这边原文是使用 LoadBalancer type, 这边我们改成 NodePort, 如果你的 kubernetes 运行环境是在 cloud provider, 也可以参考原文作法

spark-ui-proxy-service.yaml

部署完后你可以利用 kubecrl proxy 来察看你的 Spark 群集状态

可以透过 http://localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-master:8080/ 察看, 若 kubectl 中断就无法这样观察了, 但我们再先前有设定 nodeport 所以也可以透过任意台 node 的端口 30080 去察看(例如 http://10.201.2.34:30080)。

部署 Spark workers

要先确定 Matser 是再运行的状态

spark-worker-controller.yaml

透过指令察看运行状况

也可以透过上面建立的 WebUI 服务去察看

基本上到这边 Spark 的群集已经建立完成了

创建 Zeppelin UI

我们可以利用 Zeppelin UI 经由 web notebook 直接去执行我们的任务, 详情可以看 Zeppelin UISpark architecture

zeppelin-controller.yaml

然后一样佈署 Service

zeppelin-service.yaml

可以看到我们把 NodePort 设再 30081, 一样可以透过任意台 node 的 30081 port 访问 zeppelin UI。

通过命令行访问 pyspark(记得把 pod 名字换成你自己的):

接着就能使用 Spark 的服务了, 如有错误欢迎更正。

zeppelin 常见问题

  • zeppelin 的镜像非常大, 所以再 pull 时会花上一些时间, 而 size 大小的问题现在也正在解决中, 详情可参考 issue #17231

  • 在 GKE 的平台上, kubectl post-forward 可能有些不稳定, 如果你看现 zeppelin 的状态为 Disconnected,port-forward 可能已经失败你需要去重新启动它, 详情可参考 #12179

参考文档

最后更新于