在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
广告
将在 10 秒后关闭
bannerAds