Apache Sparkについて

27
Copyright © BrainPad Inc. All Rights Reserved. Apache Sparkについて 2015年5月15日

Transcript of Apache Sparkについて

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などのクラスタマネージャ上で動作するので、それによって実行モデルは若干異なります。

ExecutorExecutor

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

[email protected]

Copyright © BrainPad Inc. All Rights Reserved.

www.brainpad.co.jp