Pythonで入門するApache Spark at PyCon2016

46

Click here to load reader

Transcript of Pythonで入門するApache Spark at PyCon2016

Page 1: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Pythonで入門する Apache Spark

2016年 9月 22日@PyConJP 2016

Page 2: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

名前– Tatsuya Atsumi– Twitter: https://twitter.com/__Attsun__

仕事– BrainPad– 自社製品( DMP)の開発

好きなもの– Python

• 6年くらい– Spark

• 1年半くらい

その他– 今年刊行された「詳解 Apache Spark」のレビュアーを担当させていただきました。とても良い本です!

2

自己紹介

Page 3: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

対象者– Sparkについて興味があるが、詳しいことはまだよく知らない方。– Pythonで基本的なプログラミングができる方。

狙い– Sparkについての基礎的な特徴を理解していただく。– Pythonを使った Sparkの使用方法について理解していただく。– Sparkのライブラリについて、特に SparkSQLとMLlibについての理解をしていただく。

3

本プレゼンでの対象者と狙い

Page 4: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

1. Apache Sparkの概要と歴史

2. 弊社内での Spark使用事例について

3. Apache Sparkの基礎(コア API)

4. Spark SQL

5. MLlib

6. まとめ

Appendix(実行モデルとスケジューリング)

4

アジェンダ

Page 5: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

1.  Apache Sparkの概要と歴史

5

Page 6: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

公式ドキュメントによると、

Apache Spark is a fast and general-purpose cluster computing system.

つまり、「高速」と「多目的」を特徴とした分散処理システム。

複数台のサーバを使って、大量のデータを高速に処理できる。

タスクのスケジューリングや障害発生時の復旧のような分散処理にまつわる面倒な点は Sparkがカバーしてくれる。

MapReduceで行われていたようなログ集計から、レコメンドシステム、リアルタイム処理まで幅広い用途で使われている。

6

Sparkとは

Page 7: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

中間データの少ないインメモリによる処理

7

高速?

入力データ 処理 中間

データ処理 出力

データ

MapReduceの場合、処理ごとに中間データを作成しているため、処理が増えるほどディスク IOが増え、パフォーマンスに影響を与える。

入力データ 処理 処理 出力

データ

Sparkの場合、中間データを出力する必要のない処理はまとめて実行される。(勿論、中間データが必要になるケースもある。)

Page 8: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

多様なライブラリ– Sparkには、便利なライブラリが最初から付属している。

• SparkSQL( DBや JSONなど構造化データに対して SQLを使ってアクセス)• Spark Streaming(ストリーミングデータ処理)• MLlib(機械学習)• GraphX(グラフデータ処理)

– すべて Sparkのコアコンポーネントをベースとしているため、コードの再利用や学習コストの低下、メンテナンス容易性の向上が期待できる。

8

多目的?

Page 9: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

多様な API– 以下4つのプログラミング言語をサポートしている。

• Python• Scala• Java• R

– Pythonは、以下バージョンをサポートしている。• 2.6以上• 3.4以上• PyPy2.3以上

– 今日は Python2.7をベースとした使い方について話します。

9

多目的?

Page 10: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

何であるか?– 大規模データの分散処理フレームワーク

• 従来のMapReduceの代替みたいなイメージ

何でないか?– 分散ファイルシステム( HDFS)

• HDFSや S3を代替するものではない。

– リソーススケジューラ( YARN, Mesos)• Sparkがこれらのリソーススケジューラ上で起動する。

– 小規模なデータを処理するツール• シンプルに Python書いたほうが速いし楽。• 増え続ける大規模データを一定の速度で処理したい、スケーラビリティを確保したい、というケースでなければはまらないと思われる。

10

Sparkは何であるか?何でないか?

Page 11: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

わかりやすいインターフェース– APIはmap, filterなど動作が把握できるものが多い。 SQLも使える。

高速– 大規模データを高速に処理できる。(従来のMapReduceに比べてという話)

様々なユースケースに対応できる多様なライブラリ– 機械学習、ストリーミングのようなモダンなユースケースに対応できるのは嬉しい。

従来のHadoopスタックが利用可能– YARNや HDFSといった、従来の Hadoopスタックを使用できるため、クラスタを新たに作り直す必要はない。

情報量の多さとコミュニティの安心感– 類似の様々なフレームワークが存在するが、情報量では Sparkに分がありそう。– バージョンアップを行う際にも後方互換生を気にしてくれるなど、開発も硬い。

11

なぜ Sparkを使うか?

Page 12: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

略歴– 2009年から UC Berkleyで開発が始められる。– 2010年にオープンソース化。– 2013年に Apache Software Foundationに寄贈される。– 2014年に Apache Top-Level Projectに昇格– 2014年にバージョン 1.0.0がリリース– 2016年にバージョン 2.0.0がリリース

現在( 2016/8/15時点)での最新バージョンは 2.0.0。今日の解説は 2.0.0を前提としています。

12

Sparkの歴史

