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

Container Service for Kubernetes:Fluid のキャッシュ最適化ポリシーのベストプラクティス

最終更新日:Apr 11, 2025

コンピューティングとストレージが分離されたアーキテクチャを使用する Kubernetes クラスタでは、Fluid のキャッシング機能を使用して、ストレージシステムへのアクセス時のアクセスレイテンシを効果的に削減し、帯域幅の調整を解消できます。これは、クラスタのデータ処理効率の向上に役立ちます。このトピックでは、Fluid のキャッシュ最適化ポリシーを使用して、データアクセスのパフォーマンス、安定性、および読み取り/書き込み整合性を向上させる方法について説明します。

ユースケース

データキャッシング技術は、局所性の原理に基づいてデータアクセスを高速化します。AI 学習、推論サービスの起動、ビッグデータ分析などのシナリオでは、データに頻繁にアクセスします。例:

  • AI 学習シナリオでは、学習データセットがモデルの反復のために定期的に読み取られます。

  • 推論サービスを開始すると、複数の推論サービスインスタンスが同じモードファイルを GPU メモリに同時にロードします。

  • ビッグデータ分析シナリオでは、SparkSQL などのツールを使用してユーザープロファイルと製品情報を分析する場合、注文データは複数の分析タスクで使用されます。

上記のシナリオでは、Fluid のキャッシュ最適化ポリシーを使用してデータ処理効率を向上させることができます。

パフォーマンス向上のためのキャッシュ最適化ポリシー

Fluid を使用してデータアクセスを高速化する場合、ビジネス要件と予算に基づいて、Elastic Compute Service (ECS) インスタンスタイプ、キャッシュメディア、キャッシュシステムパラメータ、およびキャッシュ管理ポリシーを構成できます。さらに、クライアントのアクセスモードを考慮する必要があります。これはデータ読み取りのパフォーマンスに影響を与える可能性があります。このセクションでは、パフォーマンス向上のためのキャッシュ最適化ポリシーを構成する方法について説明します。

ポリシー 1: 適切な ECS インスタンスタイプを選択する

パフォーマンスの見積もり

分散キャッシュシステムは、異なるノードのストレージリソースと帯域幅リソースを集約し、上位層アプリケーションにより大きなキャッシュ容量とより高い帯域幅を提供できます。キャッシュシステムのキャッシュ容量、キャッシュ帯域幅、およびポッドの最大帯域幅は、次の式に基づいて計算できます。

  • キャッシュシステムのキャッシュ容量 = 各キャッシュシステムワーカーポッドのキャッシュ容量 × キャッシュシステムワーカーポッドの数

  • キャッシュ帯域幅 = キャッシュシステムワーカーポッドの数 × min{ワーカーポッドの ECS 最大帯域幅、ワーカーポッドで使用されるキャッシュメディアの I/O スループット} キャッシュ帯域幅は、キャッシュアクセスのための実際の帯域幅と同じではありません。実際の帯域幅は、クライアント ECS インスタンスの帯域幅と、シーケンシャルリードまたはランダムリードなどのアクセスモードによって異なります。

  • ポッドの最大帯域幅 = min{ホスティング ECS インスタンスの帯域幅、キャッシュ帯域幅} 複数のポッドが同時にキャッシュにアクセスする場合、キャッシュ帯域幅はポッド間で共有されます。

ecs.g7nex.8xlarge タイプの 2 つの ECS インスタンスが Container Service for Kubernetes (ACK) クラスタに追加され、分散キャッシュシステムが構築されるとします。キャッシュシステムは、それぞれ 100 GiB のメモリキャッシュを提供する 2 つのワーカーポッドで構成されています。ポッドは異なる ECS インスタンスで実行されます。アプリケーションポッドは、ecs.gn7i-c8g1.2xlarge タイプの ECS インスタンスにデプロイされます。インスタンスは、8 vCPU、30 GiB のメモリ、および 16 Gbit/s の帯域幅を提供します。キャッシュシステムのキャッシュ容量、キャッシュ帯域幅、およびポッドの最大帯域幅は、次の式に基づいて計算できます。

  • キャッシュシステムのキャッシュ容量 = 100 GiB × 2 = 200 GiB

  • キャッシュ帯域幅 = 2 × min{40 Gbit/s, メモリ I/O スループット} = 80 Gbit/s

  • キャッシュヒットが発生した場合のポッドの最大帯域幅 = min{80 Gbit/s, 16 Gbit/s} = 16 Gbit/s

