PR

Apache Sparkとは?大規模処理の基本をざっくり解説

Apache Spark クラウドニュース

「データを分析しよう」という話になると、データエンジニアから「Sparkで処理します」という言葉が出てくることがあります。

データ専門家ならまだしも、普段触れていないエンジニアからすると、

  • なんか聞いたことはあるけれど、何をするものなのかはよくわからない

そう感じることはないでしょうか?

特にデータ系の案件に初めて関わる場合、

  • Spark
  • RDD
  • DataFrame
  • ストリーミング

といった、聞きなれない言葉が飛び交うと、会話についていくのが大変です。

そこでこの記事では、データ処理の専門家でない方に向けて、Apache Sparkが何者で、なぜ使われているのか、どんな場面で登場するのかを順を追って説明していきたいと思います。

Apache Sparkが登場した背景 「大量データを速く処理する」という課題

そもそもなぜApache Sparkが必要なのか、背景から理解して全体像をつかんでみましょう。

2000年代後半、インターネットの普及とスマートフォンの登場によって、企業が扱うデータ量が爆発的に増えました。

  • ECサイトのアクセスログ
  • SNSの投稿データ
  • センサーから送られてくるIoTデータ

こうした「ビッグデータ」を分析することがビジネス上の競争力になっていきます。
当時はあちらこちらで、「ビッグデータ」という言葉が飛び交ってましたよね。

ところがいざ扱ってみようとすると、従来のデータベースやSQLツールでは、テラバイト(TB)〜ペタバイト(PB)規模のデータを現実的な時間で処理できません。

1台のサーバーに収まらない大きさのデータをどう処理するか、という問題が生まれました。

MapReduceとHadoop

この課題に最初に答えたのが、Googleが発表した「MapReduce」というアーキテクチャです。

処理を「Map(分割して並列実行)」と「Reduce(結果をまとめる)」の2ステップに分けることで、大量のデータを複数のサーバーに分散して処理するという考え方です。

このMapReduceをオープンソースで実装したのがHadoopで、しばらくの間ビッグデータ処理の標準として広く使われました。

しかしHadoop MapReduceには大きな弱点がありました。

処理が遅いのです。

理由は、処理の途中結果を毎回ディスクに書き込む設計になっていたからです。
ディスクへの読み書きはメモリ上の操作に比べて何十倍も時間がかかります。

複数のステップからなる処理(機械学習のトレーニングなど)では、この遅さが致命的になってしまいます。

この問題を解決するために2009年にUCバークレーで生まれたのが、今回のテーマであるApache Sparkです。

Apache Sparkとは何か メモリ上で処理するから速い

Apache SparkはHadoopと同じく複数のサーバーにデータを分散して処理する分散処理フレームワークですが、処理の途中結果をメモリ上に保持するという設計が最大の違いです。

ディスクとメモリ、どちらが速いかは言うまでもなく、メモリはディスクの100倍以上高速です。

Sparkは中間結果をメモリに置くことで、Hadoop MapReduceと比べて

  • バッチ処理で約10倍
  • 反復処理(機械学習のような同じデータを何度も処理する作業)では100倍近く速い

とされています。

もう少しわかりやすく例えると、Hadoop MapReduceは作業のたびに「結果をいったんロッカーにしまって、次のステップで取り出す」という動き方をします。

一方SparkはすべてをI手元の作業台に広げたまま次の工程に進みます。
作業台(メモリ)は広げたままにできるので、いちいちしまったり出したりする手間がなくなるわけです。

SparkはオープンソースプロジェクトとしてApache Software Foundationのもとで開発が続けられており、

  • Scala
  • Java
  • Python
  • R

と複数の言語から使えます。

データエンジニアに最も使われているのはPythonで、PythonからSparkを使うためのAPIはPySparkと呼ばれています。

RDD・DataFrame・Spark SQLの違い よく出てくる言葉を整理する

ここからは、Sparkの話をしているとよく出てくる「RDD」「DataFrame」「Spark SQL」という言葉を整理していきましょう。

RDD(Resilient Distributed Dataset)

RDDはSparkの最も基礎的なデータ構造で、「複数のサーバーに分散して保持されるデータのコレクション」です。
名前が難しそうですが、「分散したデータのかたまり」くらいのイメージで大丈夫です。

Resilient(弾力性がある)」というのは、あるサーバーが落ちてデータが失われても、元のデータから自動的に復元できる耐障害性を指しています。

分散処理では複数台のサーバーを使うため、一部が故障することを前提に設計する必要があります。

ただ、現在はRDDを直接使うケースは減っており、より使いやすいDataFrameが主流です。

DataFrame(データフレーム)

DataFrameはExcelの表のように「列名がついた行と列のデータ」を分散処理できる形式です。

PandasのDataFrameを使ったことがある方には馴染みやすい概念かもしれません。

DataFrameはRDDより高水準なAPIで、Sparkのオプティマイザ(処理を自動最適化する仕組み)の恩恵を受けられるため、多くの場合DataFrameを使う方が速く、書きやすいと言われています。

Spark SQL

Spark SQLは、SparkのDataFrameに対してSQLで問い合わせができる機能です。

データエンジニアでなくSQLに慣れたデータアナリストでも、SELECT文を書くだけでSparkが管理する大規模データを操作できます。

たとえば「売上テーブルをユーザーIDでグループ化して合計金額を出す」という処理は、通常のSQLとまったく同じ構文で書けます。

