Spark 論文ノート
MapReduceは非常に成功しましたが、これらの非循環グラフを中心に構築されたシステムの多くは汎用的ではありませんでした。そのような中でSparkが登場し、RDDと呼ばれる分散データ構造を通じて、以下のような分散計算をサポートするフレームワークを提案しました。
複数の並列操作にわたって作業データセットを再利用するもの
RDD (Resilient Distributed Dataset) は、失われた場合にDAG内の先行ノードから再構築可能な読み取り専用のデータ構造です。
SparkはScalaで実装されており、Scalaの特徴は以下の通りです:
- JVM上で動作する言語
- 関数型プログラミングをサポート
- オブジェクト指向
プログラミングモデル
RDDの紹介
RDDは4つの方法で作成できます。
- HDFSなどのファイルシステムから作成
- Scalaのコレクションから作成
- 既存のRDDから変換(flatMap、map、filterなどを使用)
- 既存のRDDの永続化方法を変更(RDDは読み取り専用であり、変更操作があると論理的に新しいRDDが作成されます)
さらに、RDDは遅延評価かつ一時的なデータ構造です。ユーザーは以下の2つの方法でRDDを永続化できます:
- cacheを使用:キャッシュされたRDDは依然として遅延評価ですが、一時的ではなくなります。つまり、最初の評価後に保存され、再利用を待ちます。
- saveを使用:分散ファイルシステムに書き込みます。
ユーザーはアクセス速度とストレージ容量の間でトレードオフを考慮する必要があります。
並列操作
- reduce - 結合則を満たす操作
- collect
- foreach - 副作用を持つ操作
例
- ログ統計
- ロジスティック回帰
- ALS (Alternating Least Squares)
遅延評価と一時性という2つの特性により、Sparkの動作はMapReduceと同様に見えます。しかし、cacheのステップを追加することで、計算を大幅に高速化できます。
実装
- (論文執筆当時のバージョン)Mesos上に構築
- 実装の核心はRDDインターフェースにあり、Scalaのオブジェクト指向と関数型の特性を十分に活用しています。
- getPartitions
- getIterator(partition)
- getPreferredLocations(partition) - データ局所性の考慮のため
- タスク(クロージャ)はScalaではJavaオブジェクトであるため、シリアライズして送信できます。実装過程ではScalaのバグも発見されました。
- インタプリタ統合も実装されました。
- 論文執筆時点では、シャッフルはまだ実装されていませんでした。
実験結果
- Hadoopを圧倒し、10倍の高速化を達成
- データセットは小規模
関連研究
- 分散共有メモリ (Distributed Shared Memory)
- MapReduce
- ScalaはDryadLINQに類似
感想
- まだ初期段階の研究であり、著者は興奮して共有しています。Hadoopの10倍の性能は非常に印象的です。
- 本論文は比較的概略的な内容です。
- 関数型的で不変であるため、遅延評価が可能です。
- Hadoopも、当時のSparkも、MapReduceには勝てませんでした。