全部產品
Search
文件中心

Container Service for Kubernetes:使用Fluid加速OSS檔案訪問

更新時間:Jun 19, 2024

Fluid是一個開源的Kubernetes原生的分布式資料集編排和加速引擎,主要服務於雲原生情境下的資料密集型應用,例如巨量資料應用、AI應用等。JindoRuntime來源於阿里雲EMR團隊JindoFS,是基於C++實現的支撐Dataset資料管理和緩衝的執行引擎,支援OSSObject Storage Service。Fluid通過管理和調度JindoRuntime實現資料集的可見度、Auto Scaling和資料移轉。本文介紹如何在註冊叢集中使用Fluid加速OSS檔案訪問。

實現原理

通過Fluid加速OSS檔案訪問的實現原理如下圖所示。訪問oss.png

前提條件

步驟一:安裝ack-fluid組件

通過onectl安裝

  1. 在本地安裝配置onectl。具體操作,請參見通過onectl管理註冊叢集

  2. 執行以下命令,安裝ack-fluid組件。

    onectl addon install ack-fluid --set pullImageByVPCNetwork=false

    pullImageByVPCNetwork:為選擇性參數,設定是否使用VPC網路拉取組件鏡像。

    預期輸出:

    Addon ack-fluid, version **** installed.

通過控制台安裝

  1. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

  2. 應用目錄頁面,搜尋並選中ack-fluid。

  3. 在頁面右上方,單擊一鍵部署

  4. 建立面板中,選擇叢集命名空間發布名稱可保持系統預設,然後單擊下一步

  5. 選擇Chart 版本為當前最新版本,設定組件相關參數,然後單擊確定

步驟二:準備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提供的用戶端工具ossutil。具體操作,請參見安裝ossutil

步驟三:為本地叢集節點打上標籤

執行以下命令,為本地IDC叢集中的所有節點打上demo-oss=true的標籤,該標籤用於設定JindoRuntime的Master和Worker組件的節點調度約束條件。

kubectl label node **** demo-oss=true

步驟四:建立Dataset和JindoRuntime

  1. 使用以下內容,建立mySecret.yaml檔案。

    該檔案用於儲存OSS的fs.oss.accessKeyIdfs.oss.accessKeySecret,需要在建立Dataset之前建立。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    stringData:
      fs.oss.accessKeyId: ****
      fs.oss.accessKeySecret: ****
  2. 執行以下命令,部署mySecret檔案產生Secret。

    kubectl create -f mySecret.yaml

    Kubernetes會對已建立的Secret使用加密編碼,避免將其明文暴露。

  3. 使用以下內容,建立resource.yaml檔案。該YAML檔案包含Dataset和JindoRuntime兩部分內容。

    • 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>
            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:
        # 保證緩衝運行時只運行在本地叢集的節點中。
        master:
          nodeSelector:
            demo-oss: "true"
        worker:
          nodeSelector:
            demo-oss: "true"
        fuse:
          nodeSelector:
            demo-oss: "true"
        replicas: 2
        tieredstore:
          levels:
            - mediumtype: HDD
              path: /mnt/disk1
              quota: 100G
              high: "0.99"
              low: "0.8"

      類別

      參數

      說明

      Dataset

      mountPoint

      oss://<oss_bucket>/<bucket_dir>為掛載UFS的路徑,路徑中不需要包含Endpoint資訊。

      fs.oss.endpoint

      OSS Bucket的Endpoint資訊,公網或私網地址皆可。

      JindoRuntime

      replicas

      建立JindoFS叢集的Worker數量。

      mediumtype

      緩衝類型。定義建立JindoRuntime模板範例時,JindoFS暫時僅支援HDD、SSD、MEM的其中一種緩衝類型。

      path

      儲存路徑。暫時只支援單個路徑。當選擇MEM做緩衝時,需指定一個本地路徑用於儲存Log等檔案。

      quota

      緩衝最大容量,單位為GB。

      high

      儲存容量上限大小。

      low

      儲存容量下限大小。

  4. 執行以下命令,建立JindoRuntime和Dataset。

    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    100.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. 執行以下命令,查看PV和PVC狀態。

    kubectl get pv,pvc

    預期輸出:

    NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
    persistentvolume/hadoop   100Gi      RWX            Retain           Bound    default/hadoop                           52m
    
    NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/hadoop   Bound    hadoop   100Gi      RWX                           52m

    預期輸出表明,Dataset和JindoRuntime已建立成功。

步驟五:建立容器應用體驗加速效果

您可以通過建立容器應用來使用JindoFS加速服務,或者提交機器學習作業來體驗相關功能。本文以建立一個容器應用多次訪問同一資料,並通過對比訪問時間為例展示JindoRuntime的加速效果。

  1. 使用以下內容,建立app.yaml檔案。

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo-app
    spec:
      containers:
        - name: demo
          image: fluidcloudnative/serving
          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/spark-3.0.1-bin-hadoop2.7.tgz

    預期輸出:

    209.7M    /data/spark-3.0.1-bin-hadoop2.7.tgz
  4. 執行如下命令,查看檔案的拷貝時間。

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

    預期輸出:

    real    1m2.374s
    user    0m0.000s
    sys     0m0.256s

    預期輸出表明,檔案拷貝時間消耗了62s。

  5. 執行以下命令,查看此時Dataset的緩衝情況。

    kubectl get dataset hadoop

    預期輸出:

    NAME     UFS TOTAL SIZE   CACHED   CACHE CAPACITY   CACHED PERCENTAGE   PHASE   AGE
    hadoop   209.74MiB       209.74MiB    100.00GiB        100.0%           Bound   1h

    預期輸出表明,209.7 MiB的資料已經緩衝到了本地。

  6. 執行以下命令,刪除之前的容器應用,建立相同的容器應用。

    說明

    此操作是為了避免其他因素(例如Page Cache)對結果造成影響。

    kubectl delete -f app.yaml && kubectl create -f app.yaml
  7. 執行如下命令,查看檔案拷貝時間。

    kubectl exec -it demo-app -- bash
    time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /test

    預期輸出:

    real	0m3.454s
    user	0m0.000s
    sys	  0m0.268s

    預期輸出表明,檔案的拷貝時間為3s,拷貝時間縮短至原來的十八分之一。主要原因是由於檔案已經被JindoFS緩衝,所以第二次訪問所需時間遠小於第一次。

(可選)步驟六:清理環境

當不再使用資料加速功能時,您需要執行以下命令清理環境。

  1. 執行以下命令,刪除JindoRuntime和應用程式容器。

    kubectl delete jindoruntime hadoop
  2. 執行以下命令,刪除Dataset。

    kubectl delete dataset hadoop