推奨される ECS インスタンスタイプ

分散キャッシュクラスタの帯域幅は、クラスタ内の ECS インスタンスの最大帯域幅と、クラスタで使用されるキャッシュメディアによって異なります。分散キャッシュシステムのパフォーマンスを向上させるには、高帯域幅を提供する ECS インスタンスを選択し、メモリ、ローカルハードディスクドライブ (HDD)、およびローカル SSD をキャッシュメディアとして使用することをお勧めします。次の ECS インスタンスタイプを選択することをお勧めします。

インスタンスファミリー

インスタンスタイプ

インスタンス仕様

g7nex、ネットワーク拡張型汎用インスタンスファミリー

ecs.g7nex.8xlarge

32 vCPU、128 GiB メモリ、40 Gbit/s 帯域幅

ecs.g7nex.16xlarge

64 vCPU、256 GiB メモリ、80 Gbit/s 帯域幅

ecs.g7nex.32xlarge

128 vCPU、512 GiB メモリ、160 Gbit/s 帯域幅

i4g、ローカル SSD 搭載インスタンスファミリー

ecs.i4g.16xlarge

64 vCPU、256 GiB メモリ、1,920 GB のローカル SSD 2 基、32 Gbit/s 帯域幅

ecs.i4g.32xlarge

128 vCPU、512 GiB メモリ、1,920 GB のローカル SSD 4 基、64 Gbit/s 帯域幅

g7ne、ネットワーク拡張型汎用インスタンスファミリー

ecs.g7ne.8xlarge

32 vCPU、128 GiB メモリ、25 Gbit/s 帯域幅

ecs.g7ne.12xlarge

48 vCPU、192 GiB メモリ、40 Gbit/s 帯域幅

ecs.g7ne.24xlarge

96 vCPU、384 GiB メモリ、80 Gbit/s 帯域幅

g8i、汎用インスタンスファミリー

ecs.g8i.24xlarge

96 vCPU、384 GiB メモリ、50 Gbit/s 帯域幅

ecs.g8i.16xlarge

64 vCPU、256 GiB メモリ、32 Gbit/s 帯域幅

ECS インスタンスファミリーの詳細については、「インスタンスファミリーの概要」をご参照ください。

ポリシー 2: 適切なキャッシュメディアを選択する

分散キャッシュクラスタの帯域幅は、クラスタ内の ECS インスタンスの最大帯域幅と、クラスタで使用されるキャッシュメディアによって異なります。分散キャッシュシステムのパフォーマンスを向上させるには、高帯域幅を提供する ECS インスタンスを選択し、メモリまたはローカル SSD をキャッシュメディアとして使用することをお勧めします。Fluid では、キャッシュランタイムの spec.tieredstore パラメータを使用して、異なるキャッシュメディアと対応するキャッシュ容量を構成できます。

説明

ほとんどの場合、エンタープライズ SSD (ESSD) は、データアクセスのためのデータ集約型アプリケーションの要件を満たしていません。たとえば、パフォーマンスレベル (PL) 2 のディスクは、最大 750 MB/s のスループットを提供します。PL2 の ESSD を ECS インスタンスに接続してデータをキャッシュする場合、インスタンスタイプが 750 MB/s よりも高い帯域幅を提供していても、ECS インスタンスの最大帯域幅は 750 MB/s です。

メモリを使用してデータをキャッシュする

メモリを使用してデータをキャッシュする場合は、次のコードブロックに基づいてキャッシュランタイムの spec.tieredstore パラメータを構成します。

