Spark と Ray の使い分け

Databricks を使用すると、Ray 操作と Spark 操作を同じ実行環境で実行できます。 両方のエンジンを利用可能にすることで、ほぼすべてのタイプのPythonアプリケーションを配布するための強力なソリューションが提供されます。

一般に、Spark と Ray には、特定のタスクの種類に対して独自の利点があります。

Ray は、一連の独立したタスクを同時に実行する タスクの並列処理 に優れています。

Spark は データの並列処理 に優れています - 大規模なデータセットの各要素に同じ操作を適用します。

Spark を使用する場合

  • 大規模なデータ処理: 広範なデータ処理を含むほとんどのユースケースでは、テーブルの結合、フィルタリング、集計などのタスクが最適化されているため、Spark を強くお勧めします。

  • データの並列処理: Spark は、大規模なデータセットの各要素に同じ操作を適用するデータ並列処理に優れています。 ETL、アナリティクス レポート、特徴量エンジニアリング、データの前処理に最適です。

  • 機械学習: Spark の MLlib ライブラリと SparkML ライブラリは、大規模な機械学習アルゴリズムと統計モデリングに最適化されています。

レイを使用する場合

  • タスクの並列処理: Ray は、複数のタスクが同時に独立して実行されるタスクの並列処理用に設計されています。 これは、計算に重点を置いたタスクに特に効率的です。

  • 特定のワークロード: 強化学習、階層的な時系列予測、シミュレーション モデリング、ハイパーパラメータ検索、ディープラーニング トレーニング、ハイパフォーマンス コンピューティング (HPC) など、 Spark があまり最適化されていないワークロードには Ray を使用します。

Ray と Spark の両方を使用する場合

  • 共有モードの実行: Spark と同じ環境内で Ray クラスターを実行できるため、1 つのアプリケーションで両方のフレームワークを活用できます。 データ集約型のタスクには Spark を使用し、大量の計算が必要なステージには Ray に切り替えます。

  • 効率的なデータ取得: 場合によっては、Spark は効率的なデータ取得のためだけに使用でき、Ray は複雑な計算タスクを処理します。

ワークフロー アーキテクチャ パターン

次に、Spark パイプラインと Ray パイプラインを同じワークフローに統合するための推奨パターンを示します。

サブタスク内の ETL の分離

メインデータの抽出、変換、ロード(ETL)の部分を分離し、 Databricks ワークフロー内の独自のサブタスクに分離できます。 これにより、クラスタータイプを ETL ワークロードのタイプに一致させ、Ray と Spark 間のリソース共有の問題を回避できます。

Ray と Spark を 1 つのタスクに結合する

Ray と Spark を 1 つのタスクに結合するために、Databricks では次のいずれかのパターンをお勧めします。

  • データ処理用のSpark、計算用のRay

    Spark を使用して、入力および出力データ操作を管理します。 たとえば、 databricks.ray.data.from_spark を使用して、Spark から Ray Data にトレーニング データを渡すことができます。 出力モデルを MLflow に保存するか、データ セットを Unity Catalog テーブルに保存します。

  • Spark 関数内のレイ (詳細)

    UDF や構造化ストリーミング foreachBatch 操作などの Spark 関数内で Ray を実行します。

  • 並列 Spark と Ray 操作 (詳細)

    Spark 操作を Ray 関数と共に実行します。 たとえば、Spark を使用して Ray タスク内のデータをクエリしたり、Ray の実行中に出力データを書き込んだりします。

Ray と Spark を 1 つのタスクに結合する方法の詳細については、Databricks の「同じ環境で Ray と Spark を組み合わせる」を参照してください

RayとSparkを1つのタスクに組み合わせながらのリソース管理

タスクのスケジュール設定が原因でリソースの競合が発生することはまれですが、リソースの割り当てを構成して、両方のフレームワークで十分なメモリ、CPU、GPU の可用性を確保することで管理できます。

次の例は、Ray クラスターの起動時にセットアップ設定引数を使用して、Ray と Spark の間でリソースを分割する方法を示しています。 必要に応じて、クラスターのサイズまたは Ray ワーカーノードに割り当てられる CPU の数を調整して、競合を防ぎます。

from ray.util.spark import setup_ray_cluster, shutdown_ray_cluster

# For a Databricks cluster configured with autoscaling enabled,
# The minimum worker nodes of 4 and maximum of 6 nodes.
# 2 Spark-only nodes will launch when needed.
# The Ray cluster will have 4 nodes allocated for its use.
setup_ray_cluster(
  min_worker_nodes=4,
  max_worker_nodes=4,
)

# Pass any custom Ray configuration with ray.init
ray.init()

次のステップ

Spark と Ray を接続して、共有ワークロードのために Spark と Ray 間でデータを渡す方法について説明します。