通过Dataload定时更新Dataset数据

Fluid是一个开源的Kubernetes原生分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用。Fluid可以通过管理和调度底层缓存Runtime实现数据集的可见性、弹性伸缩和数据迁移。本文以JindoFS为例演示如何定时数据加载。

前提条件

  • 已创建ACK集群Pro版,且集群版本为1.18及以上。具体操作,请参见创建ACK集群Pro版

  • 已安装云原生AI套件并部署ack-fluid组件。

    重要
    • 若您已安装开源Fluid,请卸载后再部署ack-fluid组件。

    • 需确保ack-fluid版本为1.0.3。

  • 已通过kubectl连接Kubernetes集群。具体操作,请参见通过kubectl工具连接集群

步骤一:准备OSS Bucket的数据

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

    wget https://archive.apache.org/dist/hbase/2.5.2/RELEASENOTES.md
  2. 安装ossutil,并创建Bucket。具体操作,请参见安装ossutil

  3. 执行以下命令,将下载的测试数据上传到阿里云OSS对应的Bucket上。

    ossutil64 cp RELEASENOTES.md oss://<bucket>/<path>/RELEASENOTES.md

步骤二:创建Dataset和JindoRuntime

  1. 创建一个mySecret.yaml文件,用于保存OSS的accessKeyIdaccessKeySecret。YAML示例如下所示。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: ****** # 请输入accessKeyId。
      fs.oss.accessKeySecret: ****** # # 请输入accessKeySecret。
  2. 执行以下命令,生成Secret。

    kubectl create -f mySecret.yaml

    预期输出:

    secret/mysecret created
  3. 创建一个dataset.yaml文件,用于创建Dataset。

    展开查看YAML示例

    apiVersion: data.fluid.io/v1alpha1
    kind: Dataset
    metadata:
      name: demo
    spec:
      mounts:
        - mountPoint: oss://<bucket-name>/<path>
          options:
            fs.oss.endpoint: <oss-endpoint>
          name: hbase
          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
      accessModes:
        - ReadOnlyMany
    ---
    apiVersion: data.fluid.io/v1alpha1
    kind: JindoRuntime
    metadata:
      name: demo
    spec:
      replicas: 1
      tieredstore:
        levels:
          - mediumtype: MEM
            path: /dev/shm
            quota: 2Gi
            high: "0.99"
            low: "0.8"
      fuse:
       args:
        - -okernel_cache
        - -oro
        - -oattr_timeout=60
        - -oentry_timeout=60
        - -onegative_timeout=60

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

    参数

    说明

    Dataset

    mountPoint

    oss://<oss_bucket>/<path>表示挂载UFS的路径,路径中不需要包含Endpoint信息。

    fs.oss.endpoint

    OSS Bucket的Endpoint信息,公网或私网地址皆可。

    accessModes

    Dataset的访问模式。

    JindoRuntime

    replicas

    创建JindoFS集群的Worker数量。

    mediumtype

    缓存类型。定义创建JindoRuntime模板样例时,JindoFS支持HDD、SSD、MEM其中任意一种缓存类型。

    path

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

    quota

    缓存最大容量,单位GB。缓存容量可以根据UFS数据大小自行配置。

    high

    存储容量上限大小。

    low

    存储容量下限大小。

    fuse.args

    表示可选的Fuse客户端挂载参数。通常与Dataset的访问模式搭配使用。

    • 当Dataset访问模式为ReadOnlyMany时,开启kernel_cache以利用内核缓存优化读性能。此时您可以设置attr_timeout(文件属性缓存保留时间)、entry_timeout(文件名读取缓存保留时间)超时时间、negative_timeout(文件名读取失败缓存保留时间),默认均为7200s。

    • 当Dataset访问模式为ReadWriteMany时,建议您使用默认配置。此时参数设置如下:

      - -oauto_cache

      - -oattr_timeout=0

      - -oentry_timeout=0

      - -onegative_timeout=0

      说明

      使用auto_cache以确保如果文件大小或修改时间发生变化,缓存就会失效。同时将超时时间都设置为0。

  4. 执行以下命令,通过部署dateset.yaml创建JindoRuntime和Dataset。

    kubectl create -f dataset.yaml

    预期输出:

    dataset.data.fluid.io/demo created
    jindoruntime.data.fluid.io/demo created
  5. 执行以下命令,查看Dataset的部署情况。

    kubectl get dataset

    预期输出:

    NAME    UFS TOTAL SIZE   CACHED      CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    demo    588.90KiB        0.00B       10.00GiB         0.0%                Bound   2m7s

