メモ
このメモは、Spark3.2.0をKubernetes上で動かすことを簡単に紹介するものである。 なお、日本語での説明としては、 Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料) がとても分かりやすいので参考になる。
基本的な流れ
公式の Running Spark on Kubernetes の通りでよい。
ビルド
まずは、パッケージに含まれているDockerfileを利用して、Dockerイメージを自分でビルドする。
今回はMinikube環境で動かしているので -m
オプションを利用した。
簡易的な例
1 | /opt/spark/default/bin/docker-image-tool.sh -m -t testing build |
Minikube内のDockerでイメージ一覧を確認すると以下の通り。
1 | eval $(minikube -p minikube docker-env) |
実行
サービスアカウントを作る。
1 | minikube kubectl -- create serviceaccount spark |
実行は以下の通り。先ほど作ったサービスアカウントを使用するようにする。
1 | /opt/spark/default/bin/spark-submit --master k8s://https://192.168.49.2:8443 --deploy-mode cluster --name pi --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=2 --conf spark.kubernetes.container.image=spark:testing --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark local:///opt/spark/examples/jars/spark-examples_2.12-3.2.0.jar |
なお、今回はMinikube上で実行しており、Jarファイルとして指定するのはMinikube内で起動したドライバのコンテナ内のローカルファイルシステムパスである。試しに、当該近店をアタッチして起動するとわかる。
ドライバのログを確認する。
1 | minikube kubectl -- logs pi-43bff77e450bdba3-driver |
pi計算の結果がログに出力されているのがわかる。
(補足)ビルドされたイメージを起動して内容確認
以下は、MinikubeのDockerを利用しビルドしたイメージのコンテナを起動して、シェルをアタッチした例。
1 | eval $(minikube -p minikube docker-env) |
(補足)Minikube使う場合のリソース設定についての注意事項
Prerequisites の通り、Minikube等を使うようであれば、リソースに対して注意がある。 以下、Minikube立ち上げ例。
1 | minikube start --memory='4g' --cpus=3 |
(補足)Kubernetes環境
動作確認のためには、Kubernetes環境が必要である。
minikube start あたりを参考に環境構築しておくこと。
(補足)ボリュームのマウントについて
volume-mounts の通り、DriverやExecutorのPodにボリュームをマウントできるのだが、 HostPathに関するリスクがあるようだ。 KubernetesのhostPathについて を参照。
(補足)上記例ではサービスアカウントを作成しているが・・・
もし default
サービスアカウントを利用すると以下に記載されたのと同様のエラーを生じる。
How to fix "Forbidden!Configured service account doesn't have access" with Spark on Kubernetes?
そこで、あらかじめサービスアカウントを作成して使うようにした。