Page 13: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

2. 弊社での Spark使用事例について

13

Page 14: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

DeltaCubeについて

弊社が開発する、 DMP製品。 サイトの行動ログなどから、ユーザーをセグメントに分けるツール。

Page 15: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

自動クラスタリング機能

人手を介さず、自動的にユーザーをいい感じにセグメントわけする機能。 これを Sparkで実現。

– 増え続ける大量のデータに対して複雑な処理をしたい、というニーズにぴったり。

Page 16: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 16

Sparkでの自動クラスタリングの流れ

ユーザーの行動ログから、 KMeansでクラスタリングをし、セグメントを判定して保存する。– 特徴量は、ユーザーの閲覧ページカテゴリの傾向

Page 17: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 17

Sparkでの自動クラスタリングの流れ

今日は基礎部分(コア API)を簡単に解説後、 Spark SQL, MLlibに焦点を絞って解説します。

Page 18: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

3.  Apache Sparkの基礎(コア API)

18

Page 19: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 19

(jupyter)Sparkをはじめてみよう

Sparkはインタプリターがあるので、お試しで起動するのもすごく簡単です。

デフォルトの Pythonインタープリタのほか、 iPythonや jupyter notebook上でも気軽に起動できます。

今回は jupyter notebook上で起動してみます。

Page 20: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

RDDは、クラスタ上に分散したデータを束ねるコレクションオブジェクト。

Sparkでプログラミングを行う際は、 RDDのみを意識し、個々のデータがどこにどのように分散されているか、という点は隠蔽されている。

そのため、ユーザーは通常のコレクションオブジェクトに対する操作を書く感覚で分散処理を実現できる。

20

RDD

データ

データ

データ

データデータ

データデータ

データ

データ

パーティション

ノード

RDD

Page 21: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

RDDは Transformationと呼ばれる処理ごとに、新たな RDDオブジェクトが作成される。– map– filter

実際の処理は、 Actionと呼ばれる処理が実行されるまで遅延される。– count– take– saveAsTextFile

21

遅延実行

RDD RDD RDD

transformationにより生成

transformationにより生成

参照を保持参照を保持

Page 22: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 22

(jupyter)RDDの処理イメージ

Page 23: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

4.  Spark SQL

23

Page 24: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

構造化されたデータに対して SQLで処理を記述するためのライブラリ– JSONとか CSVとか RDBとか。

DataFrame– 構造化データを保持するデータコレクション。 Pandasの DataFrameのようなイメージ。

– RDDをより使い勝手の良いのもにした感じ。

24

Spark SQLとは

Page 25: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 25

(jupyter) SparkSQLを動かしてみよう

Page 26: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

select, filter, join, limit, orderByのような基本的な操作

UDF(ユーザー定義関数)– もちろん、関数は Pythonで記述可能。– https://spark.apache.org/docs/latest/api/python/

pyspark.sql.html#pyspark.sql.SQLContext.registerFunction

window関数

abs, ceilのような関数

関数やメソッドはそれ以外にも数多くあります。 APIドキュメントを参照。

26

DataFrameのメソッド

Page 27: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

JSON

CSV

Parquet

HiveTable

その他– JDBC– ORC– 外部ライブラリを使うことで、 avroなどのフォーマットも扱えるようになります。

• csvはもともと外部ライブラリだったものが本体に取り込まれました。

27

様々なデータソース

Page 28: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

SQLで処理を記述する場合、 Spark固有の APIを使う必要がない。

DataFrameを使う場合でも、より少ないコードで可読性の高いコードが書ける。– RDDと比べて。

オプティマイザにより処理が最適化される– Databricksのベンチマークを参照

• https://databricks.com/blog/2015/04/24/recent-performance-improvements-in-apache-spark-sql-python-dataframes-and-more.html

– RDDによる処理は、 Scalaが Pythonの倍以上高速– DataFrameによる処理では言語間の差がないほか、 RDDよりも高速– RDDに比べて細かいチューニングが不要になる。

28

(jupyter)Spark SQLのメリット

Page 29: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

5. MLlib

29

Page 30: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Sparkで機械学習を行うためのライブラリ。

ロジスティック回帰や KMeansなど、基本的なものは揃っている。

spark.mlと spark.mllibという2つの APIがある。– 今回は DataFrameをベースとした spark.mlを解説。

30

MLlib

Page 31: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

学習モデルを作成する際によくある以下のような流れをシンプルに表現するための API– spark.mlのみ。– 皆さんが好きな scikit-learnライブラリの Pipelineに影響を受けたと書いてあります。– 入出力は DataFrame

31

パイプライン API

元データ 加工データ 特徴量データ 学習モデル

加工・抽出処理 特徴量作成処理 学習処理

Page 32: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Transformer– 入力データ( DataFrame)から異なる出力データ( DataFrame)を生成するコンポーネント。

– 文章から単語を生成する Tokenizerなど。• 「 This is a pen」 -> 「” This”, “is”, “a”, “pen”」

