Apache SparkとPySparkの概要

大規模データ処理のための分散処理フレームワークである Apache Spark と Spark を Python で利用するための PySpark の概要について解説します。
目次
Apache Spark
Apache Spark の概要
Apache Spark (以降、Spark) は、大規模なデータを処理するためのオープンソース分散処理フレームワークです。2009 年に UC Berkeley の AMPLab で Matei Zaharia によって開始されています。その後、2014 年に Databricks 社が設立され、Spark の開発と商用サポートを提供する企業として注目を浴びるようになっています。
分散処理フレームワークといえば Apache Hadoop を思い浮かべる方がいるかもしれません。Hadoop では、大規模データに対するバッチ処理等では非常に効果的ですが、近年発展してきている AI、機械学習 (ML) といった頻繁にデータアクセスを繰り返すようなケースにはあまり適していませんでした。
そこで、Apache Spark では、メモリ上で処理を展開することで AI や 機械学習 (ML) といった処理に対しても大規模データに対する分散処理ができるようにしました。
Apache Spark の構成と API
Apache Spark は、以下の4つのコンポーネントで構成されています。
- Spark SQL:構造化データ処理
- Spark Structured Streaming:ストリーム処理
- MLlib:機械学習
- GraphX:グラフ操作
各コンポーネントは、Spark Core や Spark SQL Engine といった実行エンジンが支えており、Spark は「Scala」「SQL」「Python」「Java」「R」といったプログラミング言語の API を提供しています。

Apache Spark 自体は、Scala で記述されており、JVM (Java Virtual Machine) 上で動作します。なお、Scala は、Java のオブジェクト指向に加えて関数型プログラミングに対応できるハイブリットなプログラミング言語です。
Spark SQL
Spark SQL は、構造データを処理するためのモジュールで、Spark における中心的なコンポーネントです。Spark SQL により、各種 RDBMS やファイル (csv, txt, json, parquet 等) から簡単にデータを読み込んで扱うことができます。
Spark Structured Streaming
Spark Structured Streamingは、ストリーミング処理に対応して分散処理をするためのコンポーネントです。Apache Kafka (カフカ) といった分散ストリームプラットフォームのストリームデータと連携して処理をすることができるようになります。
MLlib
MLlib は、各種機械学習アルゴリズムを提供するコンポーネントです。回帰、分類、クラスタリングといった各種機械学習アルゴリズムを提供しており、機械学習のワークフローを分散処理で簡単に実行することができます。
GraphX
GraphXは、グラフ(ソーシャルネットワークグラフ 等)を操作し、グラフの並列計算を実行するためのコンポーネントです。グラフを分析、接続、探索のための標準的なグラフアルゴリズムが提供されています。
Apache Spark のエコシステム
Apache Hadoop では、分散処理とストレージ (HDFS) を含むフレームワークでしたが、Apache Spark では分散処理とストレージを分離しています。この柔軟性により、HDFS、Apache Hive、Apache HBase、MongoDB、各種 RDBMS 等の多様なデータソースや、クラウドストレージの Azure Data Lake Storage (ADLS)、Amazon S3 等とも簡単に統合することができます。

※内容は変わっている可能性があります。
上記は、Apache Spark エコシステムに関連する各種フレームワークです。機械学習、BI、ストレージ等の各種の有名フレームワークと連携可能となっています。
Spark アプリケーションの概念
Spark では、後述する Python 用の PySpark 等、各言語用の API を使用することで簡単に使用することができ、分散処理を実行できます。これによりプログラマが分散処理を実装する負担が軽減されます。
ただし、Spark の概念を全く理解せずに使用すると、非効率なコードになったり、チューニングが難しくなったりするため、Spark の概念を理解することも重要です。。
Spark アプリケーションの概念は少し長くなってしまうため「Sparkアプリケーションの概念を理解する」でまとめていますので参考にしてください。
PySpark
PySpark の概要
Spark では、各種プログラミング言語用の API を提供しています。Python で、Spark を扱うための API をPySpark といいます。PySpark を使用することで、Spark の各種コンポーネントを簡単に使用できます。
この記事では、PySpark で提供される各種機能について具体的な説明はしませんが、イメージを持ってもらうために簡単なサンプルコードを紹介します。
from pyspark.sql import SparkSession
from pyspark.sql.functions import lit
# Sparkセッションの作成
spark = SparkSession.builder.appName("ParquetExample").getOrCreate()
# サンプルのDataFrameを作成
data = [("Alice", 34), ("Bob", 45), ("Charlie", 29)]
columns = ["Name", "Age"]
df = spark.createDataFrame(data, columns)
# 新しい列を追加
df_with_country = df.withColumn("Country", lit("USA"))
# データフレームをParquetファイルに保存
df_with_country.write.parquet("output.parquet")
# Parquetファイルからデータを読み込む
parquet_data = spark.read.parquet("output.parquet")
# 保存したデータを表示
parquet_data.show()【実行結果】 +-------+---+-------+ | Name|Age|Country| +-------+---+-------+ |Charlie| 29| USA| | Alice| 34| USA| | Bob| 45| USA| +-------+---+-------+
上記プログラムは、以下のような流れで処理が動いています。
SparkSessionで、Spark のセッションを開始する。- サンプルの DataFrame を用意する。
- 新しい列を追加する。
- データフレームを
parquet形式で保存する。 - 保存した
parquetデータを読み込み、showで表示する。
非常にシンプルなプログラムであることが分かるかと思いますが、上記プログラムは用意している Spark 環境によって分散されて実行されます。
この記事では PySpark の使い方について細かな紹介はしませんが、以下に各種使用方法についてもまとめていますので参考にしてください。
PySpark 環境
Spark の環境を自分で構築しようと思うと少し大変です。PySpark の学習をしたい時にお手軽に環境を用意する場合には、Docker環境を使うのがおすすめです。Docker 環境を用いて、PySpark を使えるようにする方法は「PySparkの実行環境をDockerで用意する方法」を参考にしてください。
実際に PySpark を使う場合は、Spark クラスタを物理サーバーなどを用いて構築します。また、主要なクラウド環境では、Spark 環境を使えるような PaaS を提供していますので、それらを利用することで環境構築負担の軽減が可能です。(例:AWSのAmazon EMR、Microsoft AzureのSynapse Sparkプール 等)
また、Spark の開発者により立ち上げられた企業である Databricks 社が提供する Databricks というサービスを使用するのも非常によい選択肢です。Databricks は、Spark 基盤の上に Delta Lake や Unity Catalog という機能層を追加し、AI や ML と柔軟に連携、データ活用できるデータプラットフォームとしてサービスが提供されています。Databricks は無償版も用意されていて試すこともできます。「Databricks Community Editionを使用する方法」も参考にしてください。
まとめ
大規模なデータ処理のための分散処理フレームワークである Apache Spark と、そのPython インターフェースである PySpark についての概要を解説しました。
大規模データを使用して AI や 機械学習 (ML) を実現する際には、Spark や PySpark は強力なツールとなります。この記事で紹介した内容も参考にしていただき Spark や PySpark について理解を深めていただければと思います。







