Apache Spark

Apache Sparkはオープンソースのクラスタコンピューティングフレームワークである。カリフォルニア大学バークレー校のAMPLabで開発されたコードが、管理元のApacheソフトウェア財団に寄贈された。Sparkのインタフェースを使うと、暗黙のデータ並列性と耐故障性を備えたクラスタ全体をプログラミングできる。
日経BP社が発表した「ITインフラテクノロジーAWARD 2015」において、SparkはDockerに次ぐ準グランプリとされた。

**概要**
フォールトトレラントシステムで管理され、複数マシンのクラスタに分散されたデータ項目の読み取り専用多重集合であるRDD（resilient distributed dataset）と呼ばれるデータ構造を中心とするアプリケーションプログラミングインターフェイスを備えている。MapReduceは、分散プログラム上で特定の線形データフロー構造を強制するクラスタコンピューティングプログラミングパラダイムの制限に対応して開発された。MapReduceは、ディスクから入力データを読み込み、データ全体に関数をマップし、削減結果をディスクに格納する。SparkのRDDは、 分散共有メモリの （意図的に）制限された形式で提供する分散プログラムのワーキングセットとして機能する。
RDDの可用性は、ループ内で複数回データセットを参照する反復法アルゴリズム、および対話型/探索型データ分析、データ反復のデータベースクエリの両方の実装を容易にする。このようなアプリケーションのレイテンシ（Apache Hadoopスタックでは一般的であったMapReduce実装と比較して）は、桁違いに低下する可能性がある。反復アルゴリズムのクラスの中には、 機械学習のための訓練アルゴリズムがあり、Apache Sparkを開発の初期の刺激となった。
クラスタマネージャと分散ストレージシステムが必要であり、クラスタ管理のためにスタンドアロン（ネイティブのSparkクラスタ）、Hadoop YARN、Apache Mesosに対応している。分散ストレージの場合、Hadoop分散ファイルシステム、MapRファイルシステム（MapR-FS）、Apache Cassandra、OpenStack Swift、Amazon S3、Kudu、カスタムソリューションを実装できる。擬似分散ローカルモードも対応しており通常は開発やテスト目的でのみ使用される。分散ストレージは不要でローカルファイルシステムを代わりに使用でき、CPUマルチコアごとに1台のマシン上で実行される。

**Spark Core**
プロジェクト全体の基盤であり、RDD抽象化を中心とするアプリケーションプログラミングインターフェイス（Java、Python、Scala、R）を介して公開される分散タスクディスパッチ、スケジューリング、および基本I/O機能を実装している。（Java APIは他のJVM言語でも使用でき、Juliaなどの他の非JVM言語でも使用できる。）「ドライバ」プログラムは、関数をSparkに渡すことによってRDD上でmap、 filter 、reduceなどの並列操作を呼び出し、関数の実行をクラスタ上で並列にスケジュールする。 2これらの操作や結合などの追加操作は、RDDを入力として受け取り、新しいRDDを生成する。RDDはイミュータブルで遅延評価している。耐故障性は、データ消失の場合に再構成できるように各RDDの「系統」（生成操作）を追跡により達成される。RDDには任意の種類のPython、Java、Scalaオブジェクトを含められる。
RDD指向の機能的プログラミングスタイルの他に、共有変数の2つの制限形式がある。ブロードキャスト変数はすべてのノードで利用可能な読み取り専用データを参照し、アキュムレータは命令型プログラミングの削減をプログラムできる。
RDD中心の関数型プログラミングの典型例は、テキストファイルのセット内に出現するすべての単語の頻度を計算し、最も一般的なものを表示する次のScalaプログラムである。各マップflatMap（マップの変形）とreduceByKeyは、単一のデータ項目（または項目のペア）に対して簡単な操作を実行し、その引数を適用してRDDを新しいRDDに変換する無名関数をとる。
val conf = new SparkConf().setAppName("wiki_test") // create a spark config object
val sc = new SparkContext(conf) // Create a spark context
val data = sc.textFile("/path/to/somedir") // Read files from "somedir" into an RDD of (filename, content) pairs.
val tokens = data.flatMap(_.split(" ")) // Split each file into a list of tokens (words).
val wordFreq = tokens.map((_, 1)).reduceByKey(_ + _) // Add a count of one to each token, then sum the counts per word type.
wordFreq.sortBy(s => -s._2).map(x => (x._2, x._1)).top(10) // Get the top 10 words. Swap word and count to sort by count.

**Spark SQL**
Spark Coreより上位のコンポーネントで、構造化データや半構造化データをサポートするDataFramesというデータ抽象化を導入した。Scala、Java、PythonのDataFramesを操作するためのドメイン固有言語（DSL）を提供しており、キャラクタユーザインタフェースとOpen Database Connectivity/JDBCサーバとのSQL言語サポートも実装している。DataFramesには、Spark 2.0のようにRDDによって提供されるコンパイル時型チェック機能はないが、強く型付けされたデータセットはSpark SQLでも完全にサポートされている。
import org.apache.spark.sql.SQLContext
val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL for your database server.
val sqlContext = new org.apache.spark.sql.SQLContext(sc) // Create a sql context object
val df = sqlContext
.read
.format("jdbc")
.option("url", url)
.option("dbtable", "people")
.load()
df.printSchema() // Looks the schema of this DataFrame.
val countsByAge = df.groupBy("age").count() // Counts people by age

**Spark Streaming**
Spark Coreの高速スケジューリング機能を活用してストリーミング分析を実行する。ミニバッチでデータを取り込み、RDD変換を実行する。この設計により、バッチ分析用に記述されたアプリケーションコードセットを使用できるため、 ラムダアーキテクチャの実装が容易になる。 しかし、この利便性はミニバッチ持続時間に等しいレイテンシのペナルティを伴う。ミニバッチではなくイベント別にイベントを処理するその他のストリーミングデータエンジンには、StormとFlinkのストリーミングコンポーネントが含まれる。Spark Streamingは、Kafka、Flume、Twitter、ZeroMQ、Kinesis、TCP/IPソケットに対応している。

**MLlib Machine Learning Library**
分散メモリベースのSparkアーキテクチャの大部分がApache Mahoutで使用されているディスクベースの実装の9倍速である、Spark Core上の分散マシン学習フレームワークである。多くの一般的な機械学習と統計アルゴリズムが実装され、大規模機械学習パイプラインを簡略化するMLlibに同梱されている。

**GraphX**
Apache Spark上の分散グラフ処理フレームワークを示す。不変のRDDに基づきグラフは不変であるため、グラフデータベースのようなトランザクション方式ではなく更新が必要なグラフには適していない。大規模並列アルゴリズム（ページランクなど）を実装するための2つの別個のAPI、Pregel抽象化、より一般的なMapReduceスタイルAPIを提供している。Spark1.6で旧式に廃止された旧型のBagelとは異なり、GraphXはプロパティグラフ（プロパティがエッジや頂点に付加できるグラフ）を完全にサポートしている。
HadoopディスクベースのMapReduceを利用したApache GiraphのSparkインメモリ版として見ることができる。
Apache Sparkと同様にUC BerkeleyのAMPLabとDatabricksで研究プロジェクトとして開始され、後にApacheソフトウェア財団とSparkプロジェクトに寄贈された。

**脚注**

**外部リンク ==