步骤三:创建支持定时运行的Dataload

  1. 创建一个dataload.yaml文件。

    展开查看YAML示例

    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: cron-dataload
    spec:
      dataset:
        name: demo
        namespace: default
      policy: Cron
      schedule: "*/2 * * * *" # Run every 2 min

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

    参数

    说明

    dataset

    包含执行Dataload的数据集的名称和命名空间。

    policy

    表示执行策略,目前支持Once和Cron。这里创建定时Dataload任务。

    • Once:仅执行一次策略。

    • Cron:定时执行策略。

    schedule

    表示触发Dataload的策略。.spec.schedule字段的值遵循Cron语法,详细信息,请参见Cron时间表语法

    关于Dataload高级配置,请参见如下配置文件:

    apiVersion: data.fluid.io/v1alpha1
    kind: DataLoad
    metadata:
      name: cron-dataload
    spec:
      dataset:
        name: demo
        namespace: default
      policy: Cron # 表示Dataload执行策略,包括[Once, Cron]。
      schedule: * * * * * # 仅当cron使用的policy为Cron时有效。
    	loadMetadata: true # 在Dataload前同步元数据。
      target: # Dataload的目标,支持指定的多个目标。
        - path: <path1> # 执行Dataload的路径。
          replicas: 1 # 缓存的副本数。
        - path: <path2>
          replicas: 2
  2. 执行以下命令,通过部署dataload.yaml来创建Dataload任务。

    kubectl apply -f dataload.yaml

    预期输出:

    dataload.data.fluid.io/cron-dataload created
  3. 执行以下命令,查看Dataload状态。

    kubectl get dataload

    如下所示,当PHASE的状态为Complete时,表明数据已加载完成,可进入下一步操作。

    NAME            DATASET   PHASE      AGE   DURATION
    cron-dataload   demo      Complete   68s   8s
  4. 执行以下命令,查看当前Dataset状态。

    kubectl get dataset

    预期输出:

    NAME    UFS TOTAL SIZE   CACHED      CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    demo    588.90KiB        588.90KiB   10.00GiB         100.0%              Bound   5m50s

    结果输出表明,OSS中的文件已经全部加载到缓存。

步骤四:创建应用容器访问OSS中的数据

  1. 创建一个app.yaml文件,使用应用容器访问RELEASENOTES.md文件。

    展开查看YAML示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /data
              name: demo-vol
      volumes:
        - name: demo-vol
          persistentVolumeClaim:
            claimName: demo
  2. 执行以下命令,创建应用容器。

    kubectl create -f app.yaml

    预期输出:

    pod/nginx created
  3. 等待应用容器就绪后,执行以下命令,查看OSS中的数据。

    kubectl exec -it nginx -- ls -lh /data

    预期输出:

    total 589K
    -rwxrwxr-x 1 root root 589K Jul 31 04:20 RELEASENOTES.md
  4. 执行以下命令,将字符串 "hello, crondataload." 写入RELEASENOTES.md文件中。

    echo "hello, crondataload." >> RELEASENOTES.md
  5. 执行以下文件,重新上传RELEASENOTES.md文件到OSS。

    ossutil64 cp RELEASENOTES.md oss://<bucket-name>/<path>/RELEASENOTES.md

    按下确认键y后,预期输出:

    cp: overwrite "oss://<bucket-name>/<path>/RELEASENOTES.md"(y or N)? y
    Succeed: Total num: 1, size: 21. OK num: 1(upload 1 files).                          
    
    average speed 0(byte/s)
    
    81.827978(s) elapsed
  6. 执行以下命令,查看Dataload作业运行情况。

    kubectl describe dataload cron-dataload

    预期输出:

    ...
    Status:
      Conditions:
        Last Probe Time:       2023-08-24T06:44:08Z
        Last Transition Time:  2023-08-24T06:44:08Z
        Status:                True
        Type:                  Complete
      Duration:                8s
      Last Schedule Time:      2023-08-24T06:44:00Z # 为上一次Dataload作业的调度时间。
      Last Successful Time:    2023-08-24T06:44:08Z # 为上一次Dataload作业的完成时间。
      Phase:                   Complete
      ...
  7. 执行以下命令,查看当前Dataset状态。

    kubectl get dataset

    预期输出:

    NAME    UFS TOTAL SIZE   CACHED      CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    demo    588.90KiB        1.15MiB     10.00GiB         100.0%              Bound   10m

    预期输出表明,更新后的文件已经加载到了缓存。

  8. 执行以下命令,在应用容器中查看更新后的文件。

    kubectl exec -it nginx -- tail /data/RELEASENOTES.md

    预期输出:

    hello, crondataload.

    输出结果表明,应用容器已经可以访问更新后的文件。

(可选)步骤五:环境清理

若无需使用该数据加速功能时,请清理环境。

执行以下命令,删除JindoRuntime和应用容器。

kubectl delete -f app.yaml
kubectl delete -f dataset.yaml

预期输出:

pod "nginx" deleted
dataset.data.fluid.io "demo" deleted
jindoruntime.data.fluid.io "demo" deleted