うさぎ好きエンジニアの備忘録

うさぎたちに日々癒されているエンジニアが業務で直面したもの & 個人的な学習メモを残していきます。

Spark on Kubernetes をやってみる

Kubernetes上にSparkをデプロイして、PI計算してみたときの個人用メモです。

環境変数のセット

$ cat << EOF > spark-k8s-env
K8S_CONTEXT=\$(kubectl config view -o jsonpath='{.current-context}')
K8S_NAMESPACE=\$(kubectl config view -o jsonpath='{.contexts[?(@.name=="'\$K8S_CONTEXT'")].context.namespace}')
K8S_CLUSTER=\$(kubectl config view -o jsonpath='{.contexts[?(@.name=="'\$K8S_CONTEXT'")].context.cluster}')
K8S_SERVER=\$(kubectl config view -o jsonpath='{.clusters[?(@.name=="'\$K8S_CLUSTER'")].cluster.server}')
EOF

$ source spark-k8s-env

セットできていればこんな感じで表示されるはず。

$ set | grep -a K8S
K8S_CLUSTER=kubernetes
K8S_CONTEXT=kubernetes-admin@kubernetes
K8S_NAMESPACE=kazono
K8S_SERVER=https://<master ip address>:<port>

サービスアカウントの作成

以下のコマンドでサービスアカウントを作成。

$ kubectl create serviceaccount spark
serviceaccount/spark created

$ kubectl get serviceaccount
NAME      SECRETS   AGE
default   1         148d
spark     1         17s

$ kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=kazono:spark --namespace=kazono
clusterrolebinding.rbac.authorization.k8s.io/spark-role created

Sparkのダウンロードと展開

Spark関連のファイルをダウンロード & 展開して、ディレクトリを移動。

$ curl -O http://ftp.riken.jp/net/apache/spark/spark-3.0.0-preview2/spark-3.0.0-preview2-bin-hadoop3.2.tgz
$ tar zxpf spark-3.0.0-preview2-bin-hadoop3.2.tgz
$ cd spark-3.0.0-preview2-bin-hadoop3.2

Dockerイメージのbuild & Docker Hubへのpush

以下のコマンドを実行してSparkのDockerイメージをビルド。

$ sudo bin/docker-image-tool.sh -r kazono -t v3.0.0-preview2 build

ビルドが成功したらimageがちゃんとあるか確認。

$ sudo docker images
REPOSITORY                                                             TAG                 IMAGE ID            CREATED             SIZE
kazono/spark                                                           v3.0.0-preview2     a20573e80655        40 seconds ago      609 MB

Docker Hubに以下のコマンドでログイン。

$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: kazono
Password:
Login Succeeded

以下のコマンドでDocker Hubにビルドしたイメージをpush。

$ sudo bin/docker-image-tool.sh -r kazono -t v3.0.0-preview2 push

f:id:ponteru:20200209163743p:plain

デプロイしてみる

以下のコマンドでデプロイ。

$ ./bin/spark-submit \
    --master k8s://$K8S_SERVER \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.kubernetes.namespace=$K8S_NAMESPACE \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
    --conf spark.kubernetes.container.image=kazono/spark:v3.0.0-preview2 \
    --conf spark.kubernetes.file.upload.path=file:///var/empty \
    --conf spark.kubernetes.driver.limit.cores=1 \
    --conf spark.kubernetes.executor.limit.cores=1 \
    --conf spark.executor.instances=10 \
    local:///opt/spark/examples/jars/spark-examples_2.12-3.0.0-preview2.jar \
    10000

正常に完了すると以下のような出力が得られるはず。

  container name: spark-kubernetes-driver
     container image: docker.io/kazono/spark:v3.0.0-preview2
     container state: terminated
     container started at: 2020-02-01T11:09:55Z
     container finished at: 2020-02-01T11:10:04Z
     exit code: 0
     termination reason: Completed

podと実行結果を確認。

$ kubectl get pods
NAME                               READY   STATUS      RESTARTS   AGE
spark-pi-3118a27000715556-driver   0/1     Completed   0          64s

$ kubectl logs spark-pi-3118a27000715556-driver | grep "Pi is roughly"
Pi is roughly 3.1474557372786864

SparkのWeb UIも見てみる

実行中に以下のコマンドを実行することで、ローカルホストからport-forwardingできる。

$ kubectl port-forward $(kubectl get pods --field-selector=status.phase=Running | grep spark-pi | grep driver | awk '{print $1}') 4040:4040

http://localhost:4040にアクセスすることでWeb UIを確認することができるはず (実行終わったらアクセスできなくなる)。