在Kubernetes上使用Persistent Volume的Spark方法
Kubernetes中有一个名为持久卷(PV)的数据存储区域,可以附加到Pod并进行使用。
通过PV,即使删除Pod也可以保留数据,还可以作为多个Pod之间的共享存储使用。
Apache Spark从2.3版本开始支持Kubernetes的原生支持,但截至目前为止(2018年9月11日),Spark2.3的当前版本尚不支持附加到持久卷。
幸运的是,据称下一个版本的Spark2.4将支持使用持久卷,因此我打算提前尝试在Kubernetes上使用Spark并尝试使用持久卷。
前提条件和环境
-
- Kubernetes実行環境 : Azure Kubernetes Service(AKS)
-
- 一口にPVといっても、いろんな種類がありますが、AKSでクラスタを作成すると、次の2つのAzure Diskのストレージが自動で作成されるので、今回は”default”に対してアタッチを試みます。
default : HDD ※今回はこちらを利用する
managed-premium : SSD
准备Spark2.4。
从GitHub上克隆2.4版本的源代码。
git clone -b branch-2.4 https://github.com/apache/spark.git
使用SBT(Scala构建工具)进行构建。
应该也可以使用mvn等。
build/sbt -Pkubernetes -DskipTests clean package
使用Spark 2.4构建并推送Spark容器。
由于与Spark 2.3相同,具体方法略过。
创建 PVC(持久卷索取)。
我們將創建 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的命令选项有以下三个:
# 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 \
4. 文科参考
-
- https://github.com/apache/spark/blob/master/docs/running-on-kubernetes.md#using-kubernetes-volumes
- https://docs.microsoft.com/ja-jp/azure/aks/azure-disks-dynamic-pv