使用Fluid实现数据加速访问

更新时间:2025-02-20 10:48:58

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的数据

  1. 执行以下命令,下载测试数据。

    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. 输入以下命令,创建名称为examplebucketBucket存储空间。

      说明

      如果执行命令后返回ErrorCode=BucketAlreadyExists,表示Bucket名称已经存在。由于Bucket名称在OSS范围内必须全局唯一,请按实际情况修改examplebucket

      ossutil64 mb oss://examplebucket

      预期输出:

      0.668238(s) elapsed

      以上输出结果表明已成功创建examplebucket

    3. 将下载的测试数据上传到新建的examplebucket中。

      ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
    4. (可选)设置Bucket和数据的访问权限。具体内容,请参见权限控制

  3. 使用以下内容,创建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

  4. 执行以下命令,生成Secret。Kubernetes会对已创建的Secret使用加密编码,避免将其明文暴露。

    kubectl create -f mySecret.yaml

步骤二:创建DatasetJindoRuntime

  1. 使用以下内容创建resource.yaml文件,内容包括:

    • 创建一个Dataset,描述远端存储数据集和UFS的信息。

    • 创建一个JindoRuntime,启动一个JindoFS的集群来提供缓存服务。

    说明

    通过kubectl get pods --field-selector=status.phase=Running -n fluid-system命令可以检查ack-fluid组件中的dataset-controllerjindoruntime-controller是否正常运行。

    本文示例以CPU算力为主,若您想要加速LLM服务的加载速度,请确保创建集群时选择的可用区支持GPU资源。具体操作,请参见GPU型算力类型

    展开查看YAML内容

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: hadoop
    spec:
      placement: Shared
      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:
      ## 必须与 Dataset 名字保持一致
      name: hadoop
    spec:
      networkmode: ContainerNetwork
      ## 可以按需调整
      replicas: 4
      master:
        podMetadata:
          labels:
            alibabacloud.com/compute-class: performance
            alibabacloud.com/compute-qos: default
      worker:
        podMetadata:
          labels:
            alibabacloud.com/compute-class: performance
            alibabacloud.com/compute-qos: default。
        resources:
          requests:
            cpu: 24
            memory: 48Gi
          limits:
            cpu: 24
            memory: 48Gi
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            volumeType: emptyDir
            ## 按需调整
            quota: 48Gi
            high: "0.99"
            low: "0.95"

    相关参数解释如下表所示:

    参数

    说明

    参数

    说明

    mountPoint

    oss://<oss_bucket>表示挂载UFS的路径,<oss_bucket>OSS Bucket的名称,例如:oss://examplebucket

    fs.oss.endpoint

    OSS BucketEndpoint信息,公网或私网地址均支持,例如:oss-cn-beijing-internal.aliyuncs.com。更多信息,请参见OSS地域和访问域名

    replicas

    表示创建JindoFS集群的Worker数量。

    mediumtype

    表示缓存类型。在创建JindoRuntime模板样例时,JindoFS暂时只支持HDD/SSD/MEM中的一种缓存类型。

    path

    表示存储路径,暂时只支持单个路径。当选择MEM作为缓存时,需指定一个本地路径来存储Log等文件。

    quota

    表示缓存最大容量,单位为Gi。

    high

    表示存储容量上限大小。

    low

    表示存储容量下限大小。

  2. 创建JindoRuntimeDataset。

    kubectl create -f resource.yaml
  3. 查看JindoRuntimeDataset的部署情况。

    1. 查看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
    2. 查看JindoRuntime的部署情况。

      kubectl get jindoruntime hadoop

      预期输出:

      NAME     MASTER PHASE   WORKER PHASE   FUSE PHASE   AGE
      hadoop   Ready          Ready          Ready        2m11s

      可以看到,DatasetJindoRuntime已创建成功。

  4. 执行以下命令,查看PVPVC的创建情况。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进行预热。

  1. OSS中的模型数据不会发生改变时,您可以使用以下内容创建dataload.yaml,用于进行一次性的预热。

    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: hadoop
    spec:
      dataset:
        name: hadoop
        namespace: default
      loadMetadata: true
  2. 如果OSS模型数据是动态更新的,则需要进行周期性的预热。具体操作,请参见场景二:数据只读且后端存储数据周期性规律变化

  3. 以一次性预热方式为例,创建DataLoad资源。

    kubectl create -f dataload.yaml
  4. 查看预热状态。

    kubectl get dataload

    预期输出:

    NAME          DATASET    PHASE       AGE   DURATION
    hadoop        hadoop   Complete      92m   51s

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

您可以通过创建应用容器,或者提交机器学习作业来体验JindoFS加速服务。以下以创建一个应用容器多次访问同一数据,并通过比较访问时间来展示JindoRuntime的加速效果。

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

    kubectl create -f app.yaml
  3. 未使用JindoFS缓存加速能力时,验证文件复制速度。

    1. 查看测试文件大小。

      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
    2. 查看文件的拷贝时间。

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

      预期输出:

      real    0m1.883s
      user    0m0.001s
      sys     0m0.041s

      上述输出信息显示本次文件拷贝时间消耗了1.883秒。

  4. 查看此时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缓存。

  5. 删除部署示例应用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托管集群验证本文内容,您只需要做以下调整:

  1. ACK托管集群同样需要安装ack-fluid组件。具体操作,请参见使用Helm简化应用部署

  2. 您需要使用以下内容来创建DatasetJindoRuntime。

    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: Sharednetworkmode

    • Fluid worker需要依赖大带宽环境来运行,因此ACS中需要通过指定配置大规格的资源来保证带宽充足,如指定使用compute-class: performance和通过resources 配置确保使用的ACS Pod的带宽满足需求。

  • 本页导读 (0)
  • 前提条件
  • 操作步骤
  • 步骤一:准备OSS Bucket的数据
  • 步骤二:创建Dataset和JindoRuntime
  • 步骤三:创建Dataload预热数据集
  • 步骤四:创建应用容器体验加速效果
  • ACK Pro集群弹ACS算力场景