spark_logo

こんにちは、shota_suzukiです。
最近『Apache Spark』を色々なプロジェクトで使う機会が増えてきたので、Sparkの基本から紹介いたします。

Apache Sparkについて

Apache Sparkはざっくり言ってしまうと、「ビッグデータを処理するためソフトウェア」です。ビッグデータに対する分散処理基盤としては、長らくHadoopが使われてきたことと思います。
しかし、Hadoopの特にMapReduceには苦手な処理もあり、その分野に対する解決策としてSparkがここ数年で相当注目されるようになってきました。

MapReduceでは中間データが毎回ディスクに書き出されるのですが、データの量が多かったりして処理が多段になってくると、ここのコストが無視できなくなってきます。
Sparkでは、中間データをディスクに書き出さず、メモリ上に持っているので、この点ではMapReduceより早く処理することができます。
完全にHadoopを置き換えられるものではありませんが、適切な場面で使えば高速に処理でき、その効果は甚大です。

SparkはUC BerkeleyのAMPLabで開発され、現在ではApacheのトップレベルプロジェクトとなっています。現在リリースされている最新バージョンは2.0.1です。
Sparkの開発速度は非常に早く、バージョンアップに追随して行くのはなかなか大変ですが、その分機能が増えたり高速化されたりしているので、なるべく最新のものを使いようにした方がよいと思います。

Sparkの本体はScalaで実装されていますが、Python、Java、Rでも処理を記述することが可能です。Pythonでの処理が可能なので、データサイエンティストからの人気も高いです。

Sparkのコンポーネント

Sparkは基本的な機能をまとめたSpark Coreと、その他幾つかのコンポーネントからなります。

Spark Core

タスクスケジューリング、メモリ管理、障害回復、ストレージシステムとのやりとり、などといった基本的な機能を提供しています。

Spark SQL + DataFrames

Sparkではデータを扱う方法として、RDD(Resilient Distributed Dataset)とDataframeの2パターンがあります。
Dataframeではデータを構造化し、テーブルライクに扱うことができます。
PythonでPandasを使っている人には、同じような処理ができるので扱いやすいと思います。

また、Dataframeに対してはSQLで処理をすることもできるので、SQLが得意な方にも扱いやすくなっています。
Spark2.0では、ANSI SQL(SQL 2003)がサポートされるようになったのも嬉しいですね。

Streaming

Sparkを使ってストリーム処理を実現することも可能です。通常、分散ストリーム処理を書くときには考慮すべきことが多く、何らかのフレームワークを使うのが一般的です。
ストリーム処理界隈は、近年熱い話題で様々なプロダクトが出てきていますが、Spark Streamingはその中でも有望株ではないでしょうか。

MLlib

一般的な機械学習の機能を含むライブラリ。MapReduceでは、機械学習のように繰り返しの計算が苦手だったので、Sparkの良さがすごく生きるところだと思います。

GraphX

グラフを操作し、グラフに対して並列に演算処理を実行するためのライブラリ。
ここについては私自身も使ったことがなく、また使用している話もあまり聞かない気がしています。

Sparkを使い始める

Sparkを本格的に使う場合は、YARNやMesosなどのリソースを管理してくれるフレームワーク上に乗せることになると思いますが、ここでは簡単に使い始める方法として、ローカルPCとAWSでの利用方法を簡単に紹介します。
Sparkにはインタラクティブシェルモードが存在しているので、とりあえずデータを解析してみたい時には、インタラクティブシェルに入って操作することから始めるのがおすすめです。

ローカルPCでSparkを使用する

こちらからあらかじめビルドされたものをダウンロードすることができます。Javaが入っているPCでこれさえあれば、特に他の設定をすることなくStandalone ModeとしてSparkを動かすことができます。

$ bin/spark-shell
scala> val data = sc.textFile("./test.txt")
data: org.apache.spark.rdd.RDD[String] = ./test.txt MapPartitionsRDD[1] at textFile at :24

scala> data.count()
res0: Long = 3

AWS上でのSparkの利用

EMRではSparkも使うことができるので、こちらを使用するのが簡単でしょう。現時点で最新のEMR-5.0.3を使ってSparkが含まれた形でEMRのクラスタを立ち上げると、特に設定は要らず、そのままSparkを使い始めることができます。
AWS上のリソースとしては、S3に溜まっているデータやKinesis Streamにからデータを取得し簡単に扱うことができます。

AWSの公式ページにEMRクラスタの起動の仕方が書かれているので、こちらを参考にしてクラスタを立ち上げてください。

$ /usr/bin/spark-shell

scala> val data = sc.textFile("s3a://xxxxxxx/test_log.txt")
data: org.apache.spark.rdd.RDD[String] = s3a://xxxxxxx/test_log.txt MapPartitionsRDD[1] at textFile at :24

scala> data.count()

以上、Apache Sparkの概要とセットアップ方法の紹介でした。機会があれば、より実践的なSparkの使い方を紹介していければと思います。

参考文献

初めてのSpark