Spark RDD
RDD (Resilient Distributed Dataset)
SparkのコアであるRDDに関して調べてみた.結局,文字でちゃんと書いてあるのは論文だった.
- Matei Zaharia et al. "Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing" 2012.
- Matei Zaharia et al. "Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing" 2011.
- Matei Zaharia et al. "Spark: Cluster Computing with Working Sets" 2010.
ほとんど(たぶん)同じ内容なので,2012年の論文を読んだので,簡単なまとめ.
中身を本当に知りたかったら,最終的にはコード読むしかないのだろう.
ちなみに,日本語では,Slide Share上のNTTデータさんの「Apache Sparkのご紹介 (後半:技術トピック)」と参考URLsのpochiさんの説明がわかりやすい.
用語
- RDD
- Resilient Distributed Dataset, Sparkの核をなすデータ共有抽象化クラス
- Transformation
- RDDに対する遅延操作(e.g., map, filter, reduceByKey, etc.) で実際の計算は走らない
- Action
- RDDに対する実際の操作(e.g., reduce, collect, etc.,) で計算が走る.
- narrow dependency
- wide dependency
RDD 一言
- Read-only, partitioned collection of records
- Data Sharing Abstraction
- Distributed Shared Memoryのようなもの (だけど明確に異なる)
- readは細かくwirteは粗い
- RDDはimmutable
利点など
- データ,中間結果をメモリにもって高速化,どのノードに置くかとか決めて最適化
- 粗い変換(transformation)をRDDに何回も適当することが可能
- RDDの遅延操作の系譜 (lineage)情報を作っておくことで,系譜のどこかであるパーティションに対する実際の操作が失敗してもそこから復帰できる.もしくはそこだけ計算しなおせば良い.
- Diskに永続化するしないは選択可能
- defaultは in-memory
- 複数マシンにレプリカを置くのも可能
- memoryに収まらないときはdiskへspill (このへんコードみたい)
- wide dependencyが途中にある長い系譜の場合は,途中で保存したほうがベター
- checkpointを意図的に設けてRDDのsnapshotをとるということ
- これもバックグラウドで実行可能
- narrow dependencyではdata localityが効く
- wide dependencyの中間結果はファイルに吐く(mapredのmap出力と同じ)
- v.s. DSM (Distributed Sharing Memory)
RDD interface
5つある
向いてないアプリ
Partition
HDFSをデータソースとすると,1つのパーティションはHDFSの1block (64MB as default)になる.narrow dependencyではdata localityが効く.
Memory Management
3つのタイプがある.
- deserialized object in memory
- serialized object in memory
- serialized object on disk
Evaluation
いたるところで早くなったと豪語されているので,ここではメモリに収まりきらないデータを処理する場合に関してのみまとめ.
- 条件
- m1.xlarge EC2 node
- 4 cores
- 15 GB RAM
- HDFS with 256 MB blocks
- 100 GB data
- 25 nodes
ちゃんと読むと,メモリに載りきらないデータサイズというより,memoryの使用量を抑制しながらLogistic Regressionを実行みたい.
25%でも,最大15 GB * 0.25 * 25 nodes = 93.75 GB使っているということか...?
(本当にそうならここまで性能劣化しないと思うので,やっぱりn% * datasizeか?)
どちらにしよ,0% memoryでさえHadoopより2.67倍早いが.