JindoRuntime是基于C++实现的支撑Dataset数据管理和缓存的执行引擎,支持OSS对象存储。Fluid通过管理和调度JindoRuntime实现数据集的可见性、弹性伸缩和数据迁移。本文介绍如何在ACS算力场景下使用Fluid实现数据加速访问。
前提条件
已开通阿里云对象存储 OSS(Object Storage Service)服务。具体操作,请参见开通OSS服务。
已安装ack-fluid组件,组件版本需要1.0.11-*及以上。具体操作,请参见使用Helm管理ACS应用。
已为ACS Pod开启特权模式。
使用Fluid实现数据加速访问需要开启特权模式,请提交工单开启。
操作步骤
步骤一:准备OSS Bucket的数据
执行以下命令,下载测试数据。
wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
将下载的测试数据上传到阿里云OSS对应的Bucket中。
上传到OSS的步骤以Alibaba Cloud Linux 3.2104 LTS 64位的ECS实例为例。其他操作系统的具体操作,请参见命令行工具ossutil命令参考和命令行工具ossutil 1.0。
输入以下命令,创建名称为
examplebucket
的Bucket存储空间。如果执行命令后返回
ErrorCode=BucketAlreadyExists
,表示Bucket名称已经存在。由于Bucket名称在OSS范围内必须全局唯一,请按实际情况修改examplebucket
。ossutil64 mb oss://examplebucket
预期输出:
0.668238(s) elapsed
以上输出结果表明已成功创建
examplebucket
。将下载的测试数据上传到新建的
examplebucket
中。ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
(可选)设置Bucket和数据的访问权限。具体内容,请参见权限控制。
使用以下内容,创建
mySecret.yaml
文件。apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: xxx fs.oss.accessKeySecret: xxx
其中,
fs.oss.accessKeyId
和fs.oss.accessKeySecret
是用来访问OSS的AccessKey ID
和AccessKey Secret
。执行以下命令,生成Secret。Kubernetes会对已创建的Secret使用加密编码,避免将其明文暴露。
kubectl create -f mySecret.yaml
步骤二:创建Dataset和JindoRuntime
使用以下内容创建
resource.yaml
文件,内容包括:创建一个Dataset,描述远端存储数据集和UFS的信息。
创建一个JindoRuntime,启动一个JindoFS的集群来提供缓存服务。
通过
kubectl get pods --field-selector=status.phase=Running -n fluid-system
命令可以检查ack-fluid组件中的dataset-controller和jindoruntime-controller是否正常运行。本文示例以CPU算力为主,若您想要加速LLM服务的加载速度,请确保创建集群时选择的可用区支持GPU资源。具体操作,请参见GPU型算力类型。
相关参数解释如下表所示:
参数
说明
参数
说明
mountPoint
oss://<oss_bucket>表示挂载UFS的路径,<oss_bucket>为OSS Bucket的名称,例如:
oss://examplebucket
。fs.oss.endpoint
OSS Bucket的Endpoint信息,公网或私网地址均支持,例如:
oss-cn-beijing-internal.aliyuncs.com
。更多信息,请参见OSS地域和访问域名。replicas
表示创建JindoFS集群的Worker数量。
mediumtype
表示缓存类型。在创建JindoRuntime模板样例时,JindoFS暂时只支持
HDD
/SSD
/MEM
中的一种缓存类型。path
表示存储路径,暂时只支持单个路径。当选择
MEM
作为缓存时,需指定一个本地路径来存储Log等文件。quota
表示缓存最大容量,单位为Gi。
high
表示存储容量上限大小。
low
表示存储容量下限大小。
创建JindoRuntime和Dataset。
kubectl create -f resource.yaml
查看JindoRuntime和Dataset的部署情况。
查看Dataset的部署情况。
kubectl get dataset hadoop
预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 209.74MiB 0.00B 4.00GiB 0.0% Bound 56s
查看JindoRuntime的部署情况。
kubectl get jindoruntime hadoop
预期输出:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE hadoop Ready Ready Ready 2m11s
可以看到,Dataset和JindoRuntime已创建成功。
执行以下命令,查看PV和PVC的创建情况。PVC的名字即对应Dataset的名字。
kubectl get pv,pvc
预期输出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/default-hadoop 100Pi ROX Retain Bound default/hadoop fluid <unset> 2m5s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/hadoop Bound default-hadoop 100Pi ROX fluid <unset> 2m5s
步骤三:创建Dataload预热数据集
为了有效地提高数据加载速度,并确保数据处理逻辑正确,需要对Dataset进行预热。
当OSS中的模型数据不会发生改变时,您可以使用以下内容创建dataload.yaml,用于进行一次性的预热。
apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: hadoop spec: dataset: name: hadoop namespace: default loadMetadata: true
如果OSS模型数据是动态更新的,则需要进行周期性的预热。具体操作,请参见场景二:数据只读且后端存储数据周期性规律变化。
以一次性预热方式为例,创建DataLoad资源。
kubectl create -f dataload.yaml
查看预热状态。
kubectl get dataload
预期输出:
NAME DATASET PHASE AGE DURATION hadoop hadoop Complete 92m 51s
步骤四:创建应用容器体验加速效果
您可以通过创建应用容器,或者提交机器学习作业来体验JindoFS加速服务。以下以创建一个应用容器多次访问同一数据,并通过比较访问时间来展示JindoRuntime的加速效果。
使用以下YAML文件样例,创建名为app.yaml的文件。
apiVersion: v1 kind: Pod metadata: name: demo-app labels: # ACS的挂载需要使用到Fluid Webhook的Sidecar注入,所以需要配置如下label alibabacloud.com/fluid-sidecar-target: acs spec: containers: - name: demo image: mirrors-ssl.aliyuncs.com/nginx:latest volumeMounts: - mountPath: /data name: hadoop resources: requests: cpu: 14 memory: 56Gi volumes: - name: hadoop persistentVolumeClaim: ## fluid dataset 名字 claimName: hadoop nodeSelector: type: virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Equal value: alibabacloud effect: NoSchedule
执行以下命令,创建应用容器。
kubectl create -f app.yaml
未使用JindoFS缓存加速能力时,验证文件复制速度。
查看测试文件大小。
kubectl exec -it demo-app -c demo -- du -sh /data/spark-3.0.1-bin-hadoop2.7.tgz
预期输出:
210M /data/spark-3.0.1-bin-hadoop2.7.tgz
查看文件的拷贝时间。
time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
预期输出:
real 0m1.883s user 0m0.001s sys 0m0.041s
上述输出信息显示本次文件拷贝时间消耗了1.883秒。
查看此时Dataset的缓存情况。
kubectl get dataset hadoop
预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 209.74MiB 209.74MiB 4.00GiB 100.0% Bound 64m
上述输出信息显示
100.0%
的数据都已经在JindoFS缓存。删除部署示例应用Pod,再次查看文件拷贝时间。
删除应用Pod的目的是为了避免其他因素(例如:Page Cache)对结果造成影响,如果Pod中已经存在本地缓存,拷贝操作会优先使用本地缓存。
执行如下命令,查看文件拷贝时间。
kubectl exec -it demo-app -c demo -- bash time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null
预期输出:
real 0m0.203s user 0m0.000s sys 0m0.047s
可以看到,本次文件拷贝时间消耗了0.203秒,比第一次缩短了约9倍。由于此时文件已经被JindoFS缓存,第二次访问所需时间远小于第一次。
本文中提供的拷贝时间数据仅为参考值,实际数据请以您的操作环境为准。
ACK Pro集群弹ACS算力场景
本文基于ACS集群,演示了使用JindoFS加速文件复制的速度。您也可以在ACK托管集群中使用ACS算力来完成本文中的操作。关于如何在ACK托管集群中使用ACS算力,请参见通过ACK托管集群Pro版使用ACS算力。
使用ACK托管集群验证本文内容,您只需要做以下调整:
ACK托管集群同样需要安装ack-fluid组件。具体操作,请参见使用Helm简化应用部署。
您需要使用以下内容来创建Dataset和JindoRuntime。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hadoop spec: mounts: ## 如果是包含子目录则 oss://<oss_bucket>/{oss_path} 配置 - mountPoint: oss://<oss_bucket> # 请按实际情况修改<oss_bucket> options: fs.oss.endpoint: <oss_endpoint> # 请按实际情况修改<oss_endpoint> name: hadoop path: "/" encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: mysecret key: fs.oss.accessKeySecret --- apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: hadoop spec: ## 可以按需调整 replicas: 4 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 48Gi high: "0.99" low: "0.95"
与ACS集群的差异:
由于ACS集群使用的是虚拟节点,无法像ACK集群那样扩缩容节点数量,因此需要配置
.spec.placement: Shared
和networkmode
。Fluid worker需要依赖大带宽环境来运行,因此ACS中需要通过指定配置大规格的资源来保证带宽充足,如指定使用
compute-class: performance
和通过resources
配置确保使用的ACS Pod的带宽满足需求。
- 本页导读 (0)
- 前提条件
- 操作步骤
- 步骤一:准备OSS Bucket的数据
- 步骤二:创建Dataset和JindoRuntime
- 步骤三:创建Dataload预热数据集
- 步骤四:创建应用容器体验加速效果
- ACK Pro集群弹ACS算力场景