spec:
  tieredstore:
    levels:
      - mediumtype: MEM
        volumeType: emptyDir
        path: /dev/shm
        quota: 30Gi # 分散キャッシュシステムの各ワーカーポッドによって提供されるキャッシュ容量。
        high: "0.99"
        low: "0.95"

ローカルディスクを使用してデータをキャッシュする

  • ローカルシステムディスクを使用してデータをキャッシュする場合は、次のコードブロックに基づいてキャッシュランタイムの spec.tieredstore パラメータを構成します。

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: emptyDir # emptyDir を使用して、キャッシュデータのライフサイクルを分散キャッシュシステムのワーカーポッドと一致させます。これにより、残留キャッシュデータが防止されます。
            path: /var/lib/fluid/cache
            quota: 100Gi # 分散キャッシュシステムの各ワーカーポッドによって提供されるキャッシュ容量。
            high: "0.99"
            low: "0.95
  • 接続された SSD を使用してデータをキャッシュする場合は、次のコードブロックに基づいてキャッシュランタイムの spec.tieredstore パラメータを構成します。

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: hostPath
            path: /mnt/disk1 # /mnt/disk1 は、ホスト上のローカル SSD のパスです。
            quota: 100Gi # 分散キャッシュシステムの各ワーカーポッドによって提供されるキャッシュ容量。
            high: "0.99"
            low: "0.95"
  • 複数の SSD を使用してデータをキャッシュする場合は、次のコードブロックに基づいて spec.tieredstore パラメータを構成します。

    spec:
      tieredstore:
        levels:
          - mediumtype: SSD
            volumeType: hostPath
            path: /mnt/disk1,/mnt/disk2 # /mnt/disk1 と /mnt/disk2 は、ホスト上のデータディスクのパスです。
            quota: 100Gi # 分散キャッシュシステムの各ワーカーポッドによって提供されるキャッシュ容量。キャッシュ容量は複数のパスに均等に分散されます。たとえば、/mnt/disk1 と mnt/disk2 にはそれぞれ 50Gi の容量が割り当てられます。
            high: "0.99"
            low: "0.95"

ポリシー 3: キャッシュアフィニティに基づいてポッドをスケジュールする

キャッシュヒットが発生すると、アプリケーションポッドはキャッシュシステムからデータを読み取ります。この場合、ポッドとキャッシュシステムが異なるゾーンにデプロイされていると、ポッドはゾーン間でキャッシュにアクセスする必要があります。ゾーン間のアクセス中にネットワークジッターが発生する可能性があります。ネットワークジッターを回避するには、アプリケーションポッドとキャッシュシステムポッドの間にアフィニティルールを構成できます。詳細:

  • アフィニティルールを構成して、キャッシュシステムのワーカーポッドを同じゾーンにデプロイします。

  • アフィニティルールを構成して、キャッシュシステムのワーカーポッドがデプロイされているゾーンにアプリケーションポッドをデプロイします。

重要

複数のアプリケーションポッドとキャッシュシステムのワーカーポッドを単一のゾーンにデプロイすると、アプリケーションのディザスタリカバリ機能が低下する可能性があります。サービスのパフォーマンスとサービスの可用性を、サービスレベル契約 (SLA) に基づいて調整することをお勧めします。

Fluid では、データセットの spec.nodeAffinity パラメータを使用して、キャッシュシステムのワーカーポッドのアフィニティルールを指定できます。サンプルコード:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
                - <ZONE_ID> # キャッシュシステムのワーカーポッドをデプロイするゾーンの ID。例: cn-beijing-i.

上記のコードブロックを使用して、指定されたゾーン (ゾーン ID: <ZONE_ID>) 内の ECS インスタンスにキャッシュシステムのワーカーポッドをスケジュールできます。

