読者です 読者をやめる 読者になる 読者になる

KZKY memo

自分用メモ.

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さんの説明がわかりやすい.

用語

f:id:KZKY:20141120004800p:plain

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)
    • fault-toleranceな実装をコモディティクラスタでやるのは無理ぽ
    • RDDはimmutableなのでバックアップタスクをしやすい
    • DSMの場合は,同じメモリ空間に別々のタスクがアクセスするので互いに干渉しあって難しい
    • 比較図

f:id:KZKY:20141120004845p:plain

RDD interface

5つある

向いてないアプリ

  • 非同期の細かいアップデートを含むアプリ
  • web application storage (DBか?)
  • web crawler
  • 機械学習だと完全に非同期で, lockを取らずに,SGDやりたいときとかか?

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倍早いが.

f:id:KZKY:20141120004837p:plain f:id:KZKY:20141120004841p:plain

Notes

  • lineage系譜と訳しているのは,データさんの資料を参考.意味合い的には血統,血縁のほうがしっくりくる.
  • 間違えていたら指摘してほしい.