裏側では分散処理が走っていますが、書く側は意識しなくてよいのです。
学習コストが低いのは大きなメリットですね。

Sparkでできる3種類の処理 バッチ・ストリーミング・機械学習

Sparkが対応しているワークロードは大きく3種類あります。

バッチ処理

あらかじめ蓄積されたデータをまとめて一括処理するバッチ処理です。

  • 前日分の全ログを夜中に集計してレポートを作る
  • 月次でデータを変換してDWH(データウェアハウス)に投入する

といった定期処理が典型例です。

Sparkの最も基本的な使い方で、大量データの集計・変換・集約を高速にこなします。

ストリーミング処理(Structured Streaming)

リアルタイムで流れてくるデータを、到着した順に継続的に処理します。

  • 決済トランザクションを受け取るたびに不正検知を実行する
  • センサーからのデータをリアルタイムで集計してダッシュボードに表示する

といった用途です。

SparkのStructured Streamingという機能がこれを担います。
バッチ処理と同じDataFrame APIを使えるため、バッチ処理からストリーミング処理への移行や、両者のコード共有がしやすい設計になっています。

機械学習(MLlib)

SparkにはMLlibという機械学習ライブラリが内包されています。

分類・回帰・クラスタリング・協調フィルタリング(レコメンデーション)などのアルゴリズムが揃っており、大規模データに対して分散処理でモデルのトレーニングができます。

機械学習は同じデータを何度も繰り返し処理する計算が多いため、中間結果をメモリに保持できるSparkは特に向いています。

前処理(データクレンジング・特徴量エンジニアリング)からモデルのトレーニングまでを一つのSparkジョブ内で完結させる構成もよく取られます。

AWSでApache Sparkを使う方法 EMRとEMR Serverless

Sparkを自前のサーバーで動かすこともできますが、クラスターの構築・管理・スケーリングといったインフラ作業は結構大変です。

AWSには、インフラ管理の多くをお任せでSparkジョブを実行する方法が2つあります。

Amazon EMR

Amazon EMR(Elastic MapReduce)は、SparkやHiveなどをAWS上で動かすためのマネージドサービスです。

クラスターの構築・設定・パッチ適用といった作業をAWSが引き受けてくれます。
クラスターのサイズ(インスタンスタイプ・台数)は自分で設定します。

「どのインスタンスをどれだけ使うか」を自分でコントロールしたい、コスト最適化を細かく行いたいという場面に向いています。

Amazon EMR Serverless

EMR Serverlessは、クラスターの設定・スケーリング・管理をすべてAWSに任せられるサーバーレス版です。
「SparkジョブのコードをSubmitしたらAWSが勝手にリソースを用意して実行してくれる」という使い方ができます。

使った分だけの従量課金で、ジョブが動いていない間はコストがかかりません。

  • Sparkを使いたいけれどクラスター管理はしたくない
  • 定期バッチだけ走ればよい

というチームに向いてそうですね。

2026年5月には新たに6リージョンが追加されており、アジア太平洋地域でも使いやすくなっています。

Spark案件に関わるときに押さえておきたいポイント

データエンジニアとしてではなく、プロジェクトの別の役割でSpark案件に関わる場合、以下のポイントを押さえておくと会話についていきやすくなるかもしれません。

ジョブという単位

Sparkでは処理の一単位を「ジョブ」と呼びます。

「このジョブの実行時間が長い」「ジョブが失敗した」という形で会話に出てきます。
1つのジョブは複数の「ステージ」に分かれ、さらに「タスク」という単位で各サーバーに分散して実行されます。

パーティションはデータの分割単位

Sparkはデータを「パーティション」という塊に分けて複数のサーバーで並列処理します。

パーティションの数が少なすぎると並列度が上がらず遅くなり、多すぎるとオーバーヘッドが増えます。
チューニングの話では必ず出てくる概念です。

スキーマはデータの型定義

DataFrameには列名と型(文字列・数値・日付など)の定義があります。
型が合わないと処理が失敗します。

データの品質問題が起きたときに「スキーマが合っていない」という原因が多いようです。

データの書き込み先

Sparkは処理したデータをS3、HDFS、Redshift、RDS、Delta Lakeなどさまざまな場所に書き出すことができます。

どこからデータを読んでどこに書くかは設計によって異なるため、データフローの全体図を早めに把握しておくと全体像が見えやすくなるかもしれません。

Apache Sparkが選ばれ続ける理由 今後も知っておきたいデータ処理の標準

Apache Sparkは2014年ごろから急速に普及し、2026年現在もビッグデータ処理の事実上の標準ツールとして使われ続けています。

  • バッチ・ストリーミング・機械学習を単一のフレームワークでカバーできること
  • Python・Java・Scalaなど複数言語への対応
  • AWSをはじめとする主要クラウドのマネージドサービスとして使えること

などが、継続的に選ばれる理由でしょう。

「Sparkを完全に理解して使いこなす」には高度な専門知識が必要です。
まずは、「Sparkを使うプロジェクトで議論についていける」ために必要な知識から始めてみましょう。

ジョブ・パーティション・DataFrame・Spark SQLという基本概念を押さえ、全体のデータフロー(どこからデータを読んでどこに書くか)を把握しておくことがスタートラインです。

AWSでSparkを扱う機会があれば、まずはAmazon EMR ServerlessでPySparkのサンプルジョブを実行してみませんか?


タイトルとURLをコピーしました