さらに、Fluid はキャッシュアフィニティルールをアプリケーションポッドの仕様に自動的に挿入します。アフィニティルールに基づいて、システムはアプリケーションポッドをキャッシュシステムのワーカーポッドがデプロイされているゾーンにスケジュールしようとします。詳細については、「キャッシュアフィニティに基づいてポッドをスケジュールする」をご参照ください。

ポリシー 4: 大容量ファイルのフルシーケンシャルリードのためにキャッシュシステムパラメータを最適化する

大容量ファイルのフルデータシーケンシャルリードは、データ集約型シナリオで使用されます。たとえば、TFRecord または TAR 形式のデータセットを使用してモデルを学習する場合、推論サービスの起動中に 1 つ以上のモデルファイルをロードする場合、または Parquet ファイルからデータを読み取って分散データ分析を実装する場合に、大容量ファイルのフルデータシーケンシャルリードが必要になります。上記のシナリオでは、プリフェッチを有効にしてデータアクセスを高速化できます。たとえば、プリフェッチの同時実行性とプリフェッチデータのサイズを増やすことができます。

プリフェッチの構成に使用できるパラメータは、Fluid で使用するキャッシュランタイムによって異なります。

JindoRuntime

JindoRuntime を使用する場合、spec.fuse.properties パラメータを構成して、Jindo Fuse の動作とパフォーマンスをカスタマイズできます。

kind: JindoRuntime
metadata:
  ...
spec:
  fuse:
    properties:
      fs.oss.download.thread.concurrency: "200"
      fs.oss.read.buffer.size: "8388608"
      fs.oss.read.readahead.max.buffer.count: "200"
      fs.oss.read.sequence.ambiguity.range: "2147483647" # 約 2G。
  • fs.oss.download.thread.concurrency: Jindo クライアントがデータをプリフェッチするために作成する同時実行スレッドの数。各スレッドによってプリフェッチされたデータはバッファに格納されます。

  • fs.oss.read.buffer.size: バッファサイズ。

  • fs.oss.read.readahead.max.buffer.count: 1 つのプリフェッチスレッドのバッファの最大数。

  • fs.oss.read.sequence.ambiguity.range: Jindo クライアントがプロセスがシーケンシャルリードを実行するかどうかを判断する基準となる範囲。

JuiceFSRuntime

JuiceFSRuntime を使用する場合、spec.fuse.options パラメータを使用して FUSE コンポーネントを構成し、spec.worker.options パラメータを使用してワーカーコンポーネントを構成できます。

kind: JuiceFSRuntime
metadata:
  ...
spec:
  fuse:
    options:
      buffer-size: "2048"
      cache-size: "0"
      max-uploads: "150"
  worker:
    options:
      buffer-size: "2048"
      max-downloads: "200"
      max-uploads: "150"
  master:
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 8Gi
  ...
  • buffer-size: 読み取り/書き込みバッファのサイズ。

  • max-downloads: プリフェッチプロセスにおけるダウンロードの同時実行性。

  • fuse cache-size: JuiceFS FUSE コンポーネントが使用できるローカルキャッシュのサイズ。

たとえば、JuiceFS FUSE コンポーネントが使用できるローカルキャッシュのサイズを 0 に設定し、FUSE コンポーネントのメモリ要求 (requests パラメータ) を 2 GiB などの小さい値に設定できます。この場合、FUSE コンポーネントは、ノード上の Linux カーネルによって提供されるページキャッシュを自動的に使用します。ページキャッシュヒットが発生しない場合は、JuiceFS ワーカー分散キャッシュを使用してデータアクセスを高速化します。パフォーマンスと関連パラメータの最適化方法の詳細については、「JuiceFS 公式ドキュメント」をご参照ください。

安定性向上のためのキャッシュ最適化ポリシー

