Kubernetesには、Podにアタッチして利用できるPersistent Volume(PV)というデータ領域があります。
PVによってPod削除後もデータを残すことが可能となり、また複数のPod間の共有ストレージとしても利用できます。
Apache Sparkはバージョン2.3からKubernetesネイティブサポートを開始しているものの、現バージョン(2018/09/11時点)のSpark2.3ではPersistent Volumeへのアタッチに対応していないのが現状です。
幸運なことに、次期バージョンのSpark2.4からはPersistent Volumeが利用できるようになるとのことですので、今回先取りしてSpark on KubernetesでPersistent Volumeを使ってみようかと思います。
0. 前提とか環境とか
- Kubernetes実行環境 : Azure Kubernetes Service(AKS)
- 一口にPVといっても、いろんな種類がありますが、AKSでクラスタを作成すると、次の2つのAzure Diskのストレージが自動で作成されるので、今回は"default"に対してアタッチを試みます。
- default : HDD ※今回はこちらを利用する
- managed-premium : SSD
1. Spark2.4の準備
GitHubから2.4のソースをクローン。
git clone -b branch-2.4 https://github.com/apache/spark.git
SBT(Scala Build Tool)を利用してビルドを実施。
mvnとかでも大丈夫なはず。
build/sbt -Pkubernetes -DskipTests clean package
Spark2.4を利用しSparkコンテナをビルドしてプッシュ。
Spark2.3と同じなので具体的方法は割愛します。
2. PVC(Persistent Volume Claim)の作成
PVC定義(どのストレージをどの程度利用するか)を作成します。
yaml形式で次のように書きます。
ここではPVC名「azure-managed-disk」で5Gの領域確保を行います。
azure-default.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: default
resources:
requests:
storage: 5Gi
下記コマンドでAKS上にPVC作成。
kubectl create -f azure-default.yaml
Storage Classを使用したPVCを作成し問題なければ、PVCの内容に基づいて作成されたPVを確認できるようになります。次のコマンドで確認できます。
kubectl get pv
3. Spark-Submit実行
spark-submit時にコマンドオプションを指定することで、Spark Podと先程作成したPVをアタッチすることができます。
./bin/spark-submit \
--master k8s://http://127.0.0.1:8001 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=1 \
--conf spark.kubernetes.container.image=$REGISTRY_NAME/spark:$REGISTRY_TAG \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.mount.path=/mnt/azure \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.mount.readOnly=false \
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.options.claimName=azure-managed-disk \
local:///opt/spark/work-dir/SparkPi.jar
PVをアタッチするために利用したコマンドオプションは次の3つです。
# pod内のどのパスにマウントするか?(ここでは"/mnt/azure"にマウントしました)
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.mount.path=/mnt/azure \
# 読み取り専用か?(ここでは読み書き両方可能)
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.mount.readOnly=false \
# どのPVCを利用するか?(ここでは先に作成したPVC"azure-managed-disk"を利用)
--conf spark.kubernetes.driver.volumes.persistentVolumeClaim.volume.options.claimName=azure-managed-disk \