Copyright © BrainPad Inc. All Rights Reserved.
Apache Sparkについて
2015年5月15日
Copyright © BrainPad Inc. All Rights Reserved.
1. Sparkとは
2
Copyright © BrainPad Inc. All Rights Reserved.
公式ドキュメントによると、
Apache Spark is a fast and general-purpose cluster computing system.
そのまま訳すと、「高速」と「多目的」を特徴とした分散処理システム。
MapReduceに比べて、10倍~100倍程度のパフォーマンスが出ると言われている。
 略歴
– 2009年からUC Berkleyで開発が始められる。
– 2010年にオープンソース化。
– 2013年にASFに寄贈される。
– 2014年にApache Top-Level Projectに昇格。
現在(2015/5/1時点)での最新バージョンは1.3.1。実装言語はScalaで、
Scala,Java,Pythonで使用可能。
3
Sparkとは
Copyright © BrainPad Inc. All Rights Reserved.
 インメモリによる処理
– SparkはMapReduceとは異なりオンメモリでデータ処理をするため、mapやfilterなど
の処理ごとに毎回ディスクIOが発生することはない。
 RDD
– 各ノードに分散して処理されるデータコレクションの抽象表現。
– Sparkでは、RDDに対してmapやreduceなどの処理を実行する。
– HDFSへの出力など、実際にデータが必要になるまで処理は遅延される。アクションが
起こった時に、処理の流れをたどって実際にデータロードやmapなどの処理を行う。
– RDDをメモリ上にキャッシュできるので、効率的に繰り返し処理が可能。
4
高速?
Copyright © BrainPad Inc. All Rights Reserved.
Sparkは、Spark Coreを中心としたいくつかのサブコンポーネントから成り立って
いる。
例えば、
– Spark SQL(構造化データに対して、SQLを使ってアクセス)
– Spark Streaming(Spark上でストリーミングデータを処理)
– MLlib(Spark上で機械学習)
– GraphX(グラフデータを処理)
すべてSpark Coreをベースとしているため、コードの再利用や学習コストの低下、
メンテナンス容易性の向上が期待できる。
5
多目的?
Copyright © BrainPad Inc. All Rights Reserved.
SparkはBDAS(Berkeley Data Analytics Stack)の一部。
BDASとは、AMPlabで開発されている一連のデータ処理ソフトウェアスタック。
最近よく名前を聞くMesosなんかもここに含まれている。
6
多目的?
Copyright © BrainPad Inc. All Rights Reserved.
2. RDD
7
Copyright © BrainPad Inc. All Rights Reserved.
各ノードに分散して保持されるデータコレクションオブジェクト。
Sparkでは、このRDDを通じてデータの処理フローを定義していく。
RDDは、以下の性質を持つ。
 パーティションによる分散
– データは複数のパーティションに分けられ、それぞれがクラスタ上に分散して処理され
る。
 遅延実行
– countやsaveAsTextFileなど、特定の操作が実行されるタイミングまですべての処理が
遅延される。
 障害耐性
– RDDはイミュータブルで、データの途中経過を逐一保持しない。
– データがロストした場合は、RDDを再計算することでデータを復旧する。
• ミュータブルなデータをオンメモリで保持する場合、更新のたびにレプリケーションを取る必
要があるが、この方法はネットワークへの負荷が重い。
8
RDDとは
Copyright © BrainPad Inc. All Rights Reserved.
RDDを作り出す方法は2種類ある。
1. コレクションオブジェクトから作成する。
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
2. 外部データソースから作成する。
val distFile = sc.textFile("data.txt")
9
RDDの作成方法
Copyright © BrainPad Inc. All Rights Reserved.
1. Transformation
既存のRDDから、変換処理などを通じて新しいRDDを作り出す処理。実行はActionが実行
されるまで遅延される。
例:map、filter、groupByKey
2. Action
Driverにデータを戻したり、外部にデータを書き込んだりする処理。Actionが実行された
タイミングで、それまで遅延されていた処理が実行される。
例:count、take、saveAsTextFile
10
RDDのインターフェース
Copyright © BrainPad Inc. All Rights Reserved.
 RDDは主に以下のデータを保持する。