Fluid キャッシュシステムの長期的な安定性を確保するために、多数のファイルを格納するディレクトリをキャッシュシステムにマウントしないことをお勧めします。これにより、キャッシュシステムが過負荷になるのを防ぎます。また、ESSD などの永続ストレージを使用してメタデータを永続化し、キャッシュシステムのディザスタリカバリ機能を強化することをお勧めします。さらに、FUSE ポッドに適切にリソースを割り当て、自動修復機能を有効にして、キャッシュシステムがエラーに自動的に対応できるようにすることをお勧めします。このセクションでは、安定性向上のためのキャッシュ最適化ポリシーを構成する方法について説明します。

ポリシー 1: 大規模なディレクトリを基盤となるデータソースにマウントしない

キャッシュシステムは、キャッシュシステムにマウントされたディレクトリ内のすべてのファイルのメタデータを保持し、キャッシュステータスなど、ファイルに関する追加情報を記録します。大規模なストレージシステムのルートディレクトリなど、大規模なディレクトリがキャッシュシステムにマウントされている場合、キャッシュシステムはマウントされたディレクトリ内のファイルのメタデータを格納するために大量のメモリリソースを消費し、メタデータへのアクセスを処理するために追加の CPU リソースを消費します。

Fluid はデータセットの概念を定義します。データセットは、上位層アプリケーション向けの論理的に関連するデータのコレクションです。データセットは、分散キャッシュシステムに対応します。データ集約型アプリケーションまたは関連タスクのデータアクセスを高速化するには、個別のデータセットを使用することをお勧めします。複数のアプリケーションを実行する必要がある場合は、アプリケーションごとに個別のデータセットを作成し、基盤となるデータソースの異なるサブディレクトリを異なるデータセットにマウントすることをお勧めします。マウントされたサブディレクトリには、サブディレクトリがマウントされているアプリケーションに必要なデータが含まれています。これにより、異なるアプリケーションがマウントされたデータセットのキャッシュシステムを使用してデータにアクセスする場合のデータ分離が向上します。また、キャッシュシステムの安定性とパフォーマンスも確保されます。データセットの構成例:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  mounts:
  - mountPoint: oss://<BUCKET>/<PATH1>/<SUBPATH>/
    name: sub-bucket

複数のキャッシュシステムは、メンテナンスの複雑さを増大させる可能性があります。ビジネス要件に基づいて柔軟なキャッシュシステムアーキテクチャを選択できます。

  • 使用するデータセットのサイズが小さく、相互に強く依存しており、同じストレージシステムに格納されており、ファイル数が少ない場合は、1 つの Fluid データセットと 1 つの分散キャッシュシステムを作成することをお勧めします。

  • 使用するデータセットのサイズが大きく、多数のファイルが含まれている場合は、複数の Fluid データセットと複数の分散キャッシュシステムを作成することをお勧めします。1 つまたは複数の Fluid データセットをアプリケーションポッドにマウントできます。

  • 使用するデータセットが異なるユーザーの異なるストレージシステムに属しており、ユーザー間のデータ分離が必要な場合は、各ユーザーまたは関連するデータ処理ジョブに対して個別の短命の Fluid データセットを作成することをお勧めします。Kubernetes オペレーターを開発して、複数の Fluid データセットを管理できます。

ポリシー 2: メタデータを永続化してキャッシュシステムの安定性を向上させる

ほとんどの分散キャッシュシステムは、マスターワーカーアーキテクチャを採用しています。マスターポッドは、キャッシュシステムにマウントされたディレクトリ内のすべてのファイルのメタデータを保持し、ファイルのキャッシュステータスを記録する役割を担います。アプリケーションがこのようなキャッシュシステムを使用してファイルにアクセスする場合、アプリケーションはまずマスターポッドからファイルのメタデータを取得し、次にメタデータを使用して基盤となるストレージまたはキャッシュシステムのワーカーポッドからファイルを取得する必要があります。したがって、マスターポッドの安定性は、キャッシュシステムの高可用性にとって非常に重要です。

JindoRuntime を使用する場合、次の構成を使用してマスターポッドの可用性を向上させることができます。

apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: sd-dataset
spec:
  ...
  volumes:
    - name: meta-vol
      persistentVolumeClaim:
        claimName: demo-jindo-master-meta
  master:
    resources:
      requests:
        memory: 4Gi
      limits:
        memory: 8Gi
    volumeMounts:
      - name: meta-vol
        mountPath: /root/jindofs-meta
    properties:
      namespace.meta-dir: "/root/jindofs-meta"

上記の YAML ファイルは、demo-jindo-master-meta という名前の既存の永続ボリューム要求 (PVC) を使用します。これは、ESSD をボリュームとしてマウントするために使用されます。これは、マスターポッドによって保持されるメタデータが永続化され、ポッドとともに移行できることを意味します。詳細については、「JindoRuntime を使用して JindoFS マスターのストレージを永続化する」をご参照ください。

ポリシー 3: FUSE ポッドに適切にリソースを割り当てる

キャッシュシステムクライアントは FUSE ポッドで実行されます。FUSE ポッドは、FUSE ファイルシステムをホスト上のアプリケーションポッドの指定されたパスにマウントし、POSIX (Portable Operating System Interface) を使用してデータを公開します。これにより、アプリケーションコードを変更することなく、アプリケーションポッドからのデータアクセスを高速化できます。リモートストレージへのアクセスは、ローカルストレージへのアクセスと同じくらい高速です。FUSE ポッドは、アプリケーションとキャッシュシステム間のデータトンネルの維持を担当します。FUSE ポッドに適切にリソースを割り当てることをお勧めします。

Fluid では、キャッシュランタイムの spec.fuse.resources パラメータを使用して、FUSE ポッドにリソースを割り当てることができます。FUSE ポッドでメモリ不足 (OOM) エラーが発生した場合、FUSE ファイルシステムがアプリケーションポッドからアンマウントされる可能性があります。この問題を防ぐために、FUSE ポッドのメモリ制限を指定しないか、FUSE ポッドの高いメモリ制限を指定することをお勧めします。たとえば、メモリ制限を ECS インスタンスによって提供されるメモリ量に近い値に設定できます。

spec:
  fuse:
    resources:
      requests:
        memory: 8Gi
    # limits:
    #   memory: <ECS_ALLOCATABLE_MEMORY>

ポリシー 4: FUSE コンポーネントの自動修復を有効にしてクライアントの可用性を向上させる

FUSE ポッドは、アプリケーションとキャッシュシステム間のデータトンネルの維持を担当します。デフォルトでは、予期しない理由で FUSE ポッドがクラッシュした場合、FUSE ポッドが再起動して正常に実行されても、アプリケーションポッドは FUSE ファイルシステムを使用してデータにアクセスできなくなります。この問題を解決するには、アプリケーションポッドを再起動してデータアクセスを復元する必要があります。ポッドが再起動されると、FUSE ファイルシステムがポッドに再マウントされます。ただし、これはアプリケーションの可用性に影響を与える可能性があります。

Fluid は、FUSE の自動修復機能を提供します。この機能は、FUSE ポッドの再起動後、特定の期間内にアプリケーションポッドの FUSE ファイルシステムへのデータアクセスを自動的に復元できます。さらに、アプリケーションポッドを再起動する必要はありません。

重要

FUSE ポッドがクラッシュした場合、FUSE ポッドが再起動されるまで FUSE ファイルシステムにアクセスできません。したがって、アプリケーションがクラッシュするのを防ぐために、FUSE ポッドが再起動される前に I/O エラーを手動で処理する必要があります。成功するまで I/O 操作を再試行できます。

FUSE の自動修復機能を有効にする方法の詳細については、「FUSE の自動修復を有効にする方法」をご参照ください。FUSE の自動修復機能には一定の制限があります。したがって、オンラインノートブックやその他のインタラクティブなプログラミング環境を使用してアプリケーションを開発するインタラクティブなプログラム開発シナリオなど、適切なシナリオでのみこの機能を有効にすることをお勧めします。

キャッシュの読み取り/書き込み整合性のベストプラクティス

