Fluid は、オープンソースの Kubernetes ネイティブな分散データセットオーケストレーションおよびアクセラレーションエンジンです。ビッグデータや AI アプリケーションなど、クラウドネイティブシナリオにおけるデータ集約型アプリケーション向けに設計されています。エッジシナリオでは、Fluid のデータセットアクセラレーションエンジンにより、エッジノードが Object Storage Service (OSS) ファイルにアクセスする速度を大幅に向上させることができます。このトピックでは、ACK Edge クラスターで Fluid のデータ高速化機能を使用する方法について説明します。
前提条件
Kubernetes 1.18 以降を実行する ACK Edge クラスターが作成されていること。詳細については、「ACK Edge クラスターの作成」をご参照ください。
エッジノードプールが作成され、エッジノードが追加されていること。詳細については、「エッジノードプールの作成」および「エッジノードの追加」をご参照ください。
クラウドネイティブ AI スイートがインストールされ、ack-fluid コンポーネントがデプロイされていること。
重要オープンソースの Fluid がインストールされている場合は、ack-fluid コンポーネントをデプロイする前にアンインストールしてください。
クラウドネイティブ AI スイートがインストールされていない場合は、インストール中に [Fluid データ高速化] を選択します。詳細については、「AI Suite コンソールのデプロイ」をご参照ください。
クラウドネイティブ AI スイートがすでにインストールされている場合は、[ACK コンソール] の [クラウドネイティブ AI スイート] ページに移動し、[ack-fluid] をデプロイします。
kubectl クライアントが Kubernetes クラスターに接続されていること。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。
OSS が有効化されていること。詳細については、「OSS の有効化」をご参照ください。
ステップ 1:OSS バケットでのデータの準備
次のコマンドを実行して、ご利用の Elastic Compute Service (ECS) インスタンスにテストデータをダウンロードします。
wget https://archive.apache.org/dist/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgzダウンロードしたテストデータを Alibaba Cloud OSS のバケットにアップロードします。
重要以下の手順では、Alibaba Cloud Linux 3.2104 LTS 64 ビットを実行している ECS インスタンスから OSS にデータをアップロードする方法について説明します。他のオペレーティングシステムでの手順については、「ossutil コマンドリファレンス」および「ossutil」をご参照ください。
examplebucketという名前のバケットを作成します。次のコマンドを実行して、
examplebucketを作成します。ossutil mb oss://examplebucket次の出力は、
examplebucketが作成されたことを示します。0.668238(s) elapsed
ダウンロードしたテストデータを
examplebucketバケットにアップロードします。ossutil cp spark-3.0.1-bin-hadoop2.7.tgz oss://examplebucket
ステップ 2:Dataset と JindoRuntime の作成
データセットを作成する前に、ECS インスタンスのルートディレクトリに
mySecret.yamlという名前のファイルを作成します。apiVersion: v1 kind: Secret metadata: name: mysecret stringData: fs.oss.accessKeyId: xxx fs.oss.accessKeySecret: xxxfs.oss.accessKeyIdとfs.oss.accessKeySecretには、「ステップ 1」で OSS へのアクセスに使用したAccessKey IDとAccessKey Secretを指定します。次のコマンドを実行して Secret を作成します。Kubernetes は作成された Secret を暗号化し、保存された情報がプレーンテキストとして公開されるのを防ぎます。
kubectl create -f mySecret.yaml次のサンプル YAML を使用して、2つの部分からなる
resource.yamlという名前のファイルを作成します。リモートデータセットと基盤となるファイルシステム (UFS) を記述する Dataset を作成します。
キャッシュサービスを提供する JindoFS クラスターを起動するための JindoRuntime を作成します。
apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: hadoop spec: nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - npxxxxxxxxxxxxxx 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: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx replicas: 2 tieredstore: levels: - mediumtype: MEM path: /dev/shm volumeType: emptyDir quota: 2Gi high: "0.99" low: "0.95"説明ACK Edge クラスターでは、
nodeAffinityとnodeSelectorを使用して、Dataset と JindoRuntime を同じノードプールにデプロイする必要があります。これにより、ノードプール内のノード間のネットワーク接続が確保されます。エッジノードの管理と OSS へのアクセスの両方で、クラウドからエッジへのネットワーク接続が必要です。管理チャネルの安定性を確保するために、十分なネットワーク帯域幅を確保することを推奨します。
パラメーターの説明を次の表に示します。
パラメーター
説明
mountPoint
マウントする UFS のパス。フォーマットは
oss://<oss_bucket>/<bucket_dir>です。このパスは単一のファイルではなく、ディレクトリを指す必要があります。パスにエンドポイントは不要です。fs.oss.endpoint
OSS バケットのパブリックまたはプライベートエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。
replicas
JindoFS クラスター内のワーカー数。
mediumtype
キャッシュタイプ。このパラメーターは、JindoRuntime テンプレートを作成する際に使用するキャッシュタイプを指定します。有効な値は HDD、SDD、MEM です。
path
ストレージパス。パスは 1 つだけ指定できます。mediumtype を MEM に設定した場合は、ログなどのデータを保存するためのローカルパスを指定する必要があります。
quota
キャッシュデータの最大サイズ。単位:GB。
high
ストレージ容量の上限。
low
ストレージ容量の下限。
次のコマンドを実行して、データセットと JindoRuntime を作成します。
kubectl create -f resource.yaml次のコマンドを実行して、データセットがデプロイされているかを確認します。
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次のコマンドを実行して、JindoRuntime がデプロイされているかを確認します。
kubectl get jindoruntime hadoop想定される出力:
NAME MASTER PHASE WORKER PHASE FUSE PHASE AGE hadoop Ready Ready Ready 4m45s次のコマンドを実行して、永続ボリューム (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
上記の結果は、データセットと JindoRuntime が作成されたことを示します。
ステップ 3:アプリケーションコンテナーを作成して高速化効果をテスト
コンテナーにアプリケーションをデプロイして、JindoFS のデータ高速化をテストできます。また、機械学習ジョブを送信して関連機能を使用することもできます。このトピックでは、コンテナーにアプリケーションをデプロイして、同じデータへのアクセスをテストします。このテストでは、アクセス時間を比較することで JindoRuntime の高速化効果を示します。
次の内容で app.yaml という名前のファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: demo-app spec: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxx 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説明ACK Edge クラスターでは、
nodeSelectorを使用して、テスト Pod を「ステップ 2」で指定したノードプールにデプロイする必要があります。次のコマンドを実行して、アプリケーションをデプロイします。
kubectl create -f app.yaml次のコマンドを実行して、指定したファイルのサイズをクエリします。
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次のコマンドを実行して、ファイルのコピーにかかった時間をクエリします。
time cp /data/spark-3.0.1-bin-hadoop2.7.tgz /dev/null想定される出力:
real 0m18.386s user 0m0.002s sys 0m0.105s出力結果は、ファイルのコピーに 18 秒かかったことを示します。
次のコマンドを実行して、データセットのキャッシュデータを確認します。
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 のデータがローカルストレージにキャッシュされたことを示します。
次のコマンドを実行して、現在のアプリケーションを削除し、同じアプリケーションを再度作成します。
説明このステップは、ページキャッシュなどの他の要因が結果に影響するのを避けるために実行します。
kubectl delete -f app.yaml && kubectl create -f app.yaml次のコマンドを実行して、ファイルのコピーにかかった時間をクエリします。
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出力結果は、ファイルのコピーに 48 ミリ秒かかり、300 倍以上短縮されたことを示します。
説明これは、ファイルが JindoFS によってキャッシュされたためです。
(オプション) 環境のクリーンアップ
データ高速化を今後使用しない場合は、次のコマンドを実行して環境をクリーンアップできます。
次のコマンドを実行して、アプリケーションを削除します。
kubectl delete pod demo-app次のコマンドを実行して、データセットと JindoRuntime を削除します。
kubectl delete dataset hadoop