为了保证应用在访问数据时的性能,可以通过数据预加载提前将远程存储系统中的数据拉取到靠近计算结点的分布式缓存引擎中,使得消费该数据集的应用能够在首次运行时即可享受到缓存带来的加速效果。
为此,我们提供了 DataLoad CRD,该 CRD 让您可通过简单的配置就能完成整个数据预加载过程,并对数据预加载的许多行为进行自定义控制。
本文档通过以下两个例子演示了 DataLoad CRD 的使用方法:
DataLoad 快速使用
DataLoad 进阶配置
前提条件
说明
新建工作环境
$ mkdir <any-path>/warmup$ cd <any-path>/warmup
DataLoad 快速使用
配置待创建的 Dataset 和 Runtime 对象
apiVersion: data.fluid.io/v1alpha1kind: Datasetmetadata:name: sparkspec:mounts:- mountPoint: https://mirrors.bit.edu.cn/apache/spark/name: spark---apiVersion: data.fluid.io/v1alpha1kind: GooseFSRuntimemetadata:name: sparkspec:replicas: 2tieredstore:levels:- mediumtype: SSDpath: /mnt/disk1/quota: 2Ghigh: "0.8"low: "0.7"
说明
在这里,我们将要创建一个 kind 为
Dataset
的资源对象(Resource object)。Dataset
是 Fluid 所定义的一个 Custom Resource Definition(CRD),该 CRD 被用来告知 Fluid 在哪里可以找到您所需要的数据。Fluid 将该 CRD 对象中定义的 mountPoint
属性挂载到 GooseFS 之上。
在本示例中,为了简单,我们使用 COS 进行演示。
创建 Dataset 和 Runtime 对象
$ kubectl create -f dataset.yaml
等待 Dataset 和 Runtime 准备就绪
$ kubectl get datasets spark
如果看到类似以下结果,说明 Dataset 和 Runtime 均已准备就绪:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGEspark 1.92GiB 0.00B 4.00GiB 0.0% Bound 4m4s
配置待创建的 DataLoad 对象
apiVersion: data.fluid.io/v1alpha1kind: DataLoadmetadata:name: spark-dataloadspec:loadMetadata: truedataset:name: sparknamespace: default
spec.dataset
指明了需要进行数据预加载的目标数据集,在该例子中,我们的数据预加载目标为 default
命名空间下名为 spark
的数据集,如果该配置与您所在的实际环境不符,请根据您的实际环境对其进行调整。
创建 DataLoad 对象
$ kubectl create -f dataload.yaml
查看创建的 DataLoad 对象状态
$ kubectl get dataload spark-dataload
上述命令会得到类似以下结果:
NAME DATASET PHASE AGEspark-dataload spark Loading 2m13s
您也可以通过
kubectl describe
获取有关该 DataLoad 的更多详细信息:$ kubectl describe dataload spark-dataload
得到以下结果:
Name: spark-dataloadNamespace: defaultLabels: <none>Annotations: <none>API Version: data.fluid.io/v1alpha1Kind: DataLoad...Spec:Dataset:Name: sparkNamespace: defaultStatus:Conditions:Phase: LoadingEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal DataLoadJobStarted 80s DataLoad The DataLoad job spark-dataload-loader-job started
上述数据加载过程根据您所在的网络环境不同,可能会耗费数分钟。
等待数据加载过程完成
$ kubectl get dataload spark-dataload
您会看到该 DataLoad 的
Phase
状态已经从 Loading
变为 Complete
,这表明整个数据加载过程已经完成。NAME DATASET PHASE AGE$ spark-dataload spark Complete 5m17s
此时再次查看 Dataset 对象的缓存状态:
$ kubectl get dataset spark
可发现,远程存储系统中的全部数据均已成功缓存到分布式缓存引擎中。
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGEspark 1.92GiB 1.92GiB 4.00GiB 100.0% Bound 7m41s
环境清理
$ kubectl delete -f .
DataLoad 进阶配置
除了上述示例中展示的数据预加载功能外,通过一些简单的配置,您可以对数据预加载进行更加细节的调整,这些调整包括:
指定一个或多个数据集子目录进行加载
设置数据加载时的缓存副本数量
数据加载前首先进行元数据同步
指定一个或多个数据集子目录进行加载
进行数据加载时可以加载指定的子目录(或文件),而不是整个数据集,例如:
apiVersion: data.fluid.io/v1alpha1kind: DataLoadmetadata:name: spark-dataloadspec:dataset:name: sparknamespace: defaultloadMetadata: truetarget:- path: /spark/spark-2.4.8- path: /spark/spark-3.0.1/pyspark-3.0.1.tar.gz
上述 DataLoad 仅会加载
/spark/spark-2.4.8
目录下的全部文件,以及 /spark/spark-3.0.1/pyspark-3.0.1.tar.gz
文件。spec.target.path
的值均为 mountpoint
挂载点下的相对路径。例如当前的挂载点为 cos://test/
,原始路径下有以下文件:cos://test/user/sample.txtcos://test/data/fluid.tgz
那么
target.path
可定义为:target:- path: /user- path: /data
设置数据加载时的缓存副本数量
进行数据加载时,您也可以通过配置控制加载的数据副本数量,例如:
apiVersion: data.fluid.io/v1alpha1kind: DataLoadmetadata:name: spark-dataloadspec:dataset:name: sparknamespace: defaultloadMetadata: truetarget:- path: /spark/spark-2.4.8replicas: 1- path: /spark/spark-3.0.1/pyspark-3.0.1.tar.gzreplicas: 2
上述 DataLoad 在进行数据加载时,对于
/spark/spark-2.4.8
目录下的文件仅会在分布式缓存引擎中保留1份数据缓存副本,而对于文件 /spark/spark-3.0.1/pyspark-3.0.1.tar.gz
,分布式缓存引擎将会保留2份缓存副本。数据加载前首先进行元数据同步(建议开启)
在许多场景下,底层存储系统中的文件可能发生了变化,对于分布式缓存引擎来说,需要重新进行文件元信息的同步才能感知到底层存储系统中的变化。因此在进行数据加载前,您也可以通过设置 DataLoad 对象的
spec.loadMetadata
来预先完成元信息的同步操作,例如:apiVersion: data.fluid.io/v1alpha1kind: DataLoadmetadata:name: spark-dataloadspec:dataset:name: sparknamespace: defaultloadMetadata: truetarget:- path: /replicas: 1