全部產品
Search
文件中心

Container Service for Kubernetes:通過Dataload定時更新Dataset資料

更新時間:Sep 18, 2025

Fluid是一個開源的Kubernetes原生分布式資料集編排和加速引擎,主要服務於雲原生情境下的資料密集型應用。Fluid可以通過管理和調度底層緩衝Runtime實現資料集的可見度、Auto Scaling和資料移轉。本文以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