大規模データの分析を強力にサポート: Apache Sparkの概要

Apache Sparkは、大規模なデータを扱うためのオープンソースの統合分析エンジンです。

Apache Spark 3.0からはGPUを扱った並列分散処理、3.2ではSpark上でPandas APIの利用が可能となり、2022年6月にはバージョンは3.3になりました。

扱うデータの規模は拡大を続けており、Sparkを利用する機会は益々増えると考えられます。

膨れ上がる大規模データを処理する場合、Sparkの利用は避けて通れず、Sparkの今後の発展にも目が離せません。

ワカメさん

この記事は「Spark誕生の経緯と特徴」をまとめます。

この記事がカバーする内容
  • なぜSparkは誕生したか
  • Sparkはどのような機能を持つか
スポンサーリンク

Sparkの誕生

Figure 1: Spark Logo

Spark誕生のきっかけに、大規模データを分散処理で扱うためのソフトウェアフレームワーク: Apache Hadoopが関わってきます。

Hadoopは、Google File SystemGoogle MapReduceを参考に2006年にYahoo!から開発され、2008年にApacheトップレベルプロジェクトに昇格したソフトウェア基盤です。しかしながら、Apache Hadoopの大規模データを効率的に分散処理するMapReduceには、処理速度に課題がありました。

そこで、MapReduceの利点を維持しながら、分散処理のパフォーマンスや使いやすさの改善を目的に、2009年にUC BerkeleyのAMPLabのプロジェクトが立ち上がりました。このプロジェクトがSparkの誕生に繋がります。

2010年、Sparkは初めてオープンソースプロジェクトとしてリリースされ、2012年にはインメモリ方式で処理をサポートする分散共有メモリResilient Distributed Dataset: RDDを発表しました。(2)(3)

その後、2013年にApacheのプロジェクトとしてSparkは寄贈され、2014 年にはApacheのトップレベルプロジェクトになりました。

Apache Sparkプロジェクトのコミッターには、DataBricks, Netflix, IBM, Apple, Google, NVIDIA, NTT…etc、数多くの企業からメンバーが名を連ね、現在もプロジェクトのコミュニティ規模は拡大を続けています。(4)

Figure 2: Spark History (5)

Sparkの特徴

ヒトデちゃん

なぜHadoopとSparkの処理に違いが出るのでしょう?

HadoopのMapReduceは、例えば、HDFSのようなディスクへのデータの「read」と「write」をiterationのたびに実行する必要があります。これがプロセス全体の遅延に影響していると指摘されました。

MapReduceを実行するたびにHadoopがディスクへアクセスすることに対し、Sparkは分散共有メモリResilient Distributed Datasets: RDDを利用することで、複数マシンのメモリ(RAM)にデータを分割し、管理します。

RDDは、iterationごとのディスクへの書き込みの省略とRDDからiterationの結果の読み込みをサポートを可能としました。

Figure3. Hadoop and Spark

例えば、RAMからの読み込み速度は、ディスクからの読み込み速度の数百〜千倍高速です。インメモリ方式を採用することで、Sparkは大規模データの処理速度をHadoopの10-100倍向上しました。

以下にHadoopとSparkの違いをまとめます。

HadoopSpark
処理速度ディスクから読み書きするため、処理速度が低下ディスクへの読み書きの頻度を減らし、データをメモリに保存することで処理速度を向上
利用場面バッチプロセスを扱うための設計リアルタイムデータを扱うための設計
レイテンシー高レイテンシー低レイテンシー
コストコスト面では安価インメモリのために多くのRAMを必要とし、高コスト
機械学習データのフラグメンテーションは非常に大きいため、処理がSparkより遅いインメモリとMLlibを使用することで、処理を向上
パフォーマンスディスクへの読み書きが都度発生し、パフォーマンスが低いディスクへの読み書きを削減し、高いパフォーマンス
言語Javaで書かれているが、MapReduceはPythonでも可能Scalaで書かれているが、Python, Java, Rでも利用可能
ユーザーフレンドリー扱いが難しい扱いが楽
Table1 HadoopとSparkの比較