キャッシュシステムは、アプリケーションのデータアクセスを高速化します。ただし、キャッシュで読み取り/書き込み整合性の問題が発生する可能性があります。キャッシュの高い読み取り/書き込み整合性を確保する場合、データアクセスのパフォーマンスが低下するか、キャッシュシステムのメンテナンスコストが増加します。ビジネスシナリオに基づいて、適切なポリシーを選択してキャッシュの読み取り/書き込み整合性を向上させることをお勧めします。このセクションでは、さまざまなシナリオでキャッシュの読み取り/書き込み整合性を構成する方法について説明します。

シナリオ 1: バックエンドストレージのデータが読み取り専用で静的である

ユースケース: AI モデルを学習するたびに、モデルは静的データセットからデータを読み取り、反復的な学習ジョブを実行します。学習ジョブが完了すると、キャッシュされたデータは削除されます。

解決策: Fluid データセットを作成し、デフォルトのデータセット構成を使用するか、データセットを読み取り専用に明示的に設定します。

:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany がデフォルト値です。

accessModes: ["ReadOnlyMany"] 構成は、データセットを読み取り専用モードでマウントするために使用されます。これにより、学習中にデータセットが変更されるのを防ぎ、データ管理とキャッシュ最適化ポリシーを簡素化します。

シナリオ 2: バックエンドストレージのデータが読み取り専用であるが定期的に変更される

ユースケース: キャッシュシステムが Kubernetes クラスタにデプロイされ、ビジネスデータが毎日バックエンドストレージに収集されます。データ分析タスクは毎日早朝に実行され、増分ビジネスデータが分析および集計されます。集計されたデータはバックエンドストレージに直接書き込まれ、キャッシュされません。

解決策: Fluid データセットを作成し、デフォルトのデータセット構成を使用するか、データセットを読み取り専用に明示的に設定します。バックエンドストレージからデータを定期的にプリフェッチし、データの変更をバックエンドストレージに同期します。

:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany がデフォルト値です。
---
apiVersion: data.fluid.io/v1alpha1
kind: DataLoad
metadata:
  name: demo-dataset-warmup
spec:
  ...
  policy: Cron
  schedule: "0 0 * * *" # 毎日 00:00:00 (UTC + 08:00) にデータをプリフェッチします。
  loadMetadata: true # バックエンドストレージからデータをプリフェッチするときに、データの変更をバックエンドストレージに同期します。
  target:
  - path: /path/to/warmup # データをプリフェッチするバックエンドストレージ内のパス。
  • accessModes: ["ReadOnlyMany"] 構成は、データセットを読み取り専用モードでマウントするために使用されます。バックエンドストレージにのみデータを書き込むことができ、キャッシュにデータを書き込むことはできません。これにより、データの整合性と完全性が確保されます。

  • policy: Cron および schedule: "0 0 * * *" 構成は、毎日 00:00:00 (UTC + 08:00) にプリフェッチタスクを自動的に実行するために使用されます。さらに、loadMetadata: true 構成により、バックエンドストレージからデータをプリフェッチするときに、データの変更がバックエンドストレージに同期されます。

シナリオ 3: バックエンドストレージのデータが読み取り専用であるがビジネスイベントに基づいて変更される

ユースケース: モデル推論サービスでは、カスタム AI モデルを送信し、そのモデルを使用して推論タスクを実行できます。この場合、カスタムモデルはバックエンドストレージに直接書き込まれ、キャッシュされません。モデルを送信した後、モデルを使用して推論タスクを実行し、推論結果を表示できます。

解決策: Fluid データセットを作成し、デフォルトのデータセット構成を使用するか、データセットを読み取り専用に明示的に設定します。キャッシュランタイムの FUSE ポッドのメタデータのタイムアウト期間を小さい値に設定します。キャッシュシステムでサーバー側のメタデータのキャッシュを無効にします。

:

