すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Fluidを使用してエッジノードからOSSファイルへのアクセスを高速化

最終更新日:Dec 19, 2024

Fluidは、ビッグデータアプリケーションやAIアプリケーションなど、クラウドネイティブシナリオのデータ集約型アプリケーションで使用できる、オープンソース、Kubernetesネイティブ、分散型データセットのオーケストレーションおよびアクセラレーションエンジンです。 エッジコンピューティングでは、Fluidのデータセット高速化エンジンにより、エッジノードがOSSファイルにアクセスする速度が大幅に向上します。 このトピックでは、Container Service for Kubernetes (ACK) EdgeクラスターでFluidのデータアクセラレーション機能を使用する方法について説明します。

前提条件

  • Kubernetes 1.18以降を実行するACK Edgeクラスターが作成されます。 詳細については、「コンソールでのACK Edgeクラスターの作成」をご参照ください。

  • エッジノードが追加されたエッジノードプールが作成されます。 詳細については、「エッジノードプールの作成」および「エッジノードの追加」をご参照ください。

  • クラウドネイティブAIスイートがインストールされ、ack-fluidコンポーネントがデプロイされます。

    重要

    オープンソースFluidをインストールしている場合は、ack-fluidコンポーネントをインストールする前にアンインストールする必要があります。

    • クラウドネイティブのAIスイートがデプロイされていない場合: スイートをデプロイするときに、Data Access AccelerationFluidを有効にします。

    • クラウドネイティブAIスイートがデプロイされている場合: ACKコンソールクラウドネイティブAIスイートページで、ack-fluidをデプロイします。

  • kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

  • Object Storage Service (OSS) が有効化されています。 詳細については、「OSSの有効化」をご参照ください。

手順1: OSSにデータをアップロードする

  1. 次のコマンドを実行して、テストデータセットをElastic Compute Service (ECS) インスタンスにダウンロードします。

    wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
  2. テストデータセットを OSS バケット

    重要

    この例では、Alibaba Cloud Linux 3.2104 LTS 64ビットオペレーティングシステムを実行するECSインスタンスからOSSにテストデータセットをアップロードする方法について説明します。 他のオペレーティングシステムを使用している場合は、「ossutil」と「概要」をご参照ください。

    1. ossutilをインストールします

    2. examplebucketという名前のバケットを作成します。

      • 次のコマンドを実行して、examplebucketという名前のバケットを作成します。

        ossutil64 mb oss:// examplebucket
      • 次の出力が表示された場合、examplebucketという名前のバケットが作成されます。

        0.668238経過
    3. テストデータセットをexamplebucketにアップロードします。

      ossutil64 cp spark-3.0.1-bin-hadoop2.7.tgz oss:// examplebucket

ステップ2: データセットとJindoRuntimeの作成

  1. データセットを作成する前に、ECSインスタンスのルートディレクトリにmySecret.yamlという名前のファイルを作成します。

    apiVersion: v1
    kind: 秘密
    メタデータ:
      名前: mysecret
    stringData:
      fs.oss.accessKeyId: xxx
      fs.oss.accessKeySecret: xxx 

    手順1でossへのアクセスに使用するAccessKey IDおよびAccessKey secretとして、fs.oss.accessKeyIdおよびfs. OSS. accessKeySecretを指定します。

  2. 次のコマンドを実行してシークレットを作成します。Kubernetesは作成されたシークレットを暗号化し、保存された情報がプレーンテキストとして公開されないようにします。

    kubectl create -f mySecret.yaml
  3. 次のyamlテンプレートを使用して、resource. YAMLという名前のファイルを作成します。 このテンプレートは、次の操作を実行するために使用されます。

    • リモートストレージ内のデータセットと基になるファイルシステム (UFS) に関する情報を指定するデータセットを作成します。

    • JindoRuntimeを作成して、データキャッシュ用のJindoFSクラスターを起動します。

    apiVersion: data.fluid.io/v1alpha 1
    kind: データセット
    メタデータ:
      名前: hadoop
    spec:
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
              -キー: alibabacloud.com/nodepool-id
                operator: In
                values:
                  -npxxxxxxxxxxxxxx
      mounts:
        -mountPoint: oss://<oss_bucket>/<bucket_dir>
          options:
            fs.oss.endpoint: <oss_endpoint>
          名前: hadoop
          パス: "/"
          encryptOptions:
            -名前: fs.oss.accessKeyId
              valueFrom:
                secretKeyRef:
                  名前: mysecret
                  キー: fs.oss.accessKeyId
            -名前: fs.oss.accessKeySecret
              valueFrom:
                secretKeyRef:
                  名前: mysecret
                  キー: fs.oss.accessKeySecret
    ---
    apiVersion: data.fluid.io/v1alpha 1
    kind: JindoRuntime
    メタデータ:
      名前: hadoop
    spec:
      nodeSelector:
        alibabacloud.com/nodepool-id: npxxxxxxxxxxxx
      レプリカ:2
      tieredstore:
        レベル:
          -mediumtype: MEM
            パス: /dev/shm
            volumeType: emptyDir
            クォータ: 2Gi
            high: "0.99"
            low: "0.95" 
    説明
    • ACK Edgeクラスターでは、nodeAffinityフィールドとnodeSelectorフィールドを使用してデータセットとJindoRuntimeを同じノードプールにデプロイし、ノードプール内のネットワーク接続を確保する必要があります。

    • エッジノード管理とOSSアクセスの両方でクラウドにアクセスするにはクラウドエッジネットワークが必要なため、管理チャネルの安定性を確保するために十分なネットワーク帯域幅を確保することを推奨します。

    次の表に、YAMLテンプレートのパラメーターを示します。

    パラメーター

    説明

    mountPoint

    oss://<oss_bucket>/<bucket_dir> は、マウントされるUFSへのパスを指定します。 このパスは、ファイルではなくディレクトリを指す必要があります。 パスにエンドポイントは必要ありません。

    fs.oss.endpoint

    OSSバケットのパブリックエンドポイントまたはプライベートエンドポイント。 詳細については、「リージョン、エンドポイント、オープンポート」をご参照ください。

    レプリカ

    JindoFSクラスター内のワーカーの数。

    mediumtype

    キャッシュタイプ。 このパラメーターは、JindoRuntimeテンプレートを作成するときに使用するキャッシュタイプを指定します。 有効な値: HDD、SDD、およびMEM。

    パス

    ストレージパス。 指定できるパスは1つだけです。 mediumtypeをMEMに設定した場合、ログなどのデータを保存するためのローカルパスを指定する必要があります。

    クォータ

    キャッシュされたデータの最大サイズ。 (単位:GB)

    高い

    ストレージ容量の上限。

    低い

    ストレージ容量の下限。

  4. 次のコマンドを実行して、データセットとJindoRuntimeを作成します。

    kubectl create -f resource.yaml
  5. 次のコマンドを実行して、データセットがデプロイされているかどうかを確認します。

    kubectl getデータセットhadoop

    期待される出力:

    名UFS合計サイズキャッシュキャッシュ容量キャッシュパーセント位相年齢
    hadoop 210MiB 0.00B 4.00GiB 0.0% バウンド1h 
  6. 次のコマンドを実行して、JindoRuntimeがデプロイされているかどうかを確認します。

    kubectl get jindoruntime hadoop

    期待される出力:

    名マスターフェーズ作業者フェーズヒューズフェーズ年齢
    hadoopレディレディ4m4 5s 
  7. 次のコマンドを実行して、永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されているかどうかを確認します。

    kubectl get pv,pvc

    期待される出力:

    が容量アクセスモードに名前を付けると、ポリシーステータスはSTORAGECLASSの理由年齢を主張します
    persistentvolume/hadoop 100Gi RWXバインド済みのデフォルト /hadoop 52m
    
    名前ステータスボリューム容量アクセスモードSTORAGECLASS年齢
    persistentvolumeclaim/hadoopバインドされたhadoop 100Gi RWX 52m 

