JindoFS加速OSS文件访问

更新时间:
复制 MD 格式

应用频繁读取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的数据

  1. 执行以下命令,下载测试数据到ECS实例中。

    wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
  2. 将下载的测试数据上传到阿里云OSS对应的Bucket中。

    重要

    上传到OSS的步骤以Alibaba Cloud Linux 3.2104 LTS 64位的ECS实例为例。其他操作系统的具体操作,请参见命令行工具ossutil快速入门命令行工具ossutil 1.0

    1. 安装ossutil

    2. 创建名称为examplebucket的存储空间。

      • 输入以下命令创建examplebucket

        ossutil64 mb oss://examplebucket
      • 以下输出结果表明已成功创建examplebucket

        0.668238(s) elapsed
    3. 将下载的测试数据上传到新建的examplebucket中。

      ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket

步骤二:创建DatasetJindoRuntime

  1. 在创建Dataset之前,创建一个mySecret.yaml文件。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: xxx
      fs.oss.accessKeySecret: xxx

    其中,fs.oss.accessKeyIdfs.oss.accessKeySecret步骤一中用来访问OSSAccessKey IDAccessKey Secret

  2. 执行以下命令,生成Secret。创建的Secretbase64编码存储,避免在YAML中直接暴露明文。

    kubectl create -f mySecret.yaml
  3. 使用以下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 BucketEndpoint信息,公网或私网地址均支持。更多信息,请参见地域和Endpoint

    replicas

    JindoFS集群的Worker数量。

    mediumtype

    缓存类型,每个JindoRuntime仅支持配置一种(HDD、SSDMEM)。

    path

    存储路径,仅支持配置单个路径。当选择MEM做缓存时,需指定一个本地路径来存储Log等文件。

    quota

    缓存最大容量,单位Gi(GiB)。

    high

    缓存水位上限。缓存使用率超过该比例时触发数据淘汰。

    low

    缓存水位下限。数据淘汰至使用率低于该比例时停止。

  4. 执行以下命令,创建JindoRuntimeDataset。

    kubectl create -f resource.yaml
  5. 执行以下命令,查看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
  6. 执行以下命令,查看JindoRuntime的部署情况。

    kubectl get jindoruntime hadoop

    预期输出:

    NAME     MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
    hadoop   Ready          Ready          Ready        4m45s
  7. 执行以下命令,查看PVPVC的创建情况。

    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

上述输出表明DatasetJindoRuntime已创建成功。

步骤三:创建应用容器体验加速效果

以下通过创建应用容器多次访问同一数据,对比访问时间来展示加速效果。

  1. 使用以下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
  2. 执行以下命令,创建应用容器。

    kubectl create -f app.yaml
  3. 执行以下命令,查看文件大小。

    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
  4. 执行以下命令,查看文件的拷贝时间。

    time cp /data/hadoop/spark-3.0.1-bin-hadoop2.7.tgz /dev/null

    预期输出:

    real    0m18.386s
    user    0m0.002s
    sys    0m0.105s

    输出表明文件拷贝耗时约18秒。

  5. 执行以下命令,查看此时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数据已全部缓存到本地。

  6. 执行以下命令,删除之前的应用容器,新建相同的应用容器。

    说明

    删除并重建应用容器可排除Page Cache等因素对测试结果的影响。

    kubectl delete -f app.yaml && kubectl create -f app.yaml
  7. 执行以下命令,查看文件拷贝时间。

    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缓存,第二次访问所需时间远小于第一次。

(可选)环境清理

如不再使用数据加速功能,执行以下命令清理环境。

  1. 执行以下命令,删除应用容器。

    kubectl delete pod demo-app
  2. 执行以下命令,删除DatasetJindoRuntime。

    kubectl delete dataset hadoop