Sparkのアーキテクチャー

ワカメさん

ここではSparkのアーキテクチャーについてまとめます。

Sparkは、パワフル、かつ、簡単に扱うための5つのコンポーネントから構成されています。

それぞれのコンポーネントは

  1. ストレージ
  2. リソースマネジメント
  3. エンジン
  4. エコシステム
  5. APIs

から成ります。

Figure4. Spark Architecture

ストレージ

Sparkでデータを処理する前に、データはストレージに蓄積されている必要があります。データは、様々な種類のデータベースに蓄積できます。

Sparkはリレーショナルデータベース(RDB)の利用だけでなく、Cassandra, MongoDBなどのNoSQLの利用も可能です。

リソースマネジメント

Sparkは複数のマシンの集合の上で機能します。複数マシンの集合は「クラスター」と呼ばれます。

あらゆるクラスターには、「リソースマネージャー」があります。リソースマネージャーは、リソース間の作業を効率的に管理します。

代表的なリソースマネージャーには、YARN、Mesosが挙げられます。リソースマネージャーは、「Cluster manager」「Worker」の2種類のコンポーネントを持ちます。

Cluster managerは、マスターノードとして振る舞います。 例えば、Cluster managerはWorkerに関する以下の情報を管理します。

  • Worker noteの状態
  • Worker nodeの場所
  • Worker nodeのメモリ
  • Worker nodeの合計CPUコア数

つまり、Cluster managerの主な役割は、worker nodeを管理し、その情報をもとにそれぞれのworker nodeにタスクを割り振ることです。

一方、worker nodeは、Clsuter managerから与えられたタスクの実行に責任を持ちます。

ヒトデちゃん

何だか職場の上司と部下の関係みたいですね。

エンジンとエコシステム

エンジンとエコシステムはRDD(Rssilient Distributed Datasets)の上に立ち、Spark Contributorによって開発されたライブラリやエコシステムを利用するためのAPIを提供します。これがSparkのアーキテクチャーのコアでもあります。

Sparkツールキットはデフォルトで5つのライブラリを提供しています。

  • Spark SQL
  • MLlib
  • Structured Streaming
  • Graph X
  • Pandas API

Spark SQL

SQLは多くのETLオペレーターに利用されています。 Spark SQLは、SparkユーザーがSQLクエリによって構造化データ処理の実行を可能にします。Spark SQLを利用することで、簡単に多数のデータベースファイルや、SQL、NoSQLのようなストレージシステムを扱えるようになることが利点に挙げられます。

MLlib

SparkのMLlibが登場するまでは、巨大なデータセットに対して機械学習モデルをトレーニングすることは大きなチャレンジになっていました。SparkのクラスターとMLlibの利用は、巨大なデータセットに対して機械学習モデルのトレーニングを可能にします。Spark MLlibでは、教師あり学習、教師なし学習、NLPベースのレコメンダーシステム、ディープラーニングなど、さまざまなモデルの利用が可能です。

Spark Streaming

Spark Streamingは、リアルタイムのストリーミングデータを処理するための機能を提供します。Spark Streamingでは、受信データをバッチデータ、あるいは、異なるソースからの直近のリアルタイムデータとして扱うことができます。構造化ストリーミングは、Flume、Kafka、Twitterなどのソースから得られるリアルタイムデータを取り込み、これをマイクロバッチに変換、その後、Sparkエンジンでこれらを処理します。

Graph X

Graph XはSpark coreの上に立てられ、ユーザーがノードとエッジを含むグラフ構造のデータの処理を可能にします。グラフは異なるオブジェクト同士の関係をモデルするために利用します。ノードはオブジェクトを、エッジはノード同士の関係を表します。グラフデータフレームは主にネットワーク分析で扱われ、Graph Xはグラフデータフレームの分散処理を可能にします。

Pandas API

