Spark: Pi 샘플이 클러스터 k8s 모드에서 SocketTimeoutException을 발생시킵니다.

Spark: Pi 샘플이 클러스터 k8s 모드에서 SocketTimeoutException을 발생시킵니다.

kubernetes에 Spark 2.3.1 클러스터를 설정했지만 여기에 샘플 SparkPi 작업을 보내는 데 문제가 있습니다.

내가 사용하는 제출 스크립트는 다음과 같습니다.

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

하지만 얻을

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)
...

내 생각엔 k8s apiserver에 액세스할 수 없는 것 같습니다. 하지만 왜 그런지 이해가 안 돼요. 제가 사용하고 있는 --conf serviceAccountNameRBAC는 위 URL과 같이 완전히 구성되어 있습니다.

모든 Spark Pod는 spark다음과 같이 정의된 serviceAccountName을 사용합니다.

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

관련 정보