Apache Sparkとは、大規模データに対するバッチ処理・ストリーム処理・機械学習・グラフ処理を1つのエンジンでこなせる分散処理フレームワークです。2009年にUCバークレー校のAMPLabで生まれ、Hadoop MapReduceの後継として広まりました。「インメモリ処理による10〜100倍の高速化」「統一APIで多様な処理を扱える」「Python・Scala・Java・Rの4言語対応」という特徴で、現代のビッグデータ基盤のデファクトとなっています。本記事ではSparkのアーキテクチャ、4つの主要コンポーネント、実行環境の選択肢、DWHとの使い分けまでを整理します。
Apache Sparkとは何か
Apache Sparkは2009年にUCバークレー校のAMPLabで生まれ、2013年にApache Software Foundationに寄贈されたオープンソースの分散データ処理エンジンです。誕生当初の主要モチベーションは、Hadoop MapReduceの性能問題を解決することでした。MapReduceはMap/Reduceの各ステージ間でディスクI/Oが発生するため、反復処理が多いワークロード(機械学習等)で遅さが目立ちました。
Sparkは中間結果をメモリ上に保持する「インメモリ処理」を基本戦略に据え、反復処理で10〜100倍の高速化を実現しました。加えて、バッチ処理・ストリーム処理・機械学習・グラフ処理を統一APIで扱える「統合エンジン」であることが、MapReduceを置き換えるに至った決定打です。
Sparkのアーキテクチャ
Sparkのクラスタ構成は、Driver・Executor・Cluster Managerの3者で成り立ちます。Driverはアプリケーションのエントリーポイントで、ジョブのプランニングとタスクの分配を担います。Executorは各ワーカーノードで動き、実際のタスク(パーティション単位の処理)を実行します。Cluster ManagerはリソースAllocatorで、YARN・Kubernetes・Mesos・Spark Standaloneから選べます。
【Sparkクラスタ構成】
[Driver Program]
(SparkContext)
|
v
[Cluster Manager]
(YARN / K8s / Standalone)
| | |
v v v
[Exec1] [Exec2] [Exec3]
| | |
v v v
[Task] [Task] [Task]
パーティション単位で並列実行
※ Driver=指揮者、Executor=演奏者、Cluster Manager=リソース割当
Spark内部のデータ抽象は、RDD(Resilient Distributed Dataset)→ DataFrame → Datasetという順で進化してきました。現在の推奨APIはDataFrameとDatasetで、Catalystオプティマイザによるクエリ最適化とTungstenによるメモリ効率化の恩恵を受けられます。
DataFrameはSQLテーブルに似た列指向のデータ構造で、型安全性はやや緩い代わりに可読性が高いのが特徴です。DatasetはScalaやJavaで使える型安全版で、コンパイル時にスキーマを検査できます。Pythonユーザーには基本的にDataFrameが使われます。
Sparkの4つのコンポーネント
Sparkの強みは、4つのライブラリが同一エンジン上で統合されている点です。
1. Spark SQL:DataFrame APIとANSI SQLを使って構造化データを扱うコンポーネントです。ParquetやDelta Lakeとの相性が抜群で、ETL用途の第一候補になります。
2. Spark Streaming(Structured Streaming):マイクロバッチベースのストリーム処理を提供します。Kafkaからのイベントをほぼリアルタイムに処理するユースケースでよく使われます。
3. MLlib:分散機械学習ライブラリです。回帰・分類・クラスタリング・協調フィルタリングといった定番アルゴリズムを分散実装しており、大規模データでの学習に強みがあります。
4. GraphX / GraphFrames:グラフ処理ライブラリで、ソーシャルネットワーク分析やPageRank計算などに用いられます。近年の主流はGraphFramesです。
| コンポーネント | 概要 | 主なユースケース | 代表的な使用言語 |
|---|---|---|---|
| Spark SQL | 構造化データ処理 | ETL、DWH変換、BIクエリ | SQL/Python/Scala |
| Structured Streaming | ストリーム処理 | Kafka連携、リアルタイム集計 | Python/Scala |
| MLlib | 分散機械学習 | 大規模モデル学習、レコメンド | Python/Scala |
| GraphX/GraphFrames | グラフ処理 | SNS分析、PageRank | Scala/Python |
# PySparkでDataFrameの基本操作
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum as _sum
spark = SparkSession.builder.appName("sales_etl").getOrCreate()
df = spark.read.parquet("s3://my-bucket/orders/")
result = (df.filter(col("status") == "completed")
.groupBy("customer_id")
.agg(_sum("amount").alias("total_amount")))
result.write.format("delta").mode("overwrite").save("s3://my-bucket/customer_summary/")
Sparkの実行環境
Sparkの実行環境は、大きく4つの選択肢があります。
1. Databricks:Sparkの生みの親が作った商用プラットフォーム。運用体験とPhotonエンジンによる高速化が魅力です。エンタープライズの定番です。
2. AWS EMR:AmazonのマネージドSparkサービス。既存のAWS環境とシームレスに統合でき、S3・Glueカタログとの相性が良好です。
3. GCP Dataproc:GoogleのマネージドSparkサービス。BigQueryやCloud Storageとの統合が容易で、起動も非常に高速です。
4. セルフホスト:KubernetesやYARNの上に自前で構築する方法。自由度は最大ですが、運用負担も大きくなります。
| 実行環境 | コスト | 運用負荷 | スケーラビリティ |
|---|---|---|---|
| Databricks | 高(DBU+VM) | 最低 | 高 |
| AWS EMR | 中 | 中 | 高 |
| GCP Dataproc | 中 | 中 | 高 |
| セルフホスト(K8s) | 低〜中 | 高 | 設計次第で高 |
SparkとDWHの使い分け
「SparkとDWH(Snowflake/BigQuery等)のどちらを使うべきか」という問いはよく聞かれます。結論から言うと、両者は競合ではなく補完関係です。SparkはETL・機械学習・非構造化データ処理に強く、DWHはSQL分析・BI・構造化データへの低レイテンシクエリに強い、という住み分けが一般的です。
例えばSparkで生データから複雑な前処理を行ってDWHにロードし、以後の分析はDWH上でdbtやBIツールから利用する、という構成がよく採用されます。以下はSparkでのETLパイプラインの典型例です。
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, when
spark = SparkSession.builder.appName("customer_etl").getOrCreate()
raw = spark.read.json("s3://raw/events/")
cleaned = (raw
.filter(col("user_id").isNotNull())
.withColumn("is_premium", when(col("plan") == "pro", True).otherwise(False))
.select("user_id", "event_type", "is_premium", "timestamp"))
cleaned.write.mode("overwrite").parquet("s3://curated/events/")
逆に、SQLで表現できるシンプルな集計やBI用途ではSparkを立ち上げる必要がないので、DWH単体で完結させるのが効率的です。SparkとDWHは「どちらか」ではなく「何をどちらで行うか」で設計します。
Sparkの学習ロードマップ
Sparkを学ぶ順序の推奨は以下の通りです。まずDataFrame APIをPySparkで触り、基本的な変換・集計ができるようになる。次にSpark SQLを使ってSQLでの表現に慣れる。そこからパーティション・シャッフル・Broadcast Joinといったチューニングの基礎を学び、Structured Streamingで非同期処理を扱えるようになる、という順が効率的です。
MLlibは優先度を下げて、必要になった段階で触るのが現実的です。SparkそのものよりもDelta LakeやIcebergといったオープンテーブルフォーマットとの組み合わせを学ぶ方が、現代のデータエンジニアリングには役立ちます。
まとめ
本記事の要点を振り返ります。
- Sparkはインメモリ処理の分散データ処理エンジン
- Driver/Executor/Cluster Managerの3者構成
- Spark SQL・Structured Streaming・MLlib・GraphXの4コンポーネント
- 実行環境はDatabricks・EMR・Dataproc・セルフホストから選択
- DWHとは競合せず、ETLとML前処理で補完関係を築く
次に読むべき記事は、Databricks入門、オープンテーブルフォーマット比較、そしてレイクハウスの概念整理です。DE-STKではSparkを中心とした大規模データ処理基盤の設計・PoC支援を提供しています。既存のSpark環境のチューニング相談も歓迎します。
よくある質問(FAQ)
Q. SparkとHadoopの違いは何ですか?
A. Hadoopはディスクベース、Sparkはインメモリ処理が基本で、Sparkの方が10〜100倍高速です。現在ではSparkがHadoopのMapReduceをほぼ置き換えています。
Q. Sparkを使うにはクラスタが必要ですか?
A. ローカルモードで1台のPCでも実行可能です。本番環境ではDatabricks、AWS EMR、GCP Dataprocなどのマネージドサービスが推奨されます。
Q. SparkとDWH(BigQuery等)の使い分けは?
A. SQL中心の分析・BIにはDWH、大規模なETL処理やML/AIのデータ前処理にはSparkが適しています。