失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Spark On K8S(Standalone模式部署)

Spark On K8S(Standalone模式部署)

时间:2019-07-05 01:24:01

相关推荐

Spark On K8S(Standalone模式部署)

Spark on K8S 的几种模式

Standalone:在 K8S 启动一个长期运行的集群,所有 Job 都通过 spark-submit 向这个集群提交

Kubernetes Native:通过 spark-submit 直接向 K8S 的 API Server 提交,申请到资源后启动 Pod 做为 Driver 和 Executor 执行 Job,参考 /docs/2.4.6/running-on-kubernetes.html

Spark Operator:安装 Spark Operator,然后定义 spark-app.yaml,再执行 kubectl apply -f spark-app.yaml,这种申明式 API 和调用方式是 K8S 的典型应用方式,参考 /GoogleCloudPlatform/spark-on-k8s-operator

Download Spark

/dist/spark/

Spark 和 Hadoop 关系比较紧密,可以下载带 Hadoop 的版本,这样会有 Hadoop 的 jar 包可以用,不然可能会出现找不到包和类的错误,哪怕其实没用到 Hadoop

Build Spark Image

Spark 2.3 开始提供 bin/docker-image-tool.sh 工具用于 build image

sudo ./bin/docker-image-tool.sh -t my_spark_2.4_hadoop_2.7 build

遇到类似下面的错误

WARNING: Ignoring http://dl-/alpine/v3.9/main/x86_64/APKINDEX.tar.gz: temporary error (try again later)WARNING: Ignoring http://dl-/alpine/v3.9/community/x86_64/APKINDEX.tar.gz: temporary error (try again later)ERROR: unsatisfiable constraints:bash (missing):required by: world[bash]

这是网络问题,可以修改 ./bin/docker-image-tool.sh,在里面的 docker build 命令加上 --network=host 使容器使用宿主机网络 (要确保宿主机网络是 OK 的)

启动集群

定义 manifest

---apiVersion: v1kind: Servicemetadata:name: spark-managerspec:type: ClusterIPports:- name: rpcport: 7077- name: uiport: 8080selector:app: sparkcomponent: sparkmanager---apiVersion: v1kind: Servicemetadata:name: spark-manager-restspec:type: NodePortports:- name: restport: 8080targetPort: 8080selector:app: sparkcomponent: sparkmanager---apiVersion: apps/v1kind: Deploymentmetadata:name: spark-managerspec:replicas: 1selector:matchLabels:app: sparkcomponent: sparkmanagertemplate:metadata:labels:app: sparkcomponent: sparkmanagerspec:containers:- name: sparkmanagerimage: spark:my_spark_2.4_hadoop_2.7workingDir: /opt/sparkcommand: ["/bin/bash", "-c", "/opt/spark/sbin/start-master.sh && while true;do echo hello;sleep 6000;done"]ports:- containerPort: 7077name: rpc- containerPort: 8080name: uilivenessProbe:tcpSocket:port: 7077initialDelaySeconds: 30periodSeconds: 60---apiVersion: apps/v1kind: Deploymentmetadata:name: spark-workerspec:replicas: 2selector:matchLabels:app: sparkcomponent: workertemplate:metadata:labels:app: sparkcomponent: workerspec:containers:- name: sparkworkerimage: spark:my_spark_2.4_hadoop_2.7workingDir: /opt/sparkcommand: ["/bin/bash", "-c", "/opt/spark/sbin/start-slave.sh spark://spark-manager:7077 && while true;do echo hello;sleep 6000;done"]

启动

sudo kubectl create -f standalone.yaml

查看 pod 状态

spark-manager-cfc7f9fb-679tc1/1Running016sspark-worker-6f55fddc87-sgnfh1/1Running016sspark-worker-6f55fddc87-w5zgm1/1Running016s

查看 service

spark-managerClusterIP 10.108.230.84 <none> 7077/TCP,8080/TCP 6m16sspark-manager-restNodePort 10.106.200.126 <none> 8080:30277/TCP6m16s

查看 rest service 信息

lin@lin-VirtualBox:~$ sudo kubectl get svc spark-manager-restNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGEspark-manager-rest NodePort 10.106.200.126 <none> 8080:30277/TCP 7m59s

登陆 10.106.200.126:8080 就可以看到 Spark Manager 的 Web UI,可以看到 worker 信息,和 Job 信息

如果要看更详细的 Job 信息还需要启动 spark history server

提交 Job

登陆其中一台 worker

sudo kubectl exec -t -i spark-worker-6f55fddc87-w5zgm /bin/bash

提交 Job

# 第二个 wordcount.py 作为参数用bin/spark-submit \--master spark://spark-manager:7077 \--num-executors 2 \--name spark-test \/opt/spark/examples/src/main/python/wordcount.py \/opt/spark/examples/src/main/python/wordcount.py

注意在 standalone 模式下的 Python 不支持 cluster 模式,即 driver 必然运行在执行 spark-submit 的容器上

Log

Driver 的 log 随 spark-submit 命令打出来

Executor 的 log 分布在每个 Worker 的 work 目录下

/opt/spark/work/app-2027062422-0002/0/stderr

app-2027062422-0002 是 Job 的 Id,可以在 Web UI 上看到,也可以在 Driver 的 log 看到

如果觉得《Spark On K8S(Standalone模式部署)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。