Apache Spark
Apache Sparkの概要
Apache Sparkは、ビッグデータや機械学習のような大規模データを処理するクラスタコンピューティングのための分散処理フレームワークである。Sparkは2009年にカリフォルニア大学バークレー校のAMPLabで、HadoopのコミッターでもあるMate Zahariaによって開発が開始され、現在はApacheソフトウェア財団のトップレベルプロジェクトの一つとして管理、開発されている。
Sparkが開発された目的としては、従来のMapReduceの処理速度の遅さを改善することと、MapとReduceの繰り返しというスタイルに縛られない柔軟な処理スタイルへの対応が挙げられる。
Sparkは分散処理フレームワークとして単独でも動作するため、ポストHadoopとして注目されている一方で、MapReduce、HDFS、YARNなどで構成されるHadoopコアシステム内のMapReduceの代替として利用することも可能である。
Apache Sparkの主な特徴
Sparkの大きな特徴として、Sparkが提供する簡潔なAPIを使用して柔軟な処理モデルを簡単にプログラミングできること、大規模データを従来のMapReduceに比べてはるかに短い時間で処理できることなどが挙げられる。
従来のMapReduceでは、処理モデルとしてMapとReduceを1セットで実行する必要があったため、Hadoop上で動作するアプリケーションを開発するにはこのスタイルに従って開発する必要があった。そのため、柔軟な処理モデルを開発することが難しいという問題があった。
またMapReduceでは、1回のMapおよびReduce処理ごとに処理結果をディスクへ書き込むため、処理速度を向上させることが難しいという問題があった。これに対してSparkでは、メモリに読み込んだデータセット(RDD)に対して複数回のMap処理を連続して実行し、さらにReduceした結果をディスクに書き込まずインメモリ状態のまま次のMap処理をそのデータセットに対して行う方式を取っているため、MapReduceに比べて最大100倍以上の処理速度向上が見られる場合もあるとされる(従来のMapReduceと同様に処理結果をディスクへ書くこともできる)。
Sparkの特徴は次のとおりである。
- Speed
- インメモリ(In-Memory)ベースの高速処理
- Ease of Use
- Java、Scala、Python、R、SQLなど多様な言語対応による使いやすさ
- Generality
- SQL、Streaming、機械学習、グラフ演算など多様なコンポーネントを提供
- Run Everywhere
- YARN、Mesos、Kubernetesなど多様なクラスターで動作可能
- HDFS、Cassandra、HBaseなど多様なファイル形式とストレージをサポート
Apache Sparkのコンポーネント構成
Sparkは分散処理フレームワークとして、次のコンポーネント要素で構成される。
- Spark Core(Scala、Java、Python、R APIを含む)
- Spark SQL + DataFrames
- Spark Streaming
- MLlib
- GraphX
Spark Core
Sparkは処理するデータをRDD(Resilient Distributed Dataset)形式で保持する。
RDDは不変で並列実行可能なコレクションであり、分散された各コンピューターに配置される。
Sparkを使用したプログラミングモデルでは、このRDDに対してSpark Coreで提供されている各種メソッドを適用しながら処理を行っていく。Spark Coreが提供するAPIを通じてRDDを操作するとき、開発者は分散されたデータを意識せずに分散処理を実行できる。
これはSparkの特徴の一つである、柔軟な処理を容易にプログラミングできるという点である。
Spark Coreで提供されるAPIは、Sparkの開発言語であるScala以外にも、Java、Python、Rといった言語から呼び出し可能なAPIが標準で提供されている。また、サードパーティライブラリの中には、Scalaと同じくJava VM上で動作する関数型言語ClojureからSpark APIを呼び出すためのライブラリも存在しており、他の言語向けSpark APIも今後増えていくと予想される。
Spark SQL + DataFrames
Sparkでは、Sparkが提供するAPIを通じてRDDを操作する方法のほかに、Spark SQLというSQLのような言語を使用して、DataFramesというデータベーステーブルのような名前付き列を持つ抽象化されたデータセットを操作できる。
これはScala、Java、Python、Rのような言語を習得していないユーザーでも、SQLの知識があればSpark SQLを通じてSparkでデータを処理できるインターフェースである。
Spark Streaming
Spark Streamingは、Sparkに絶えず送信されるストリーミングデータに対してリアルタイム分散処理を可能にする機能を提供するエンジンである。
同様にストリーミングデータを処理するフレームワークとしてApache Stormがある。Apache Stormがストリーミングデータ処理に特化したフレームワークである一方、Spark StreamingはSparkでリアルタイムデータを処理するエンジンとしての機能である。
ほかにもApache Flinkというストリーミング処理フレームワークがある。こちらはバッチ処理も可能であり、機械学習ライブラリやグラフ処理ライブラリなども存在するため、Sparkにかなり似た構成となっており、Sparkの対抗馬と呼ばれている。
Apache Storm
http://storm.apache.org/
Apache Flink
http://flink.apache.org/introduction.html
MLlib
MLlibはSparkの機械学習ライブラリである。Sparkの柔軟な処理スタイルで機械学習を実行するプログラムを作成できる。
機械学習ライブラリとしては、まずHadoopと連携して機械学習を行うMahoutというソフトウェアが存在したが、Hadoop + MahoutではMapReduceのプログラミングモデルを使用して機械学習プログラムを作成する必要があり、処理速度低下という問題があった。
それに比べてSparkはHadoopより高速に処理でき、SparkとSparkが提供するMLlibを使用した機械学習は効率がよいという点で注目が高まっている。
Apache Mahout
http://mahout.apache.org/
GraphX
GraphXはSparkを通じてグラフデータを並列処理するAPIを提供する。
Sparkの特徴である高速処理により、グラフデータの並列処理が可能である。
上で説明したSparkを構成する一部のコンポーネントには、ストレージに分類されるものがない。 Sparkでは読み書きに既存の各種ストレージを利用できる。以下はSparkと連携可能なストレージの一部である(サードパーティライブラリ利用を含む)。
HDFS, Cassandra, HBase, S3, MongoDB, Couchbase, Riak, Neo4j, OrientDB
また、読み取れるデータソースとしてはCSVやXMLなどのファイルから、Solr、Elasticsearchなどの検索エンジンまで多様である。
Sparkと各種データソースとの連携パッケージ一覧
https://spark-packages.org/?q=tags%3A%22Data%20Sources%22
上で示した多様なデータソースとの連携を可能にするパッケージ以外にも、既存のSparkエコシステムを拡張するための各種パッケージが提供されている。
このパッケージはSparkPackageとして次のサイトに掲載される。
https://spark-packages.org/
Apache Sparkの動作環境
Sparkが動作保証しているのは、以下のようなOSである。また、実行するにはJavaがインストールされている必要がある。
- 主要Linuxディストリビューション
- Windows
- Linux
- MacOSX
Sparkで提供されるAPIがサポートするバージョンは次のとおりである。
- Java 8, 11, 17(Java 8u201未満はSpark 3.2.0では非推奨)
- Scala 2.12, 2.13(Spark 3.3.0は互換性のあるScala 2.12.xを使用する必要がある)
- Python 3.7以上(Python 3.9の場合、Apache Arrowとpandas UDFが動作しない場合がある)
- R 3.5以上
Apache Sparkのライセンス形式
SparkはApacheのトップレベルプロジェクトの一つである。
ライセンスはApache License 2.0であり、ユーザーはソフトウェアの使用、配布、修正、派生版の配布に制限を受けない。
Apache Spark参考情報
Spark開発者たちが始めたDatabricksという会社によって提供されている。