上記の出力は、データセットとJindoRuntimeが作成されたことを示しています。

手順3: データアクセスの高速化をテストするためのアプリケーションコンテナの作成

アプリケーションをコンテナにデプロイして、JindoFSのデータアクセラレーションをテストできます。 機械学習ジョブを送信して、関連する機能を使用することもできます。 このトピックでは、同じデータへのアクセスをテストするために、アプリケーションをコンテナーにデプロイします。 テストは、時間消費を比較するために複数回実行される。

  1. app.yamlという名前のファイルを作成し、次のYAMLテンプレートをファイルにコピーします。

    apiVersion: v1
    種類: ポッド
    メタデータ:
      名前: demo-app
    spec:
      nodeSelector:
        alibabacloud.com/nodepool-id: npxxxxxxxxxxx
      コンテナ:
        -name: デモ
          画像: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          volumeMounts:
            -mountPath: /データ
              名前: hadoop
      volumes:
        -name: hadoop
          persistentVolumeClaim:
            claimName: hadoop 
    説明

    ACK Edgeクラスターでは、nodeSelectorフィールドを使用して、手順2で指定したノードプールにテストポッドをデプロイする必要があります。

  2. 次のコマンドを実行して、アプリケーションをデプロイします。

    kubectl create -f app.yaml
  3. 次のコマンドを実行して、指定したファイルのサイズを照会します。

    kubectl exec -it demo-app -- bash
    du -sh /データ /spark-3.0.1-bin-hadoop2.7.tgz 

    期待される出力:

    210M /データ /spark-3.0.1-bin-hadoop2.7.tgz
  4. 次のコマンドを実行して、ファイルのコピーにかかる時間を照会します。

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

    期待される出力:

    リアル0m18.386s
    ユーザー0m0.002s
    sys 0m0.105s 

    出力は、ファイルのコピーに18秒かかることを示します。

  5. 次のコマンドを実行して、データセットのキャッシュデータを確認します。

    kubectl getデータセットhadoop

    期待される出力:

    名UFS合計サイズキャッシュキャッシュ容量キャッシュパーセント位相年齢
    hadoop 210.00MiB 210.00MiB 4.00GiB 100.0% バウンド1h 

    出力は、データの210のMiBがオンプレミスストレージにキャッシュされていることを示します。

  6. 次のコマンドを実行して、現在のアプリケーションを削除し、同じアプリケーションを作成します。

    説明

    このステップは、ページキャッシュなどの他の要因が結果に影響を与えることを回避するために実行される。

    kubectl delete -f app.yaml && kubectl create -f app.yaml
  7. 次のコマンドを実行して、ファイルのコピーにかかる時間を照会します。

    kubectl exec -it demo-app -- bash
    時間cp /データ /spark-3.0.1-bin-hadoop2.7.tgz /dev/null 

    期待される出力:

    リアル0m0.048s
    ユーザー0m0.001s
    sys 0m0.046s 

    出力は、ファイルのコピーに48ミリ秒かかり、300倍以上の短縮が必要であることを示しています。

    説明

    これは、ファイルがJindoFSによってキャッシュされているためです。

環境をクリアする

データアクセラレーションを使用しなくなった場合は、環境をクリアします。

次のコマンドを実行して、アプリケーションを削除します。

kubectl delete pod demo-app

次のコマンドを実行して、データセットとJindoRuntimeを削除します。

kubectl deleteデータセットhadoop