pythonで入門するapache spark at pycon2016
TRANSCRIPT
Copyright © BrainPad Inc. All Rights Reserved.
Pythonで入門する Apache Spark
2016年 9月 22日@PyConJP 2016
Copyright © BrainPad Inc. All Rights Reserved.
名前– Tatsuya Atsumi– Twitter: https://twitter.com/__Attsun__
仕事– BrainPad– 自社製品( DMP)の開発
好きなもの– Python
• 6年くらい– Spark
• 1年半くらい
その他– 今年刊行された「詳解 Apache Spark」のレビュアーを担当させていただきました。とても良い本です!
2
自己紹介
Copyright © BrainPad Inc. All Rights Reserved.
対象者– Sparkについて興味があるが、詳しいことはまだよく知らない方。– Pythonで基本的なプログラミングができる方。
狙い– Sparkについての基礎的な特徴を理解していただく。– Pythonを使った Sparkの使用方法について理解していただく。– Sparkのライブラリについて、特に SparkSQLとMLlibについての理解をしていただく。
3
本プレゼンでの対象者と狙い
Copyright © BrainPad Inc. All Rights Reserved.
1. Apache Sparkの概要と歴史
2. 弊社内での Spark使用事例について
3. Apache Sparkの基礎(コア API)
4. Spark SQL
5. MLlib
6. まとめ
Appendix(実行モデルとスケジューリング)
4
アジェンダ
Copyright © BrainPad Inc. All Rights Reserved.
1. Apache Sparkの概要と歴史
5
Copyright © BrainPad Inc. All Rights Reserved.
公式ドキュメントによると、
Apache Spark is a fast and general-purpose cluster computing system.
つまり、「高速」と「多目的」を特徴とした分散処理システム。
複数台のサーバを使って、大量のデータを高速に処理できる。
タスクのスケジューリングや障害発生時の復旧のような分散処理にまつわる面倒な点は Sparkがカバーしてくれる。
MapReduceで行われていたようなログ集計から、レコメンドシステム、リアルタイム処理まで幅広い用途で使われている。
6
Sparkとは
Copyright © BrainPad Inc. All Rights Reserved.
中間データの少ないインメモリによる処理
7
高速?
入力データ 処理 中間
データ処理 出力
データ
MapReduceの場合、処理ごとに中間データを作成しているため、処理が増えるほどディスク IOが増え、パフォーマンスに影響を与える。
入力データ 処理 処理 出力
データ
Sparkの場合、中間データを出力する必要のない処理はまとめて実行される。(勿論、中間データが必要になるケースもある。)
Copyright © BrainPad Inc. All Rights Reserved.
多様なライブラリ– Sparkには、便利なライブラリが最初から付属している。
• SparkSQL( DBや JSONなど構造化データに対して SQLを使ってアクセス)• Spark Streaming(ストリーミングデータ処理)• MLlib(機械学習)• GraphX(グラフデータ処理)
– すべて Sparkのコアコンポーネントをベースとしているため、コードの再利用や学習コストの低下、メンテナンス容易性の向上が期待できる。
8
多目的?
Copyright © BrainPad Inc. All Rights Reserved.
多様な API– 以下4つのプログラミング言語をサポートしている。
• Python• Scala• Java• R
– Pythonは、以下バージョンをサポートしている。• 2.6以上• 3.4以上• PyPy2.3以上
– 今日は Python2.7をベースとした使い方について話します。
9
多目的?
Copyright © BrainPad Inc. All Rights Reserved.
何であるか?– 大規模データの分散処理フレームワーク
• 従来のMapReduceの代替みたいなイメージ
何でないか?– 分散ファイルシステム( HDFS)
• HDFSや S3を代替するものではない。
– リソーススケジューラ( YARN, Mesos)• Sparkがこれらのリソーススケジューラ上で起動する。
– 小規模なデータを処理するツール• シンプルに Python書いたほうが速いし楽。• 増え続ける大規模データを一定の速度で処理したい、スケーラビリティを確保したい、というケースでなければはまらないと思われる。
10
Sparkは何であるか?何でないか?
Copyright © BrainPad Inc. All Rights Reserved.
わかりやすいインターフェース– APIはmap, filterなど動作が把握できるものが多い。 SQLも使える。
高速– 大規模データを高速に処理できる。(従来のMapReduceに比べてという話)
様々なユースケースに対応できる多様なライブラリ– 機械学習、ストリーミングのようなモダンなユースケースに対応できるのは嬉しい。
従来のHadoopスタックが利用可能– YARNや HDFSといった、従来の Hadoopスタックを使用できるため、クラスタを新たに作り直す必要はない。
情報量の多さとコミュニティの安心感– 類似の様々なフレームワークが存在するが、情報量では Sparkに分がありそう。– バージョンアップを行う際にも後方互換生を気にしてくれるなど、開発も硬い。
11
なぜ Sparkを使うか?
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の歴史
Copyright © BrainPad Inc. All Rights Reserved.
2. 弊社での Spark使用事例について
13
Copyright © BrainPad Inc. All Rights Reserved.
DeltaCubeについて
弊社が開発する、 DMP製品。 サイトの行動ログなどから、ユーザーをセグメントに分けるツール。
Copyright © BrainPad Inc. All Rights Reserved.
自動クラスタリング機能
人手を介さず、自動的にユーザーをいい感じにセグメントわけする機能。 これを Sparkで実現。
– 増え続ける大量のデータに対して複雑な処理をしたい、というニーズにぴったり。
Copyright © BrainPad Inc. All Rights Reserved. 16
Sparkでの自動クラスタリングの流れ
ユーザーの行動ログから、 KMeansでクラスタリングをし、セグメントを判定して保存する。– 特徴量は、ユーザーの閲覧ページカテゴリの傾向
Copyright © BrainPad Inc. All Rights Reserved. 17
Sparkでの自動クラスタリングの流れ
今日は基礎部分(コア API)を簡単に解説後、 Spark SQL, MLlibに焦点を絞って解説します。
Copyright © BrainPad Inc. All Rights Reserved.
3. Apache Sparkの基礎(コア API)
18
Copyright © BrainPad Inc. All Rights Reserved. 19
(jupyter)Sparkをはじめてみよう
Sparkはインタプリターがあるので、お試しで起動するのもすごく簡単です。
デフォルトの Pythonインタープリタのほか、 iPythonや jupyter notebook上でも気軽に起動できます。
今回は jupyter notebook上で起動してみます。
Copyright © BrainPad Inc. All Rights Reserved.
RDDは、クラスタ上に分散したデータを束ねるコレクションオブジェクト。
Sparkでプログラミングを行う際は、 RDDのみを意識し、個々のデータがどこにどのように分散されているか、という点は隠蔽されている。
そのため、ユーザーは通常のコレクションオブジェクトに対する操作を書く感覚で分散処理を実現できる。
20
RDD
データ
データ
データ
データデータ
データデータ
データ
データ
パーティション
ノード
RDD
Copyright © BrainPad Inc. All Rights Reserved.
RDDは Transformationと呼ばれる処理ごとに、新たな RDDオブジェクトが作成される。– map– filter
実際の処理は、 Actionと呼ばれる処理が実行されるまで遅延される。– count– take– saveAsTextFile
21
遅延実行
RDD RDD RDD
transformationにより生成
transformationにより生成
参照を保持参照を保持
Copyright © BrainPad Inc. All Rights Reserved. 22
(jupyter)RDDの処理イメージ
Copyright © BrainPad Inc. All Rights Reserved.
4. Spark SQL
23
Copyright © BrainPad Inc. All Rights Reserved.
構造化されたデータに対して SQLで処理を記述するためのライブラリ– JSONとか CSVとか RDBとか。
DataFrame– 構造化データを保持するデータコレクション。 Pandasの DataFrameのようなイメージ。
– RDDをより使い勝手の良いのもにした感じ。
24
Spark SQLとは
Copyright © BrainPad Inc. All Rights Reserved. 25
(jupyter) SparkSQLを動かしてみよう
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のメソッド
Copyright © BrainPad Inc. All Rights Reserved.
JSON
CSV
Parquet
HiveTable
その他– JDBC– ORC– 外部ライブラリを使うことで、 avroなどのフォーマットも扱えるようになります。
• csvはもともと外部ライブラリだったものが本体に取り込まれました。
27
様々なデータソース
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のメリット
Copyright © BrainPad Inc. All Rights Reserved.
5. MLlib
29
Copyright © BrainPad Inc. All Rights Reserved.
Sparkで機械学習を行うためのライブラリ。
ロジスティック回帰や KMeansなど、基本的なものは揃っている。
spark.mlと spark.mllibという2つの APIがある。– 今回は DataFrameをベースとした spark.mlを解説。
30
MLlib
Copyright © BrainPad Inc. All Rights Reserved.
学習モデルを作成する際によくある以下のような流れをシンプルに表現するための API– spark.mlのみ。– 皆さんが好きな scikit-learnライブラリの Pipelineに影響を受けたと書いてあります。– 入出力は DataFrame
31
パイプライン API
元データ 加工データ 特徴量データ 学習モデル
加工・抽出処理 特徴量作成処理 学習処理
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を構成するコンポーネント
Copyright © BrainPad Inc. All Rights Reserved. 33
パイプライン APIを構成するコンポーネント
元データ 加工データ 特徴量データ 学習モデル
加工・抽出処理 特徴量作成処理 学習処理
Pipeline
Transformer Estimator
先ほどの図をコンポーネントにわけると以下のような分類となる。
Copyright © BrainPad Inc. All Rights Reserved.
スパムメッセージの判定を行う。– データセット
• UCI(カリフォルニア大学アーバイン校)にあるやつ• https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection• Sparkが生まれたのはバークレー校
– 特徴量• 単語の出現頻度
– モデル• ロジスティック回帰
– 扱うライブラリ• SparkML• DataFrame
34
( jupyter) SparkML(&DataFrame)の使用例
Copyright © BrainPad Inc. All Rights Reserved.
6. まとめ
35
Copyright © BrainPad Inc. All Rights Reserved.
Sparkは、インメモリ処理による高速性と、多目的なライブラリを持つ分散処理フレームワーク。
Spark SQLとMLlibを組み合わせることで、弊社のケースのような大規模データに対する複雑な処理も簡単に。
データ量の少ないタスクにとっては速度的にも運用負荷の面でもいいことがないと思われるので、やみくもな導入は避けたい。
36
まとめ
Copyright © BrainPad Inc. All Rights Reserved.
自分で動かしてみて、 Sparkを体感してみましょう。
本を買ってみましょう。
GraphXや Spark Streamingなど、今回触れなかったライブラリについて調べてみましょう。
Driverや Executorといった実行モデルについて調べてみましょう。
Shuffle処理について調べてみましょう。– パフォーマンス改善の勘所の一つ
37
さらに知りたい方へ
Copyright © BrainPad Inc. All Rights Reserved.
ブレインパッドでは、「データ分析」と「エンジニアリング」の融合により新しい価値を提供したいエンジニア・データサイエンティストを募集しています!
ご興味ある方は是非お気軽に話しかけてください!
38
WE ARE HIRING !!
Copyright © BrainPad Inc. All Rights Reserved.
ご静聴ありがとうございました。
39
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
Copyright © BrainPad Inc. All Rights Reserved.
Appendix: 実行モデルとスケジューリング
41
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
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による実行計画作成
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など)
別パーティションが必要になる処理では、シャッフルが生じる。
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
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