Estimator– DataFrameから Transformerを生成するコンポーネント。– LogisticRegressionや KMeansなどの学習アルゴリズム。

Pipeline– Transformerや Estimatorを組み合わせて予測モデルを構築する。

32

パイプライン APIを構成するコンポーネント

Page 33: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 33

パイプライン APIを構成するコンポーネント

元データ 加工データ 特徴量データ 学習モデル

加工・抽出処理 特徴量作成処理 学習処理

Pipeline

Transformer Estimator

先ほどの図をコンポーネントにわけると以下のような分類となる。

Page 34: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

スパムメッセージの判定を行う。– データセット

• UCI(カリフォルニア大学アーバイン校)にあるやつ• https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection• Sparkが生まれたのはバークレー校

– 特徴量• 単語の出現頻度

– モデル• ロジスティック回帰

– 扱うライブラリ• SparkML• DataFrame

34

( jupyter) SparkML(&DataFrame)の使用例

Page 35: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

6. まとめ

35

Page 36: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Sparkは、インメモリ処理による高速性と、多目的なライブラリを持つ分散処理フレームワーク。

Spark SQLとMLlibを組み合わせることで、弊社のケースのような大規模データに対する複雑な処理も簡単に。

データ量の少ないタスクにとっては速度的にも運用負荷の面でもいいことがないと思われるので、やみくもな導入は避けたい。

36

まとめ

Page 37: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

自分で動かしてみて、 Sparkを体感してみましょう。

本を買ってみましょう。

GraphXや Spark Streamingなど、今回触れなかったライブラリについて調べてみましょう。

Driverや Executorといった実行モデルについて調べてみましょう。

Shuffle処理について調べてみましょう。– パフォーマンス改善の勘所の一つ

37

さらに知りたい方へ

Page 38: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

ブレインパッドでは、「データ分析」と「エンジニアリング」の融合により新しい価値を提供したいエンジニア・データサイエンティストを募集しています!

ご興味ある方は是非お気軽に話しかけてください!

38

WE ARE HIRING !!

Page 39: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

ご静聴ありがとうございました。

39

Page 40: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

株式会社ブレインパッド

〒 108-0071 東京都港区白金台 3-2-10 白金台ビル 3FTEL: 03-6721-7001FAX: [email protected]

Copyright © BrainPad Inc. All Rights Reserved.

www.brainpad.co.jp

Page 41: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Appendix: 実行モデルとスケジューリング

41

Page 42: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved. 42

Sparkの実行モデル

Driver

Executor

Driver– ユーザープログラムを taskに変換し、 executorに実行を命令する。

– Actionに伴い executorからデータを取得する。

– ユーザープログラムのmainメソッドを実行する JVMプロセス。 driverが終了すると、 Sparkアプリケーション自体が終了する。

Executor– driverから命令された taskを実行する。– RDDのキャッシュを保持する。– Spark起動時に起動される JVMプロセス。

※実際には、 YARNやMesosなどのクラスタマネージャ上で動作するので、それによって実行モデルは若干異なります。

ExecutorExecutor

Page 43: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

1. ユーザープログラムが、 transformationを組み合わせて RDDの参照グラフを作成する。

2. ユーザープログラムが、 actionを実行する。

3. Driverが、 RDDの依存グラフから実行プランを作成する。– 実行プランは複数のステージからなる。– Stage

• 複数の Taskの集合。• Shuffle(後述)が必要となるポイントで Stageを分ける。• 同じパーティションに対する処理が連続している場合、マージすることで最適化する。

– Task• executorの実行する処理の最小単位。1パーティションごとに作成される。

4. Executorに各 Stageの処理を命令する。

43

Driverによる実行計画作成

Page 44: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

Shuffle– reduceByKey等により複数のパーティションを1つにまとめるため、データをある

executorから別の executorに転送する処理。– 処理がローカルで済まなくなるため、パフォーマンス上のボトルネックになりやすい。– Shuffleがある場合、 Stageの分割が発生する。

44

Shuffle

RDD

RDD

RDD

RDD

RDD

RDD

RDD

RDD

RDD

RDD

RDD

RDD

同じパーティションに閉じた処理ならシャッフルは不要(mapなど)

別パーティションが必要になる処理では、シャッフルが生じる。

Page 45: Pythonで入門するApache Spark at PyCon2016

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もこれに該当する)

45

Stageの分割例

map filter

map

join

Stage1

Stage2

Stage3

Page 46: Pythonで入門するApache Spark at PyCon2016

Copyright © BrainPad Inc. All Rights Reserved.

py4jを使って、 Pythonプログラムと JVMでやりとりをする。

アクションやシャッフル処理は、基本的には Java / Scalaと同じく JVM上で実行される。– 一部のアクションやmap、 filter等に渡される関数は JVMが起動する Pythonで実行される。

46

Pythonでの Spark実行モデル

Python py4j Driver(JVM)py4j Executer

Executer

Executer(JVM) Python

Python

Python