Configurei um cluster Spark 2.3.1 no kubernetes, no entanto, tenho problemas para enviar um trabalho de amostra do SparkPi para ele:
O script de envio que estou usando:
bin/spark-submit \
--master k8s://https://10.0.15.7:7077 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.kubernetes.container.image=gcr.io/my-project/spark:spark-test \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.executor.instances=3 \
local:///opt/spark/examples/jars/spark-examples_2.11-2.3.1.jar 1000
mas pegue
Exception in thread "main" io.fabric8.kubernetes.client.KubernetesClientException: Failed to start websocket
at io.fabric8.kubernetes.client.dsl.internal.WatchConnectionManager$2.onFailure(WatchConnectionManager.java:194)
...
Caused by: java.net.SocketTimeoutException: timeout
at okio.Okio$4.newTimeoutException(Okio.java:230)
...
Caused by: java.net.SocketException: Socket closed
at java.net.SocketInputStream.read(SocketInputStream.java:204)
...
Meu palpite é que ele não pode acessar o apiserver k8s. Mas não entendo por quê. Eu uso --conf serviceAccountName
e o RBAC está totalmente configurado como na url acima.
Todos os pods Spark usam o spark
serviceAccountName, definido como
apiVersion: v1
kind: ServiceAccount
metadata:
name: spark
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: spark-role
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: edit
subjects:
- kind: ServiceAccount
name: spark
namespace: default