突然ですが、みなさんSpark使ってますか?
最近、仕事でSparkというライブラリを使用して大量のデータをさばく必要があり、しばらく使ってみて業務で使えるくらいには慣れてきたのですが、もう少し深ぼって知ろうという事で、「Apatch Spark徹底入門」を読みました。
ということで今回は、Sparkについてまとめていきます!
誰が何のためにSparkを利用するのか?
もし、この記事を読んでいるあなたが、データエンジニア、データサイエンティスト、 機械学習エンジニアであれば、次のユースケースで役に立ちます。
・クラスタに分散した大規模データの並列処理
・さまざまなデータセットを探索し、可視化するためのアドホックまたは対話的なクエリの実行
・MLlibを用いた機械学習モデルの構築、トレーニング、評価
・無数のデータストリームからエンドツーエンドのデータパイプラインを実現
・グラフデータせっととソーシャルネットワークの解析
Sparkが動く仕組み
ではどのようにしてSparkは大量データを扱っているのでしょうか。
Sparkは、複数のマシンでクラスタを形成し、クラスタ同士が協調して分散処理を行うのですが、ここでは、その分散処理の仕組みについて見ていきます。
以下がSparkのコンポーネントとアーキテクチャです。
Spark Driver
Spark Sessionのインスタンス化の役割を担うSparkアプリケーションの一部として、Spark Driverには複数の役割があります。
- Cluseter ManagerへのSparkのExecutorのリソース(CPU、メモリなど)のリクエスト
- Spark処理のDAG計算処理への変換
- 処理のスケジューリング
- 以上の処理を”Task”としてSpark Executorへ分散
Spark Session
Spark2.0からSparkでの作業をよりシンプルにするために過去のバージョンでエントリーポイント、SparkContext、SQLContext、HiveContext、SparkConf、StreamingContextといった機能を包含しました。
Cluster Mnager
Cluster Manager(クラスタマネージャ)は、Sparkアプリケーションが実行されるクラスタノードの管理とリソースの割り当てを担当します。
Spark Executor
SparkのExecutorは、クラスタ内の各ワーカーノードで動作します。
ExecutorはDriverプログラムと通信し、ワーカー上でタスクを実行します。
ほとんどのデプロイメントモードでは、ノードあたり1つのExecutorが実行されます。
Deployment Mode
Sparkの魅力的な機能の1つで、多様なデプロイメントモードをサポートしていることで、Sparkの異なる構成と環境で実行できます。
クラスタマネージャはどこで実行されているかに関係なく、SparkはApache Hadoop YARNやKubernetesなどの人気のある環境で展開でき、異なるモードで動作できます。
パーティションの仕組み
ここからは、データをどうやって分散処理しているのかについて説明しておきます。パーティションという仕組みについては業務でも知識として使うので理解しておきましょう。
分散されたデータとパーティション
実際の物理データは、HDFSまたはクラウドストレージに存在するpartitionとしてストレージに分散されます。データはpartitionとして物理クラスタに分散されていますが、Sparkは各partitionをハイレベルの論理データ抽象化として、メモリ内のDataFrameとして扱います。これは常に可能とは限りませんが、Sparkの各Executorは、ネット上で最も近いpartitionを組み込む必要があるタスクを割り当てられ、データの局所性を視察することが望ましいとされています。
例えば、このコードでは、クラスタ間で保存されている物理データを8つのpartitionに分割し、各Executorは1つまたは複数のpartitionを取得してメモリに読み取ります。
基本の仕組みがわかったら
Sparkの基本的な仕組みを説明しましたが、次は実際のデータがどう構造化されているのかを説明していこうと思います。