JindoRuntime のサンプルコードブロック:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: demo-dataset
spec:
  mounts:
    - mountPoint: <MOUNTPOINT>
      name: data
      path: /
      options:
        metaPolicy: ALWAYS # metaPolicy: ALWAYS を指定して、サーバー側のメタデータのキャッシュを無効にします。
 ---
 apiVersion: data.fluid.io/v1alpha1
kind: JindoRuntime
metadata:
  name: demo-dataset
spec:
  fuse:
    args:
      - -oauto_cache
      # メタデータのタイムアウト期間を 30 秒に設定します。 xxx_timeout=0 を指定すると、強力なデータ整合性が確保されます。ただし、データアクセス効率が大幅に低下します。
      - -oattr_timeout=30
      - -oentry_timeout=30
      - -onegative_timeout=30
      - -ometrics_port=0

metaPolicy: ALWAYS 構成は、サーバー側のメタデータのキャッシュを無効にするために使用されます。これにより、データにアクセスするたびにバックエンドストレージから最新のメタデータが取得されます。これは、強力なデータ整合性が必要なシナリオに適しています。

シナリオ 4: データの読み取りとデータの書き込みに異なるディレクトリを使用する

ユースケース: 大規模な分散 AI 学習シナリオでは、学習ジョブはディレクトリ A のデータセットからデータを読み取り、エポックが完了するたびにモデルチェックポイントをディレクトリ B に書き込みます。チェックポイントはサイズが大きい場合があります。この場合、キャッシュにデータを書き込んで書き込み効率を向上させることができます。

解決策: 書き込み専用の Fluid データセットと読み取り/書き込みの Fluid データセットを作成します。書き込み専用のデータセットをディレクトリ A に、読み取り/書き込みのデータセットをディレクトリ B にマウントします。これにより、読み取り/書き込み分離が実現します。

:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: train-samples
spec:
  ...
  # accessModes: ["ReadOnlyMany"] ReadOnlyMany がデフォルト値です。
---
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: model-ckpt
spec:
  ...
  accessModes: ["ReadWriteMany"] 

データセット構成で accessModes: ["ReadOnlyMany"] を指定することにより、train-samples データセットを読み取り専用に設定します。これにより、学習ジョブはディレクトリ A からデータを読み取ることしかできなくなり、データの書き込みによって発生する不整合の問題が解消されます。データセット構成で accessModes: ["ReadWriteMany"] を指定することにより、model-ckpt データセットを読み取り/書き込みとして設定します。これにより、エポックが完了するたびにモデルチェックポイントがディレクトリ B に書き込まれ、書き込み効率が向上します。

アプリケーションのサンプルコードブロック:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  containers:
  ...
    volumeMounts:
    - name: train-samples-vol
      mountPath: /data/A
    - name: model-ckpt-vol
      mountPath: /data/B
  volumes:
    - name: train-samples-vol
      persistentVolumeClaim:
        claimName: train-samples
    - name: model-ckpt-vol
      persistentVolumeClaim:
        claimName: model-ckpt

train-samples-vol ボリュームは /data/A パスにマウントされ、model-ckpt-vol ボリュームは /data/B パスにマウントされます。これにより、データセットとモデルチェックポイントが分離されます。

シナリオ 5: データの読み取りとデータの書き込みに同じディレクトリを使用する

ユースケース: オンライン Jupyter ノートブックまたは Visual Studio Code を使用してアプリケーションを開発するインタラクティブなプログラム開発シナリオでは、ワークスペースディレクトリを使用する必要があります。ワークスペースディレクトリには、データセットとコードが格納されます。ワークスペースディレクトリ内のファイルを追加、削除、または変更する必要がある場合がよくあります。

解決策: 読み取り/書き込みの Fluid データセットを作成し、POSIX と完全に互換性のあるバックエンドストレージを使用します。

:

apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
  name: myworkspace
spec:
  ...
  accessModes: ["ReadWriteMany"] 

accessModes: ["ReadWriteMany"] 構成は、複数のユーザーまたはプロセスが同じワークスペースディレクトリを読み書きできるようにするために使用されます。