Apache Sparkは、大規模データ処理のためのオープンソースの統合分析エンジンである。暗黙的なデータ並列性とフォールトトレランスを備えたクラスタプログラミング用のインターフェースを提供する。2009年にカリフォルニア大学バークレー校のAMPLabで開発が開始され、2013年にSparkのコードベースはApacheソフトウェア財団に寄贈され、以降同財団が保守している。
Sparkのアーキテクチャの基盤は、耐障害性分散データセット(RDD)であり、これはクラスタのマシン群に分散されたデータ項目の読み取り専用マルチセットで、フォールトトレラントな方法で維持される。DataFrame APIはRDDの上に抽象化としてリリースされ、その後Dataset APIが続いた。Spark 1.xではRDDが主要なAPIであったが、Spark 2.x以降はDataset APIの使用が推奨されているものの、RDD APIは非推奨ではない。RDD技術は今もDataset APIの基盤となっている。
SparkとそのRDDは、分散プログラムに線形なデータフロー構造を強制するMapReduceクラスタコンピューティングパラダイムの限界への対応として、2012年に開発された。MapReduceプログラムはディスクから入力データを読み取り、データ全体に関数をマップし、結果をリデュースし、リデュース結果をディスクに保存する。SparkのRDDは分散プログラムのワーキングセットとして機能し、意図的に制限された分散共有メモリの形態を提供する。
Spark内部では、ワークフローは有向非巡回グラフ(DAG)として管理される。ノードはRDDを表し、エッジはRDDに対する操作を表す。Sparkは、ループ内でデータセットを複数回訪問する反復アルゴリズムと、反復的なデータベーススタイルのクエリなどの対話的または探索的データ分析の両方を容易にする。このようなアプリケーションのレイテンシは、Apache Hadoop MapReduce実装と比較して数桁削減できる。反復アルゴリズムには、機械学習システムのトレーニングアルゴリズムが含まれ、これがSpark開発の当初の動機となった。
Spark Core
Spark Coreはプロジェクト全体の基盤である。分散タスクのディスパッチ、スケジューリング、基本的なI/O機能を提供し、RDD抽象化を中心としたJava、Python、Scala、.NET、R用のアプリケーションプログラミングインターフェースを通じて公開される。Java APIは他のJVM言語や、JuliaなどJVMに接続できる一部の非JVM言語でも利用可能である。このインターフェースは関数型または高階モデルのプログラミングを反映している。ドライバプログラムは、関数をSparkに渡すことでRDD上でmap、filter、reduceなどの並列操作を呼び出し、Sparkはその関数の実行をクラスタ上で並列にスケジュールする。これらの操作や、joinなどの追加操作は、RDDを入力として受け取り、新しいRDDを生成する。RDDは不変であり、その操作は遅延評価される。フォールトトレランスは、各RDDのリネージ(それを生成した操作のシーケンス)を追跡することで達成され、データ損失が発生した場合に再構築できる。RDDには、Python、.NET、Java、またはScalaの任意の型のオブジェクトを含めることができる。
RDD指向の関数型スタイルに加えて、Sparkは2つの制限された共有変数の形態を提供する。ブロードキャスト変数は全ノードで必要な読み取り専用データを参照し、アキュムレータは命令型スタイルでリダクションをプログラムするために使用できる。
RDD中心の関数型プログラミングの典型的な例は、テキストファイルから単語頻度を計算し、最も一般的なものを出力するScalaプログラムである。各map、flatMap、reduceByKeyは、単一のデータ項目(または項目のペア)に対して単純な操作を実行する匿名関数を受け取り、それを適用してRDDを新しいRDDに変換する。
PySpark
PySparkはApache SparkのPython APIであり、2013年2月にリリースされたSpark 0.7で導入された。SparkアプリケーションをPythonで記述できるようにし、探索的分析用の対話型シェルを提供する。PySparkコードは標準のCPythonランタイムで実行され、NumPyやSciPyなどのネイティブPythonライブラリを呼び出すことができる。PythonユーザーコードとSparkのJVMベースのコア間の通信は、歴史的にPy4Jライブラリによって仲介されてきた。
PySparkは、Spark Core、Spark SQLとDataFrame API、Structured Streaming、MLlibなど、SparkのほとんどのコンポーネントへのPythonインターフェースを提供する。Spark 4.1以降はSpark Declarative Pipelines APIも公開している。pandas互換のAPI(pandas API on Sparkとして知られる)は、2021年10月にリリースされたApache Spark 3.2.0でPySparkに統合された。これは、Sparkエンジンに対して実行されるpandasデータ分析APIに相当するものを提供し、pandasスタイルのコードを分散データ上で実行できるようにする。このコンポーネントは、2019年にDatabricksがオープンソース化した別プロジェクトであるKoalasに由来し、その後PySparkに統合された。PySparkはまた、PySparkアプリケーションからSparkクラスタへのリモート接続を可能にするクライアントサーバーアーキテクチャであるSpark Connect用のクライアントも提供する。
典型的なPySparkプログラムは、SparkSessionを使用してデータをDataFrameとして読み込み、変換を適用する。
Spark SQL
Spark SQLはSpark Core上のコンポーネントであり、構造化データおよび半構造化データをサポートするDataFramesと呼ばれるデータ抽象化を導入した。Spark SQLは、Scala、Java、Python、または.NETでDataFramesを操作するためのドメイン固有言語(DSL)を提供する。また、コマンドラインインターフェースとODBC/JDBCサーバーを備えたSQL言語サポートも提供する。DataFramesはRDDが提供するコンパイル時の型チェックを欠いているが、Spark 2.0以降、強く型付けされたDatasetはSpark SQLでも完全にサポートされている。
Spark Declarative Pipelines
Spark Declarative Pipelines(SDP)は、抽出、変換、ロード(ETL)データパイプラインを定義および実行するための宣言型フレームワークであり、2025年12月16日にリリースされたApache Spark 4.1.0で追加された。開発者は、パイプラインが処理するデータセットと適用する変換を宣言し、エンジンが実行を最適化できるようにする。このフレームワークは、ボイラープレートコードを削減し、より良い最適化の機会を可能にすることで、パイプラインの開発と保守を簡素化することを目的としている。
クラスタ管理とストレージ
Sparkには、クラスタマネージャーと分散ストレージシステムが必要である。クラスタ管理には、SparkはスタンドアロンのネイティブSpark、Hadoop YARN、Apache Mesos、またはKubernetesをサポートする。スタンドアロンのネイティブSparkクラスタは、手動またはインストールパッケージが提供する起動スクリプトで起動できる。テスト用に単一マシンでデーモンを実行することも可能である。分散ストレージには、SparkはAlluxio、Hadoop分散ファイルシステム(HDFS)、MapRファイルシステム(MapR-FS)、Cassandra、OpenStack Swift、Amazon S3、Kudu、Lustreファイルシステム、またはカスタムソリューションなど、さまざまな分散システムと連携できる。Sparkはまた、疑似分散ローカルモードもサポートしており、これは通常開発またはテストのみに使用され、分散ストレージは不要でローカルファイルシステムを使用できる。このようなシナリオでは、SparkはCPUコアごとに1つのエグゼキュータを持つ単一マシンで実行される。
バッチとストリーミングの両方のワークロードを処理するSparkの能力は、インメモリ処理と豊富なAPIと相まって、金融からクラウドコンピューティングまで、さまざまな業界での大規模データ処理に人気のある選択肢となっている。ストリーミングデータ用のApache Kafkaやワークフローオーケストレーション用のApache Airflowとの統合は、現代のデータパイプラインでの有用性をさらに拡張している。