全部產品
Search
文件中心

Container Service for Kubernetes:JindoFS加速OSS檔案訪問

更新時間:Aug 03, 2024

JindoRuntime來源於阿里雲EMR團隊JindoFS,是基於C++實現的支撐Dataset資料管理和緩衝的執行引擎,支援OSSObject Storage Service。JindoFS是阿里雲的產品,有專門的產品級支援。Fluid通過管理和調度JindoRuntime實現資料集的可見度、Auto Scaling和資料移轉。本文介紹JindoFS如何加速OSS檔案訪問。

前提條件

  • 已建立一個非ContainerOS作業系統的ACK Pro版叢集,且叢集版本為1.18及以上。具體操作,請參見建立ACK Pro版叢集

    重要

    ack-fluid組件暫不支援在ContainerOS作業系統上使用。

  • 已安裝雲原生AI套件並部署ack-fluid組件。

    重要

    若您已安裝開源Fluid,請卸載後再部署ack-fluid組件。

  • 已通過kubectl串連Kubernetes叢集。具體操作,請參見通過kubectl工具串連叢集

  • 已開通阿里雲Object Storage Service服務。具體操作,請參見開通OSS服務

背景資訊

準備好K8s和OSS環境的條件後,您只需要耗費10分鐘左右即可完成JindoRuntime環境的部署。

步驟一:準備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. 安裝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

步驟二:建立Dataset和JindoRuntime

  1. 在建立Dataset之前,在ECS執行個體中的根目錄中建立一個mySecret.yaml檔案。

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

    其中,fs.oss.accessKeyIdfs.oss.accessKeySecret步驟一中用來訪問OSS的AccessKey IDAccessKey Secret

  2. 執行以下命令,產生Secret。K8s會對已建立的Secret使用加密編碼,避免將其明文暴露。

    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>
          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 Bucket的Endpoint資訊,公網或私網地址均支援。更多資訊,請參見訪問網域名稱和資料中心

    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    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. 執行以下命令,查看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. 使用以下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/spark-3.0.1-bin-hadoop2.7.tgz

    預期輸出:

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

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

    預期輸出:

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

    從上述輸出資訊,可以知道檔案拷貝時間消耗了18s。

  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/spark-3.0.1-bin-hadoop2.7.tgz /dev/null

    預期輸出:

    real    0m0.048s
    user    0m0.001s
    sys     0m0.046s

    從上述輸出資訊,可以知道進行檔案的cp拷貝觀察時間消耗48 ms,整個拷貝的時間縮短了300多倍。

    說明

    由於檔案已經被JindoFS緩衝,第二次訪問所需時間遠小於第一次。

環境清理

當您不再使用該資料加速功能時,需要清理環境。

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

kubectl delete pod demo-app

執行以下命令,刪除Dataset和JindoRuntime。

kubectl delete dataset hadoop