应用频繁读取OSS数据时,网络延迟和带宽可能成为性能瓶颈。通过在ACK集群中部署JindoRuntime(基于Fluid),可将OSS数据缓存到本地节点,大幅缩短重复访问的读取时间。
适用范围
-
已创建一个非ContainerOS操作系统的ACK Pro版集群,且集群版本为1.18及以上。具体操作,请参见创建ACK Pro版集群。
重要ack-fluid组件暂不支持在ContainerOS操作系统上使用。
-
已安装云原生AI套件并部署ack-fluid组件。
重要若您已安装开源Fluid,请卸载后再部署ack-fluid组件。
-
已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群。
-
已开通阿里云对象存储(OSS)服务。具体操作,请参见开通OSS服务。
步骤一:准备OSS Bucket的数据
-
执行以下命令,下载测试数据到ECS实例中。
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的存储空间。-
输入以下命令创建
examplebucket。ossutil64 mb oss://examplebucket -
以下输出结果表明已成功创建
examplebucket。0.668238(s) elapsed
-
-
将下载的测试数据上传到新建的
examplebucket中。ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
步骤二:创建Dataset和JindoRuntime
-
在创建Dataset之前,创建一个
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。创建的Secret以base64编码存储,避免在YAML中直接暴露明文。
kubectl create -f mySecret.yaml -
使用以下YAML示例创建名为
resource.yaml的文件,包含两部分内容:-
创建一个Dataset,描述远端存储数据集和UFS的信息。
-
创建一个JindoRuntime,启动一个JindoFS的集群来提供缓存服务。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hadoop spec: mounts: - mountPoint: oss://<oss_bucket>/<bucket_dir> options: fs.oss.endpoint: <oss_endpoint> # oss-cn-beijing-internal.aliyuncs.com 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: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"参数说明如下:
参数
说明
mountPoint
oss://<oss_bucket>/<bucket_dir>表示挂载UFS的路径,路径中不需要包含endpoint信息。
fs.oss.endpoint
OSS Bucket的Endpoint信息,公网或私网地址均支持。更多信息,请参见地域和Endpoint。
replicas
JindoFS集群的Worker数量。
mediumtype
缓存类型,每个JindoRuntime仅支持配置一种(HDD、SSD或MEM)。
path
存储路径,仅支持配置单个路径。当选择MEM做缓存时,需指定一个本地路径来存储Log等文件。
quota
缓存最大容量,单位Gi(GiB)。
high
缓存水位上限。缓存使用率超过该比例时触发数据淘汰。
low
缓存水位下限。数据淘汰至使用率低于该比例时停止。
-
-
执行以下命令,创建JindoRuntime和Dataset。
kubectl create -f resource.yaml -
执行以下命令,查看Dataset的部署情况。
kubectl get dataset hadoop预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210MiB 0.00B 4.00GiB 0.0% Bound 1h -
执行以下命令,查看JindoRuntime的部署情况。
kubectl get jindoruntime hadoop预期输出:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE hadoop Ready Ready Ready 4m45s -
执行以下命令,查看PV和PVC的创建情况。
kubectl get pv,pvc预期输出:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/default-hadoop 100Pi ROX Retain Bound default/hadoop 52m NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/hadoop Bound default-hadoop 100Pi ROX 52m
上述输出表明Dataset和JindoRuntime已创建成功。
步骤三:创建应用容器体验加速效果
以下通过创建应用容器多次访问同一数据,对比访问时间来展示加速效果。
-
使用以下YAML文件样例,创建名为app.yaml 的文件。
apiVersion: v1 kind: Pod metadata: name: demo-app spec: containers: - name: demo image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - mountPath: /data name: hadoop volumes: - name: hadoop persistentVolumeClaim: claimName: hadoop -
执行以下命令,创建应用容器。
kubectl create -f app.yaml -
执行以下命令,查看文件大小。
kubectl exec -it demo-app -- bash du -sh /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz预期输出:
210M /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz -
执行以下命令,查看文件的拷贝时间。
time cp /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz /dev/null预期输出:
real 0m18.386s user 0m0.002s sys 0m0.105s输出表明文件拷贝耗时约18秒。
-
执行以下命令,查看此时Dataset的缓存情况。
kubectl get dataset hadoop预期输出:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE hadoop 210.00MiB 210.00MiB 4.00GiB 100.0% Bound 1h输出表明210 MiB数据已全部缓存到本地。
-
执行以下命令,删除之前的应用容器,新建相同的应用容器。
说明删除并重建应用容器可排除Page Cache等因素对测试结果的影响。
kubectl delete -f app.yaml && kubectl create -f app.yaml -
执行以下命令,查看文件拷贝时间。
kubectl exec -it demo-app -- bash time cp /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz /dev/null预期输出:
real 0m0.048s user 0m0.001s sys 0m0.046s缓存后文件拷贝耗时约48 ms,比首次访问快约300倍。
说明由于文件已经被JindoFS缓存,第二次访问所需时间远小于第一次。
(可选)环境清理
如不再使用数据加速功能,执行以下命令清理环境。
-
执行以下命令,删除应用容器。
kubectl delete pod demo-app -
执行以下命令,删除Dataset和JindoRuntime。
kubectl delete dataset hadoop