Spark on Kubernetes をやってみる
Kubernetes上にSparkをデプロイして、PI計算してみたときの個人用メモです。
- 環境変数のセット
- サービスアカウントの作成
- Sparkのダウンロードと展開
- Dockerイメージのbuild & Docker Hubへのpush
- デプロイしてみる
- SparkのWeb UIも見てみる
環境変数のセット
$ 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
デプロイしてみる
以下のコマンドでデプロイ。
$ ./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を確認することができるはず (実行終わったらアクセスできなくなる)。