Apache Spark (PySpark)のPandas APIは、データサイエンティストやデータエンジニアがSparkでpandasを実行することを可能にします。Pandas APIが実装されるSpark 3.2より前は、pandasのDataFrameからPySparkのDataFrameのコードを書く必要があり、時間のコストが大きかったです。また、PySparkでPandas APIを使用したい場合、オープンソースプロジェクトのKoalasを使用する必要がありました。現在、KoalasプロジェクトはSpark 3.2からApache Sparkの一部となり、Pandas APIで気軽にpandasをSpark上で扱えるようになりました。

Programming Language API

Sparkは4種類のプログラミング言語で利用が可能です。SparkはScalaで開発されているため、Scalaがネイティブ言語になります。しかし、Scalaとは別に、Python、Java、RでもSparkは利用できます。

環境構築

Sparkは様々な環境で利用できます。代表的な環境としては、

  • ローカル
  • Docker
  • GCP, AWS, Azureなどのクラウド環境
  • Databricks

が挙げられます。

ローカルシステムにSparkをインストールして使用することは比較的簡単ですが、クラスターは使用できません。Sparkの分散コンピューティングは常にローカルシステムからの制約を受けますが、サンプルデータに対してテストコードを書くには良い練習になります。

簡単な流れとしては

  • Java Developmetn Kit (JDK)をインストール
  • Apache Sparkの最新バージョンをインストール
  • zipフォルダからファイルを抽出
  • Sparkに関連する全てのファイルを対象ディレクトリにコピー
  • Sparkを実行するための環境変数を設定
  • Sparkが実行するか確認

になります。

ワカメさん

環境構築の詳細な手順は、他サイトかYoutubeを参考にしてください。

まとめ

この記事はSparkの概要についてまとめました。

Apache Spark
  • Apache Sparkの概要
    • 大規模なデータを扱うためのオープンソースの統合分析エンジン
    • HadoopのMapReduceの課題解決を目的にUC Berkeleyのチームから開発がスタート
    • 現在もプロジェクトのコミュニティ規模は拡大中
  • Sparkのアーキテクチャー
    • ストレージ、リソースマネジメント、エンジン、エコシステム、APIsから構成
    • RDDを利用したインメモリ方式により処理速度を向上
    • Scala、Python、R、Javaで利用可能
    • Spark SQL、MLlib、Structured Streaming、Graph X、Pandas APIを利用可能
ワカメさん

DataBricksの登場で、徐々にSparkは扱いやすくなってきていると思います。Sparkについてはこれからも継続的に学習、スキル習得を目指したいです。

この記事は以上です。最後まで読んで頂きありがとうございました。

参考資料

(1)Apache Spark, Unified engine for large-scale data analytics

(2) Zaharia, Matei, Mosharaf Chowdhury, Michael J. Franklin, Scott Shenker, and Ion Stoica. “Spark: Cluster computing with working sets.” In 2nd USENIX Workshop on Hot Topics in Cloud Computing (HotCloud 10). 2010.

(3)Zaharia, Matei, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma, Murphy McCauly, Michael J. Franklin, Scott Shenker, and Ion Stoica. “Resilient distributed datasets: A Fault-Tolerant abstraction for In-Memory cluster computing.” In 9th USENIX Symposium on Networked Systems Design and Implementation (NSDI 12), pp. 15-28. 2012.

(4)Apache Spark, Current Committer

(5)NVIDIA, Optimizing and Improving Spark 3.0 Performance with GPUs

(6) Pramod Singh, Learn PySpark: Build Python-based Machine Learning and Deep Learning Models, 2019

(7) Machine Learning with Spark – Second Edition, 2017

スポンサーリンク
この記事が気にいったらシェアしてね!
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
ABOUT US
ワカメ
Data Scientist, Master of Data Science & Master of Engineering in Material Science
このブログは以下2点を目的に運営.
1. 管理人の学び・体験の復習機会
2. 海外留学を目指す方の参考情報
趣味の範囲で淡々と更新します.
*ブログ・SNSは所属組織と無関係の個人発信.