This is an automated email from the ASF dual-hosted git repository.
chenxingchun pushed a commit to branch 1.3.6-prepare
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git
The following commit(s) were added to refs/heads/1.3.6-prepare by this push:
new 964505e [1.3.6-prepare][Feature-5100][K8s] Support task scalability
on K8s such as Spark, Flink and DataX
new 0de8ab3 Merge pull request #5101 from
chengshiwen/1.3.6-prepare-support-k8s-task-scalability
964505e is described below
commit 964505ed726617a791982b6b966afa4bf8a6a0a4
Author: chengshiwen <[email protected]>
AuthorDate: Thu Mar 18 23:19:02 2021 +0800
[1.3.6-prepare][Feature-5100][K8s] Support task scalability on K8s such as
Spark, Flink and DataX
---
docker/docker-swarm/docker-compose.yml | 5 +++
docker/docker-swarm/docker-stack.yml | 2 +
docker/kubernetes/dolphinscheduler/README.md | 49 ++++++++++++----------
.../templates/pvc-dolphinscheduler-shared.yaml | 37 ++++++++++++++++
.../statefulset-dolphinscheduler-master.yaml | 19 +++++++++
.../statefulset-dolphinscheduler-worker.yaml | 9 ++++
docker/kubernetes/dolphinscheduler/values.yaml | 9 ++++
7 files changed, 108 insertions(+), 22 deletions(-)
diff --git a/docker/docker-swarm/docker-compose.yml
b/docker/docker-swarm/docker-compose.yml
index 86638ca..b2c1e0d 100644
--- a/docker/docker-swarm/docker-compose.yml
+++ b/docker/docker-swarm/docker-compose.yml
@@ -154,6 +154,8 @@ services:
DATABASE_DATABASE: dolphinscheduler
DATABASE_PARAMS: characterEncoding=utf8
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
+ HADOOP_HOME: "/opt/soft/hadoop"
+ HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop"
healthcheck:
test: ["CMD", "/root/checkpoint.sh", "MasterServer"]
interval: 30s
@@ -164,6 +166,7 @@ services:
- dolphinscheduler-zookeeper
volumes:
- dolphinscheduler-logs:/opt/dolphinscheduler/logs
+ - dolphinscheduler-shared-local:/opt/soft
restart: unless-stopped
networks:
- dolphinscheduler
@@ -226,6 +229,7 @@ services:
volumes:
- dolphinscheduler-worker-data:/tmp/dolphinscheduler
- dolphinscheduler-logs:/opt/dolphinscheduler/logs
+ - dolphinscheduler-shared-local:/opt/soft
- dolphinscheduler-resource-local:/dolphinscheduler
restart: unless-stopped
networks:
@@ -241,4 +245,5 @@ volumes:
dolphinscheduler-zookeeper:
dolphinscheduler-worker-data:
dolphinscheduler-logs:
+ dolphinscheduler-shared-local:
dolphinscheduler-resource-local:
\ No newline at end of file
diff --git a/docker/docker-swarm/docker-stack.yml
b/docker/docker-swarm/docker-stack.yml
index a17920e..5490fdc 100644
--- a/docker/docker-swarm/docker-stack.yml
+++ b/docker/docker-swarm/docker-stack.yml
@@ -150,6 +150,8 @@ services:
DATABASE_DATABASE: dolphinscheduler
DATABASE_PARAMS: characterEncoding=utf8
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
+ HADOOP_HOME: "/opt/soft/hadoop"
+ HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop"
healthcheck:
test: ["CMD", "/root/checkpoint.sh", "MasterServer"]
interval: 30s
diff --git a/docker/kubernetes/dolphinscheduler/README.md
b/docker/kubernetes/dolphinscheduler/README.md
index db7c023..880340f 100644
--- a/docker/kubernetes/dolphinscheduler/README.md
+++ b/docker/kubernetes/dolphinscheduler/README.md
@@ -92,8 +92,8 @@ The configuration file is `values.yaml`, and the following
tables lists the conf
| `postgresql.postgresqlPassword`
| The password for internal PostgreSQL
| `root`
|
| `postgresql.postgresqlDatabase`
| The database for internal PostgreSQL
| `dolphinscheduler`
|
| `postgresql.persistence.enabled`
| Set `postgresql.persistence.enabled` to `true` to mount a new volume for
internal PostgreSQL | `false`
|
-| `postgresql.persistence.size`
| `PersistentVolumeClaim` Size
| `20Gi`
|
-| `postgresql.persistence.storageClass`
| PostgreSQL data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `postgresql.persistence.size`
| `PersistentVolumeClaim` size
| `20Gi`
|
+| `postgresql.persistence.storageClass`
| PostgreSQL data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
| `externalDatabase.type`
| If exists external PostgreSQL, and set `postgresql.enabled` value to
false. DolphinScheduler's database type will use it | `postgresql`
|
| `externalDatabase.driver`
| If exists external PostgreSQL, and set `postgresql.enabled` value to
false. DolphinScheduler's database driver will use it |
`org.postgresql.Driver` |
| `externalDatabase.host`
| If exists external PostgreSQL, and set `postgresql.enabled` value to
false. DolphinScheduler's database host will use it | `localhost`
|
@@ -107,8 +107,8 @@ The configuration file is `values.yaml`, and the following
tables lists the conf
| `zookeeper.fourlwCommandsWhitelist`
| A list of comma separated Four Letter Words commands to use
| `srvr,ruok,wchs,cons`
|
| `zookeeper.service.port`
| ZooKeeper port
| `2181`
|
| `zookeeper.persistence.enabled`
| Set `zookeeper.persistence.enabled` to `true` to mount a new volume for
internal Zookeeper | `false`
|
-| `zookeeper.persistence.size`
| `PersistentVolumeClaim` Size
| `20Gi`
|
-| `zookeeper.persistence.storageClass`
| Zookeeper data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `zookeeper.persistence.size`
| `PersistentVolumeClaim` size
| `20Gi`
|
+| `zookeeper.persistence.storageClass`
| Zookeeper data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
| `zookeeper.zookeeperRoot`
| Specify dolphinscheduler root directory in Zookeeper
| `/dolphinscheduler`
|
| `externalZookeeper.zookeeperQuorum`
| If exists external Zookeeper, and set `zookeeper.enabled` value to
false. Specify Zookeeper quorum | `127.0.0.1:2181`
|
| `externalZookeeper.zookeeperRoot`
| If exists external Zookeeper, and set `zookeeper.enabled` value to
false. Specify dolphinscheduler root directory in Zookeeper |
`/dolphinscheduler` |
@@ -121,10 +121,15 @@ The configuration file is `values.yaml`, and the
following tables lists the conf
| `common.configmap.FS_S3A_ACCESS_KEY`
| S3 access key when `common.configmap.RESOURCE_STORAGE_TYPE` is set to
`S3` | `xxxxxxx`
|
| `common.configmap.FS_S3A_SECRET_KEY`
| S3 secret key when `common.configmap.RESOURCE_STORAGE_TYPE` is set to
`S3` | `xxxxxxx`
|
| `common.configmap.DOLPHINSCHEDULER_ENV`
| System env path, self configuration, please read `values.yaml`
| `[]`
|
+| `common.sharedStoragePersistence.enabled`
| Set `common.sharedStoragePersistence.enabled` to `true` to mount a
shared storage volume for Hadoop, Spark binary and etc | `false`
|
+| `common.sharedStoragePersistence.mountPath`
| The mount path for the shared storage volume
| `/opt/soft`
|
+| `common.sharedStoragePersistence.accessModes`
| `PersistentVolumeClaim` access modes, must be `ReadWriteMany`
| `[ReadWriteMany]`
|
+| `common.sharedStoragePersistence.storageClassName`
| Shared Storage persistent volume storage class, must support the access
mode: ReadWriteMany | `-`
|
+| `common.sharedStoragePersistence.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
| `common.fsFileResourcePersistence.enabled`
| Set `common.fsFileResourcePersistence.enabled` to `true` to mount a new
file resource volume for `api` and `worker` | `false`
|
-| `common.fsFileResourcePersistence.accessModes`
| `PersistentVolumeClaim` Access Modes, must be `ReadWriteMany`
| `[ReadWriteMany]`
|
-| `common.fsFileResourcePersistence.storageClassName`
| Resource Persistent Volume Storage Class, must support the access mode:
ReadWriteMany | `-`
|
-| `common.fsFileResourcePersistence.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `common.fsFileResourcePersistence.accessModes`
| `PersistentVolumeClaim` access modes, must be `ReadWriteMany`
| `[ReadWriteMany]`
|
+| `common.fsFileResourcePersistence.storageClassName`
| Resource persistent volume storage class, must support the access mode:
ReadWriteMany | `-`
|
+| `common.fsFileResourcePersistence.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
|
|
|
|
| `master.podManagementPolicy`
| PodManagementPolicy controls how pods are created during initial scale
up, when replacing pods on nodes, or when scaling down | `Parallel`
|
| `master.replicas`
| Replicas is the desired number of replicas of the given Template
| `3`
|
@@ -155,9 +160,9 @@ The configuration file is `values.yaml`, and the following
tables lists the conf
| `master.readinessProbe.failureThreshold`
| Minimum consecutive successes for the probe
| `3`
|
| `master.readinessProbe.successThreshold`
| Minimum consecutive failures for the probe
| `1`
|
| `master.persistentVolumeClaim.enabled`
| Set `master.persistentVolumeClaim.enabled` to `true` to mount a new
volume for `master` | `false`
|
-| `master.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` Access Modes
| `[ReadWriteOnce]`
|
-| `master.persistentVolumeClaim.storageClassName`
| `Master` logs data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
-| `master.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `master.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` access modes
| `[ReadWriteOnce]`
|
+| `master.persistentVolumeClaim.storageClassName`
| `Master` logs data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `master.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
|
|
|
|
| `worker.podManagementPolicy`
| PodManagementPolicy controls how pods are created during initial scale
up, when replacing pods on nodes, or when scaling down | `Parallel`
|
| `worker.replicas`
| Replicas is the desired number of replicas of the given Template
| `3`
|
@@ -188,13 +193,13 @@ The configuration file is `values.yaml`, and the
following tables lists the conf
| `worker.readinessProbe.successThreshold`
| Minimum consecutive failures for the probe
| `1`
|
| `worker.persistentVolumeClaim.enabled`
| Set `worker.persistentVolumeClaim.enabled` to `true` to enable
`persistentVolumeClaim` for `worker` | `false`
|
| `worker.persistentVolumeClaim.dataPersistentVolume.enabled`
| Set `worker.persistentVolumeClaim.dataPersistentVolume.enabled` to
`true` to mount a data volume for `worker` | `false`
|
-| `worker.persistentVolumeClaim.dataPersistentVolume.accessModes`
| `PersistentVolumeClaim` Access Modes
| `[ReadWriteOnce]`
|
-| `worker.persistentVolumeClaim.dataPersistentVolume.storageClassName`
| `Worker` data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
-| `worker.persistentVolumeClaim.dataPersistentVolume.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `worker.persistentVolumeClaim.dataPersistentVolume.accessModes`
| `PersistentVolumeClaim` access modes
| `[ReadWriteOnce]`
|
+| `worker.persistentVolumeClaim.dataPersistentVolume.storageClassName`
| `Worker` data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `worker.persistentVolumeClaim.dataPersistentVolume.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
| `worker.persistentVolumeClaim.logsPersistentVolume.enabled`
| Set `worker.persistentVolumeClaim.logsPersistentVolume.enabled` to
`true` to mount a logs volume for `worker` | `false`
|
-| `worker.persistentVolumeClaim.logsPersistentVolume.accessModes`
| `PersistentVolumeClaim` Access Modes
| `[ReadWriteOnce]`
|
-| `worker.persistentVolumeClaim.logsPersistentVolume.storageClassName`
| `Worker` logs data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
-| `worker.persistentVolumeClaim.logsPersistentVolume.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `worker.persistentVolumeClaim.logsPersistentVolume.accessModes`
| `PersistentVolumeClaim` access modes
| `[ReadWriteOnce]`
|
+| `worker.persistentVolumeClaim.logsPersistentVolume.storageClassName`
| `Worker` logs data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `worker.persistentVolumeClaim.logsPersistentVolume.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
|
|
|
|
| `alert.replicas`
| Replicas is the desired number of replicas of the given Template
| `1`
|
| `alert.strategy.type`
| Type of deployment. Can be "Recreate" or "RollingUpdate"
| `RollingUpdate`
|
@@ -233,9 +238,9 @@ The configuration file is `values.yaml`, and the following
tables lists the conf
| `alert.readinessProbe.failureThreshold`
| Minimum consecutive successes for the probe
| `3`
|
| `alert.readinessProbe.successThreshold`
| Minimum consecutive failures for the probe
| `1`
|
| `alert.persistentVolumeClaim.enabled`
| Set `alert.persistentVolumeClaim.enabled` to `true` to mount a new
volume for `alert` | `false`
|
-| `alert.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` Access Modes
| `[ReadWriteOnce]`
|
-| `alert.persistentVolumeClaim.storageClassName`
| `Alert` logs data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
-| `alert.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `alert.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` access modes
| `[ReadWriteOnce]`
|
+| `alert.persistentVolumeClaim.storageClassName`
| `Alert` logs data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `alert.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
|
|
|
|
| `api.replicas`
| Replicas is the desired number of replicas of the given Template
| `1`
|
| `api.strategy.type`
| Type of deployment. Can be "Recreate" or "RollingUpdate"
| `RollingUpdate`
|
@@ -260,9 +265,9 @@ The configuration file is `values.yaml`, and the following
tables lists the conf
| `api.readinessProbe.failureThreshold`
| Minimum consecutive successes for the probe
| `3`
|
| `api.readinessProbe.successThreshold`
| Minimum consecutive failures for the probe
| `1`
|
| `api.persistentVolumeClaim.enabled`
| Set `api.persistentVolumeClaim.enabled` to `true` to mount a new volume
for `api` | `false`
|
-| `api.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` Access Modes
| `[ReadWriteOnce]`
|
-| `api.persistentVolumeClaim.storageClassName`
| `api` logs data Persistent Volume Storage Class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
-| `api.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` Size
| `20Gi`
|
+| `api.persistentVolumeClaim.accessModes`
| `PersistentVolumeClaim` access modes
| `[ReadWriteOnce]`
|
+| `api.persistentVolumeClaim.storageClassName`
| `api` logs data persistent volume storage class. If set to "-",
storageClassName: "", which disables dynamic provisioning | `-`
|
+| `api.persistentVolumeClaim.storage`
| `PersistentVolumeClaim` size
| `20Gi`
|
|
|
|
|
| `ingress.enabled`
| Enable ingress
| `false`
|
| `ingress.host`
| Ingress host
| `dolphinscheduler.org`
|
diff --git
a/docker/kubernetes/dolphinscheduler/templates/pvc-dolphinscheduler-shared.yaml
b/docker/kubernetes/dolphinscheduler/templates/pvc-dolphinscheduler-shared.yaml
new file mode 100644
index 0000000..fc65efc
--- /dev/null
+++
b/docker/kubernetes/dolphinscheduler/templates/pvc-dolphinscheduler-shared.yaml
@@ -0,0 +1,37 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+{{- if .Values.common.sharedStoragePersistence.enabled }}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: {{ include "dolphinscheduler.fullname" . }}-shared
+ labels:
+ app.kubernetes.io/name: {{ include "dolphinscheduler.fullname" . }}-shared
+ app.kubernetes.io/instance: {{ .Release.Name }}
+ app.kubernetes.io/managed-by: {{ .Release.Service }}
+ annotations:
+ "helm.sh/resource-policy": keep
+spec:
+ accessModes:
+ {{- range .Values.common.sharedStoragePersistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ storageClassName: {{
.Values.common.sharedStoragePersistence.storageClassName | quote }}
+ resources:
+ requests:
+ storage: {{ .Values.common.sharedStoragePersistence.storage | quote }}
+{{- end }}
\ No newline at end of file
diff --git
a/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-master.yaml
b/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-master.yaml
index 48f3742..92515ca 100644
---
a/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-master.yaml
+++
b/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-master.yaml
@@ -217,6 +217,13 @@ spec:
volumeMounts:
- mountPath: "/opt/dolphinscheduler/logs"
name: {{ include "dolphinscheduler.fullname" . }}-master
+ - mountPath:
"/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh"
+ subPath: "dolphinscheduler_env.sh"
+ name: {{ include "dolphinscheduler.fullname" . }}-common-env
+ {{- if .Values.common.sharedStoragePersistence.enabled }}
+ - mountPath: {{ .Values.common.sharedStoragePersistence.mountPath
| quote }}
+ name: {{ include "dolphinscheduler.fullname" . }}-shared
+ {{- end }}
volumes:
- name: {{ include "dolphinscheduler.fullname" . }}-master
{{- if .Values.master.persistentVolumeClaim.enabled }}
@@ -225,6 +232,18 @@ spec:
{{- else }}
emptyDir: {}
{{- end }}
+ - name: {{ include "dolphinscheduler.fullname" . }}-common-env
+ configMap:
+ defaultMode: 0777
+ name: {{ include "dolphinscheduler.fullname" . }}-common
+ items:
+ - key: DOLPHINSCHEDULER_ENV
+ path: dolphinscheduler_env.sh
+ {{- if .Values.common.sharedStoragePersistence.enabled }}
+ - name: {{ include "dolphinscheduler.fullname" . }}-shared
+ persistentVolumeClaim:
+ claimName: {{ include "dolphinscheduler.fullname" . }}-shared
+ {{- end }}
{{- if .Values.master.persistentVolumeClaim.enabled }}
volumeClaimTemplates:
- metadata:
diff --git
a/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-worker.yaml
b/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-worker.yaml
index 9fd8add..9a452be 100644
---
a/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-worker.yaml
+++
b/docker/kubernetes/dolphinscheduler/templates/statefulset-dolphinscheduler-worker.yaml
@@ -301,6 +301,10 @@ spec:
- mountPath:
"/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh"
subPath: "dolphinscheduler_env.sh"
name: {{ include "dolphinscheduler.fullname" . }}-common-env
+ {{- if .Values.common.sharedStoragePersistence.enabled }}
+ - mountPath: {{ .Values.common.sharedStoragePersistence.mountPath
| quote }}
+ name: {{ include "dolphinscheduler.fullname" . }}-shared
+ {{- end }}
{{- if .Values.common.fsFileResourcePersistence.enabled }}
- mountPath: {{ .Values.common.configmap.RESOURCE_UPLOAD_PATH |
quote }}
name: {{ include "dolphinscheduler.fullname" . }}-fs-file
@@ -327,6 +331,11 @@ spec:
items:
- key: DOLPHINSCHEDULER_ENV
path: dolphinscheduler_env.sh
+ {{- if .Values.common.sharedStoragePersistence.enabled }}
+ - name: {{ include "dolphinscheduler.fullname" . }}-shared
+ persistentVolumeClaim:
+ claimName: {{ include "dolphinscheduler.fullname" . }}-shared
+ {{- end }}
{{- if .Values.common.fsFileResourcePersistence.enabled }}
- name: {{ include "dolphinscheduler.fullname" . }}-fs-file
persistentVolumeClaim:
diff --git a/docker/kubernetes/dolphinscheduler/values.yaml
b/docker/kubernetes/dolphinscheduler/values.yaml
index a99ebc2..cc8e709 100644
--- a/docker/kubernetes/dolphinscheduler/values.yaml
+++ b/docker/kubernetes/dolphinscheduler/values.yaml
@@ -89,6 +89,15 @@ common:
- "export FLINK_HOME=/opt/soft/flink"
- "export DATAX_HOME=/opt/soft/datax"
- "export
PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$PATH"
+ ## Shared storage persistence mounted into master and worker, such as
Hadoop, Spark, Flink and DataX binary package
+ sharedStoragePersistence:
+ enabled: false
+ mountPath: "/opt/soft"
+ accessModes:
+ - "ReadWriteMany"
+ ## storageClassName must support the access mode: ReadWriteMany
+ storageClassName: "-"
+ storage: "20Gi"
## If RESOURCE_STORAGE_TYPE is HDFS and FS_DEFAULT_FS is file:///,
fsFileResourcePersistence should be enabled for resource storage
fsFileResourcePersistence:
enabled: false