– 親RDDの参照
– 担当するパーティション
• 例えばHDFSからファイルを読み込んでRDDを作った場合、そのファイルのブロックごとに
パーティションが作られる。RDDは、このパーティションの集合と、それぞれのメタデータ
(どこに配置されているかとか)を保持する。
 Transformationごとに、新たなRDDオブジェクトが作成される。
11
RDDの構造
RDD RDD RDD
transformationにより生成 transformationにより生成
参照を保持参照を保持
Copyright © BrainPad Inc. All Rights Reserved.
// 1.HDFSからデータロード
val lines = sc.textFile(“hdfs://…”)
// 2.”target”という単語を含む行に絞込
val targetLines = lines.filter(_.contains(“target”))
// 3.先頭の単語を集める
val firstWords = targetLines.map(_.split(“ “)(0))
// 4.HDFSに書き出す
firstWords.saveAsTextFile(“hdfs://…”)
12
RDD処理イメージ
上記のような処理の場合、4のActionが実行されるまではどの処理も実行されない。
Copyright © BrainPad Inc. All Rights Reserved.
// 前ページの処理続き
firstWords.saveAsTextFile(“hdfs://…”)
println(firstWords.count())
13
RDDのキャッシュ
上記は、firstWordsに対してアクションが2度実行されている。Sparkは通常、アク
ションの時にすべてを再計算するのでこのようなケースでは非効率となる。
そこで、キャッシュをする。
firstWords.cache()
firstWords.saveAsTextFile(“hdfs://…”)
println(firstWords.count())
firstWordsの途中経過が一旦メモリ上に保持され、続く2つのアクションはこの
キャッシュを使うようになり効率的に。
Copyright © BrainPad Inc. All Rights Reserved. 14
RDDのキャッシュ
filter map saveAsTextFileHDFS
filter map countHDFS
 キャッシュしない場合、全く同じ処理が2度行われる。
• HDFSからの読み込みも2回発生し、処理の間に読み込み対象が変
われば読み込む内容も変わる。
filter map saveAsTextFileHDFS
count
 キャッシュする場合、map処理までが省かれる。
cache
Copyright © BrainPad Inc. All Rights Reserved.
3. 実行モデルとスケジューリング
15
Copyright © BrainPad Inc. All Rights Reserved. 16
Sparkの実行モデル
Driver
Executor
 Driver
– ユーザープログラムをtaskに変換し、
executorに実行を命令する。
– Actionに伴いexecutorからデータを取得する。
– ユーザープログラムのmainメソッドを実行す
るJVMプロセス。driverが終了すると、Spark
アプリケーション自体が終了する。
 Executor
– driverから命令されたtaskを実行する。
– RDDのキャッシュを保持する。
– Spark起動時に起動されるJVMプロセス。
※実際には、YARNやMesosなどのクラスタマネージャ上で動作
するので、それによって実行モデルは若干異なります。
Executor
Executor
Copyright © BrainPad Inc. All Rights Reserved.
1. ユーザープログラムが、transformationを組み合わせてRDDの参照グラフを作
成する。
2. ユーザープログラムが、actionを実行する。
3. Driverが、RDDの参照グラフからStageのDAG(有向グラフ)を作成する。
– Stage
• 複数のTaskの集合。
• Shuffle(後述)が必要となるポイントでStageを分ける。
• 同じパーティションに対する処理が連続している場合、マージすることで最適化する。
– Task
• executorの実行する処理の最小単位。1パーティションごとに作成される。
4. Executorに各Stageの処理を命令する。
17
Driverによる実行計画作成
Copyright © BrainPad Inc. All Rights Reserved.
 Shuffle
– reduceByKey等により複数のパーティションを1つにまとめるため、データをある
executorから別のexecutorに転送する処理。
– 処理がローカルで済まなくなるため、パフォーマンス上のボトルネックになりやすい。
18
Shuffle
RDD
RDD
RDD
RDD
RDD
RDD
RDD
RDD
RDD
RDD
RDD
RDD
同じパーティションに閉じた処理ならシャッフルは
不要(mapなど)
別パーティションが必要になる処理では、
シャッフルが生じる。
Copyright © BrainPad Inc. All Rights Reserved.
 Stageは、Shuffleを境界として分断
される。
– このケースではjoinがShuffleを起こし
ている。
 同じパーティションに対する処理が連
続する場合、処理は1つのステージに
マージされる。(※)
– Stage1はmapとfilterの2つの処理があ
るが、実際にはmapとfilterを合成した
1つのStageに変換されている。
– これは“pipelining”と呼ばれる。
– Stageは複数のtaskで構成されており、
それぞれがexecutorで処理される。
※厳密には、親RDDが1つの子RDDからのみし
か参照されていない場合。(複数パーティション
をマージするunionもこれに該当する)
19
Stageの分割例
map filter
map
join
Stage1
Stage2
Stage3
Copyright © BrainPad Inc. All Rights Reserved.
4. その他の主要なSparkコンポーネント
20
Copyright © BrainPad Inc. All Rights Reserved.
 Sparkで、ストリーミング処理を行うためのコンポーネント。
 データは、一定間隔ごとにRDDとしてまとめられて処理される。
– このRDDのまとまりをDStreamと呼ぶ。
– Spark Streamingは一定間隔ごとにまとめられたRDDに対して処理を書くことになる
ので、書き方は通常のSparkプログラミングとほぼ変わらない。(マイクロバッチ)
21
Spark Streaming
ストリーミングデータ
RDD RDD RDD
5秒
例:5秒間隔ごとにストリーミングデータを処理する場合
5秒 5秒
DSteam
Copyright © BrainPad Inc. All Rights Reserved.
 Spark SQL
– 構造化されたRDD(SchemaRDD)に対してSQLで処理を記述するためのコンポーネ
ント。
– JSONやParquet、Hiveなどの様々なデータソースに対応。
 DataFrame
– RやPandas(Python)ライクなデータ操作が可能なコンポーネント。
– Spark1.3で追加された。
 Catalyst
– Spark SQLやDataFrameのコードを最適化するオプティマイザ(内部的に使用されて
いる)。
– 詳細についてはdatabricksのブログを参考。
• https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-
optimizer.html
22
Spark SQL、DataFrame
Copyright © BrainPad Inc. All Rights Reserved.
 Sparkで機械学習を行うためのコンポーネント
 用意されているアルゴリズム例
– SVM
– ロジスティック回帰
– 決定木
– K-means
– ALS
– などなど。
 Spark Streamingと組み合わせて使うオンライン学習機もあり。
– Streaming K-meansとか。
23
MLlib
Copyright © BrainPad Inc. All Rights Reserved.
5. まとめ
24
Copyright © BrainPad Inc. All Rights Reserved.
 Sparkは、インメモリ処理による高速化と、Spark Coreをベースとした多目的な
コンポーネントを持つ分散処理ソフトウェア。
 Scala,Java,PythonでSparkアプリケーションを記述可能。
– spark shellで気軽に試せるのが良い。
 Spark上で扱うデータはRDDとして抽象化され、処理は遅延実行される。
 Spark StreamingやMLlibなど、様々なコンポーネントがあり、互いに組み合わ
せて使えるためメンテナンス性が高く総合的な学習コストも低い。
 Learning SparkやAdvanced Analytics with Sparkが発売されるなど、情報も
揃ってきた感じ。
– 日本語情報も最近は増えてきた雰囲気がある。
– 今年のStrataはSpark関連のセッションが非常に多かったという話も。
25
まとめ
Copyright © BrainPad Inc. All Rights Reserved.
 Spark公式ドキュメント
– https://spark.apache.org/docs/latest/index.html
 Learning Spark
– http://shop.oreilly.com/product/0636920028512.do
 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory
Cluster Computing
– https://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf
26
参考
Copyright © BrainPad Inc. All Rights Reserved.
株式会社ブレインパッド
〒108-0071 東京都港区白金台3-2-10 白金台ビル3F
TEL:03-6721-7001
FAX:03-6721-7010
info@brainpad.co.jp
Copyright © BrainPad Inc. All Rights Reserved.
www.brainpad.co.jp

Apache Sparkについて

  • 1.
    Copyright © BrainPadInc. All Rights Reserved. Apache Sparkについて 2015年5月15日
  • 2.
    Copyright © BrainPadInc. All Rights Reserved. 1. Sparkとは 2
  • 3.
    Copyright © BrainPadInc. All Rights Reserved. 公式ドキュメントによると、 Apache Spark is a fast and general-purpose cluster computing system. そのまま訳すと、「高速」と「多目的」を特徴とした分散処理システム。 MapReduceに比べて、10倍~100倍程度のパフォーマンスが出ると言われている。  略歴 – 2009年からUC Berkleyで開発が始められる。 – 2010年にオープンソース化。 – 2013年にASFに寄贈される。 – 2014年にApache Top-Level Projectに昇格。 現在(2015/5/1時点)での最新バージョンは1.3.1。実装言語はScalaで、 Scala,Java,Pythonで使用可能。 3 Sparkとは
  • 4.
    Copyright © BrainPadInc. All Rights Reserved.  インメモリによる処理 – SparkはMapReduceとは異なりオンメモリでデータ処理をするため、mapやfilterなど の処理ごとに毎回ディスクIOが発生することはない。  RDD – 各ノードに分散して処理されるデータコレクションの抽象表現。 – Sparkでは、RDDに対してmapやreduceなどの処理を実行する。 – HDFSへの出力など、実際にデータが必要になるまで処理は遅延される。アクションが 起こった時に、処理の流れをたどって実際にデータロードやmapなどの処理を行う。 – RDDをメモリ上にキャッシュできるので、効率的に繰り返し処理が可能。 4 高速?
  • 5.
    Copyright © BrainPadInc. All Rights Reserved. Sparkは、Spark Coreを中心としたいくつかのサブコンポーネントから成り立って いる。 例えば、 – Spark SQL(構造化データに対して、SQLを使ってアクセス) – Spark Streaming(Spark上でストリーミングデータを処理) – MLlib(Spark上で機械学習) – GraphX(グラフデータを処理) すべてSpark Coreをベースとしているため、コードの再利用や学習コストの低下、 メンテナンス容易性の向上が期待できる。 5 多目的?
  • 6.
    Copyright © BrainPadInc. All Rights Reserved. SparkはBDAS(Berkeley Data Analytics Stack)の一部。 BDASとは、AMPlabで開発されている一連のデータ処理ソフトウェアスタック。 最近よく名前を聞くMesosなんかもここに含まれている。 6 多目的?
  • 7.
    Copyright © BrainPadInc. All Rights Reserved. 2. RDD 7
  • 8.
    Copyright © BrainPadInc. All Rights Reserved. 各ノードに分散して保持されるデータコレクションオブジェクト。 Sparkでは、このRDDを通じてデータの処理フローを定義していく。 RDDは、以下の性質を持つ。  パーティションによる分散 – データは複数のパーティションに分けられ、それぞれがクラスタ上に分散して処理され る。  遅延実行 – countやsaveAsTextFileなど、特定の操作が実行されるタイミングまですべての処理が 遅延される。  障害耐性 – RDDはイミュータブルで、データの途中経過を逐一保持しない。 – データがロストした場合は、RDDを再計算することでデータを復旧する。 • ミュータブルなデータをオンメモリで保持する場合、更新のたびにレプリケーションを取る必 要があるが、この方法はネットワークへの負荷が重い。 8 RDDとは
  • 9.
    Copyright © BrainPadInc. All Rights Reserved. RDDを作り出す方法は2種類ある。 1. コレクションオブジェクトから作成する。 val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) 2. 外部データソースから作成する。 val distFile = sc.textFile("data.txt") 9 RDDの作成方法
  • 10.
    Copyright © BrainPadInc. All Rights Reserved. 1. Transformation 既存のRDDから、変換処理などを通じて新しいRDDを作り出す処理。実行はActionが実行 されるまで遅延される。 例:map、filter、groupByKey 2. Action Driverにデータを戻したり、外部にデータを書き込んだりする処理。Actionが実行された タイミングで、それまで遅延されていた処理が実行される。 例:count、take、saveAsTextFile 10 RDDのインターフェース
  • 11.
    Copyright © BrainPadInc. All Rights Reserved.  RDDは主に以下のデータを保持する。 – 親RDDの参照 – 担当するパーティション • 例えばHDFSからファイルを読み込んでRDDを作った場合、そのファイルのブロックごとに パーティションが作られる。RDDは、このパーティションの集合と、それぞれのメタデータ (どこに配置されているかとか)を保持する。  Transformationごとに、新たなRDDオブジェクトが作成される。 11 RDDの構造 RDD RDD RDD transformationにより生成 transformationにより生成 参照を保持参照を保持
  • 12.
    Copyright © BrainPadInc. All Rights Reserved. // 1.HDFSからデータロード val lines = sc.textFile(“hdfs://…”) // 2.”target”という単語を含む行に絞込 val targetLines = lines.filter(_.contains(“target”)) // 3.先頭の単語を集める val firstWords = targetLines.map(_.split(“ “)(0)) // 4.HDFSに書き出す firstWords.saveAsTextFile(“hdfs://…”) 12 RDD処理イメージ 上記のような処理の場合、4のActionが実行されるまではどの処理も実行されない。
  • 13.
    Copyright © BrainPadInc. All Rights Reserved. // 前ページの処理続き firstWords.saveAsTextFile(“hdfs://…”) println(firstWords.count()) 13 RDDのキャッシュ 上記は、firstWordsに対してアクションが2度実行されている。Sparkは通常、アク ションの時にすべてを再計算するのでこのようなケースでは非効率となる。 そこで、キャッシュをする。 firstWords.cache() firstWords.saveAsTextFile(“hdfs://…”) println(firstWords.count()) firstWordsの途中経過が一旦メモリ上に保持され、続く2つのアクションはこの キャッシュを使うようになり効率的に。
  • 14.
    Copyright © BrainPadInc. All Rights Reserved. 14 RDDのキャッシュ filter map saveAsTextFileHDFS filter map countHDFS  キャッシュしない場合、全く同じ処理が2度行われる。 • HDFSからの読み込みも2回発生し、処理の間に読み込み対象が変 われば読み込む内容も変わる。 filter map saveAsTextFileHDFS count  キャッシュする場合、map処理までが省かれる。 cache
  • 15.
    Copyright © BrainPadInc. All Rights Reserved. 3. 実行モデルとスケジューリング 15
  • 16.
    Copyright © BrainPadInc. All Rights Reserved. 16 Sparkの実行モデル Driver Executor  Driver – ユーザープログラムをtaskに変換し、 executorに実行を命令する。 – Actionに伴いexecutorからデータを取得する。 – ユーザープログラムのmainメソッドを実行す るJVMプロセス。driverが終了すると、Spark アプリケーション自体が終了する。  Executor – driverから命令されたtaskを実行する。 – RDDのキャッシュを保持する。 – Spark起動時に起動されるJVMプロセス。 ※実際には、YARNやMesosなどのクラスタマネージャ上で動作 するので、それによって実行モデルは若干異なります。 Executor Executor
  • 17.
    Copyright © BrainPadInc. All Rights Reserved. 1. ユーザープログラムが、transformationを組み合わせてRDDの参照グラフを作 成する。 2. ユーザープログラムが、actionを実行する。 3. Driverが、RDDの参照グラフからStageのDAG(有向グラフ)を作成する。 – Stage • 複数のTaskの集合。 • Shuffle(後述)が必要となるポイントでStageを分ける。 • 同じパーティションに対する処理が連続している場合、マージすることで最適化する。 – Task • executorの実行する処理の最小単位。1パーティションごとに作成される。 4. Executorに各Stageの処理を命令する。 17 Driverによる実行計画作成
  • 18.
    Copyright © BrainPadInc. All Rights Reserved.  Shuffle – reduceByKey等により複数のパーティションを1つにまとめるため、データをある executorから別のexecutorに転送する処理。 – 処理がローカルで済まなくなるため、パフォーマンス上のボトルネックになりやすい。 18 Shuffle RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD 同じパーティションに閉じた処理ならシャッフルは 不要(mapなど) 別パーティションが必要になる処理では、 シャッフルが生じる。
  • 19.
    Copyright © BrainPadInc. All Rights Reserved.  Stageは、Shuffleを境界として分断 される。 – このケースではjoinがShuffleを起こし ている。  同じパーティションに対する処理が連 続する場合、処理は1つのステージに マージされる。(※) – Stage1はmapとfilterの2つの処理があ るが、実際にはmapとfilterを合成した 1つのStageに変換されている。 – これは“pipelining”と呼ばれる。 – Stageは複数のtaskで構成されており、 それぞれがexecutorで処理される。 ※厳密には、親RDDが1つの子RDDからのみし か参照されていない場合。(複数パーティション をマージするunionもこれに該当する) 19 Stageの分割例 map filter map join Stage1 Stage2 Stage3
  • 20.
    Copyright © BrainPadInc. All Rights Reserved. 4. その他の主要なSparkコンポーネント 20
  • 21.
    Copyright © BrainPadInc. All Rights Reserved.  Sparkで、ストリーミング処理を行うためのコンポーネント。  データは、一定間隔ごとにRDDとしてまとめられて処理される。 – このRDDのまとまりをDStreamと呼ぶ。 – Spark Streamingは一定間隔ごとにまとめられたRDDに対して処理を書くことになる ので、書き方は通常のSparkプログラミングとほぼ変わらない。(マイクロバッチ) 21 Spark Streaming ストリーミングデータ RDD RDD RDD 5秒 例:5秒間隔ごとにストリーミングデータを処理する場合 5秒 5秒 DSteam
  • 22.
    Copyright © BrainPadInc. All Rights Reserved.  Spark SQL – 構造化されたRDD(SchemaRDD)に対してSQLで処理を記述するためのコンポーネ ント。 – JSONやParquet、Hiveなどの様々なデータソースに対応。  DataFrame – RやPandas(Python)ライクなデータ操作が可能なコンポーネント。 – Spark1.3で追加された。  Catalyst – Spark SQLやDataFrameのコードを最適化するオプティマイザ(内部的に使用されて いる)。 – 詳細についてはdatabricksのブログを参考。 • https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst- optimizer.html 22 Spark SQL、DataFrame
  • 23.
    Copyright © BrainPadInc. All Rights Reserved.  Sparkで機械学習を行うためのコンポーネント  用意されているアルゴリズム例 – SVM – ロジスティック回帰 – 決定木 – K-means – ALS – などなど。  Spark Streamingと組み合わせて使うオンライン学習機もあり。 – Streaming K-meansとか。 23 MLlib
  • 24.
    Copyright © BrainPadInc. All Rights Reserved. 5. まとめ 24
  • 25.
    Copyright © BrainPadInc. All Rights Reserved.  Sparkは、インメモリ処理による高速化と、Spark Coreをベースとした多目的な コンポーネントを持つ分散処理ソフトウェア。  Scala,Java,PythonでSparkアプリケーションを記述可能。 – spark shellで気軽に試せるのが良い。  Spark上で扱うデータはRDDとして抽象化され、処理は遅延実行される。  Spark StreamingやMLlibなど、様々なコンポーネントがあり、互いに組み合わ せて使えるためメンテナンス性が高く総合的な学習コストも低い。  Learning SparkやAdvanced Analytics with Sparkが発売されるなど、情報も 揃ってきた感じ。 – 日本語情報も最近は増えてきた雰囲気がある。 – 今年のStrataはSpark関連のセッションが非常に多かったという話も。 25 まとめ
  • 26.
    Copyright © BrainPadInc. All Rights Reserved.  Spark公式ドキュメント – https://spark.apache.org/docs/latest/index.html  Learning Spark – http://shop.oreilly.com/product/0636920028512.do  Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing – https://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 26 参考
  • 27.
    Copyright © BrainPadInc. All Rights Reserved. 株式会社ブレインパッド 〒108-0071 東京都港区白金台3-2-10 白金台ビル3F TEL:03-6721-7001 FAX:03-6721-7010 info@brainpad.co.jp Copyright © BrainPad Inc. All Rights Reserved. www.brainpad.co.jp