Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで入門するApache Spark

Tatsuya Atsumi
September 22, 2016

Pythonで入門するApache Spark

PyCon JP 2016での発表資料

Tatsuya Atsumi

September 22, 2016
Tweet

More Decks by Tatsuya Atsumi

Other Decks in Technology

Transcript

  1. Copyright © BrainPad Inc. All Rights Reserved. n 名前 –

    Tatsuya Atsumi – Twitter: https://twitter.com/__Attsun__ n 仕事 – BrainPad – ⾃社製品(DMP)の開発 n 好きなもの – Python • 6年くらい – Spark • 1年半くらい n その他 – 今年刊⾏された「詳解Apache Spark」のレビュアーを担当させていただきました。と ても良い本です! 2 ⾃⼰紹介
  2. Copyright © BrainPad Inc. All Rights Reserved. n 対象者 –

    Sparkについて興味があるが、詳しいことはまだよく知らない⽅。 – Pythonで基本的なプログラミングができる⽅。 n 狙い – Sparkについての基礎的な特徴を理解していただく。 – Pythonを使ったSparkの使⽤⽅法について理解していただく。 – Sparkのライブラリについて、特にSparkSQLとMLlibについての理解をしていただく。 3 本プレゼンでの対象者と狙い
  3. Copyright © BrainPad Inc. All Rights Reserved. 1. Apache Sparkの概要と歴史

    2. 弊社内でのSpark使⽤事例について 3. Apache Sparkの基礎(コアAPI) 4. Spark SQL 5. MLlib 6. まとめ n Appendix(実⾏モデルとスケジューリング) 4 アジェンダ
  4. Copyright © BrainPad Inc. All Rights Reserved. 公式ドキュメントによると、 Apache Spark

    is a fast and general-purpose cluster computing system. つまり、「⾼速」と「多⽬的」を特徴とした分散処理システム。 n 複数台のサーバを使って、⼤量のデータを⾼速に処理できる。 n タスクのスケジューリングや障害発⽣時の復旧のような分散処理にまつわる⾯倒 な点はSparkがカバーしてくれる。 n MapReduceで⾏われていたようなログ集計から、レコメンドシステム、リアル タイム処理まで幅広い⽤途で使われている。 6 Sparkとは
  5. Copyright © BrainPad Inc. All Rights Reserved. n 中間データの少ないインメモリによる処理 7

    ⾼速? ⼊⼒ データ 処理 中間 データ 処理 出⼒ データ MapReduceの場合、処理ごとに中間データを作成しているため、処理が増えるほどディ スクIOが増え、パフォーマンスに影響を与える。 ⼊⼒ データ 処理 処理 出⼒ データ Sparkの場合、中間データを出⼒する必要のない処理はまとめて実⾏される。(勿論、中 間データが必要になるケースもある。)
  6. Copyright © BrainPad Inc. All Rights Reserved. n 多様なライブラリ –

    Sparkには、便利なライブラリが最初から付属している。 • SparkSQL(DBやJSONなど構造化データに対してSQLを使ってアクセス) • Spark Streaming(ストリーミングデータ処理) • MLlib(機械学習) • GraphX(グラフデータ処理) – すべてSparkのコアコンポーネントをベースとしているため、コードの再利⽤や学習コ ストの低下、メンテナンス容易性の向上が期待できる。 8 多⽬的?
  7. Copyright © BrainPad Inc. All Rights Reserved. n 多様なAPI –

    以下4つのプログラミング⾔語をサポートしている。 • Python • Scala • Java • R – Pythonは、以下バージョンをサポートしている。 • 2.6以上 • 3.4以上 • PyPy2.3以上 – 今⽇はPython2.7をベースとした使い⽅について話します。 9 多⽬的?
  8. Copyright © BrainPad Inc. All Rights Reserved. n 何であるか? –

    ⼤規模データの分散処理フレームワーク • 従来のMapReduceの代替みたいなイメージ n 何でないか? – 分散ファイルシステム(HDFS) • HDFSやS3を代替するものではない。 – リソーススケジューラ(YARN, Mesos) • Sparkがこれらのリソーススケジューラ上で起動する。 – ⼩規模なデータを処理するツール • シンプルにPython書いたほうが速いし楽。 • 増え続ける⼤規模データを⼀定の速度で処理したい、スケーラビリティを確保したい、という ケースでなければはまらないと思われる。 10 Sparkは何であるか?何でないか?
  9. Copyright © BrainPad Inc. All Rights Reserved. n わかりやすいインターフェース –

    APIはmap, filterなど動作が把握できるものが多い。SQLも使える。 n ⾼速 – ⼤規模データを⾼速に処理できる。(従来のMapReduceに⽐べてという話) n 様々なユースケースに対応できる多様なライブラリ – 機械学習、ストリーミングのようなモダンなユースケースに対応できるのは嬉しい。 n 従来のHadoopスタックが利⽤可能 – YARNやHDFSといった、従来のHadoopスタックを使⽤できるため、クラスタを新た に作り直す必要はない。 n 情報量の多さとコミュニティの安⼼感 – 類似の様々なフレームワークが存在するが、情報量ではSparkに分がありそう。 – バージョンアップを⾏う際にも後⽅互換⽣を気にしてくれるなど、開発も硬い。 11 なぜSparkを使うか?
  10. Copyright © BrainPad Inc. All Rights Reserved. n 略歴 –

    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の歴史
  11. Copyright © BrainPad Inc. All Rights Reserved. DeltaCubeについて n 弊社が開発する、DMP製品。

    n サイトの⾏動ログなどから、ユーザーをセグメントに分けるツール。
  12. Copyright © BrainPad Inc. All Rights Reserved. ⾃動クラスタリング機能 n ⼈⼿を介さず、⾃動的にユーザーをいい感じにセグメントわけする機能。

    n これをSparkで実現。 – 増え続ける⼤量のデータに対して複雑な処理をしたい、というニーズにぴったり。
  13. Copyright © BrainPad Inc. All Rights Reserved. 16 Sparkでの⾃動クラスタリングの流れ n

    ユーザーの⾏動ログから、KMeansでクラスタリングをし、セグメントを判定し て保存する。 – 特徴量は、ユーザーの閲覧ページカテゴリの傾向
  14. Copyright © BrainPad Inc. All Rights Reserved. 17 Sparkでの⾃動クラスタリングの流れ n

    今⽇は基礎部分(コアAPI)を簡単に解説後、Spark SQL, MLlibに焦点を絞って 解説します。
  15. Copyright © BrainPad Inc. All Rights Reserved. 19 (jupyter)Sparkをはじめてみよう Sparkはインタプリターがあるので、お試しで起動するのもすごく簡単です。

    デフォルトのPythonインタープリタのほか、iPythonやjupyter notebook上でも気 軽に起動できます。 今回はjupyter notebook上で起動してみます。
  16. Copyright © BrainPad Inc. All Rights Reserved. n RDDは、クラスタ上に分散したデータを束ねるコレクションオブジェクト。 n

    Sparkでプログラミングを⾏う際は、RDDのみを意識し、個々のデータがどこに どのように分散されているか、という点は隠蔽されている。 n そのため、ユーザーは通常のコレクションオブジェクトに対する操作を書く感覚 で分散処理を実現できる。 20 RDD データ データ データ データ データ データ データ データ データ パーティション ノード RDD
  17. Copyright © BrainPad Inc. All Rights Reserved. n RDDはTransformationと呼ばれる処理ごとに、新たなRDDオブジェクトが作 成される。

    – map – filter n 実際の処理は、Actionと呼ばれる処理が実⾏されるまで遅延される。 – count – take – saveAsTextFile 21 遅延実⾏ RDD RDD RDD transformationにより⽣成 transformationにより⽣成 参照を保持 参照を保持
  18. Copyright © BrainPad Inc. All Rights Reserved. n 構造化されたデータに対してSQLで処理を記述するためのライブラリ –

    JSONとかCSVとかRDBとか。 n DataFrame – 構造化データを保持するデータコレクション。PandasのDataFrameのようなイメージ。 – RDDをより使い勝⼿の良いのもにした感じ。 24 Spark SQLとは
  19. Copyright © BrainPad Inc. All Rights Reserved. n select, filter,

    join, limit, orderByのような基本的な操作 n UDF(ユーザー定義関数) – もちろん、関数はPythonで記述可能。 – https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.S QLContext.registerFunction n window関数 n abs, ceilのような関数 関数やメソッドはそれ以外にも数多くあります。APIドキュメントを参照。 26 DataFrameのメソッド
  20. Copyright © BrainPad Inc. All Rights Reserved. n JSON n

    CSV n Parquet n HiveTable n その他 – JDBC – ORC – 外部ライブラリを使うことで、avroなどのフォーマットも扱えるようになります。 • csvはもともと外部ライブラリだったものが本体に取り込まれました。 27 様々なデータソース
  21. Copyright © BrainPad Inc. All Rights Reserved. n SQLで処理を記述する場合、Spark固有のAPIを使う必要がない。 n

    DataFrameを使う場合でも、より少ないコードで可読性の⾼いコードが書ける。 – RDDと⽐べて。 n オプティマイザにより処理が最適化される – 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のメリット
  22. Copyright © BrainPad Inc. All Rights Reserved. n Sparkで機械学習を⾏うためのライブラリ。 n

    ロジスティック回帰やKMeansなど、基本的なものは揃っている。 n spark.mlとspark.mllibという2つのAPIがある。 – 今回はDataFrameをベースとしたspark.mlを解説。 30 MLlib
  23. Copyright © BrainPad Inc. All Rights Reserved. n 学習モデルを作成する際によくある以下のような流れをシンプルに表現するため のAPI

    – spark.mlのみ。 – 皆さんが好きなscikit-learnライブラリのPipelineに影響を受けたと書いてあります。 – ⼊出⼒はDataFrame 31 パイプラインAPI 元データ 加⼯データ 特徴量データ 学習モデル 加⼯・抽出処理 特徴量作成処理 学習処理
  24. Copyright © BrainPad Inc. All Rights Reserved. n Transformer –

    ⼊⼒データ(DataFrame)から異なる出⼒データ(DataFrame)を⽣成するコンポー ネント。 – ⽂章から単語を⽣成するTokenizerなど。 • 「This is a pen」-> 「”This”, “is”, “a”, “pen”」 n Estimator – DataFrameからTransformerを⽣成するコンポーネント。 – LogisticRegressionやKMeansなどの学習アルゴリズム。 n Pipeline – TransformerやEstimatorを組み合わせて予測モデルを構築する。 32 パイプラインAPIを構成するコンポーネント
  25. Copyright © BrainPad Inc. All Rights Reserved. 33 パイプラインAPIを構成するコンポーネント 元データ

    加⼯データ 特徴量データ 学習モデル 加⼯・抽出処理 特徴量作成処理 学習処理 Pipeline Transformer Estimator n 先ほどの図をコンポーネントにわけると以下のような分類となる。
  26. Copyright © BrainPad Inc. All Rights Reserved. n スパムメッセージの判定を⾏う。 –

    データセット • UCI(カリフォルニア⼤学アーバイン校)にあるやつ • https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection • Sparkが⽣まれたのはバークレー校 – 特徴量 • 単語の出現頻度 – モデル • ロジスティック回帰 – 扱うライブラリ • SparkML • DataFrame 34 (jupyter)SparkML(&DataFrame)の使⽤例
  27. Copyright © BrainPad Inc. All Rights Reserved. n Sparkは、インメモリ処理による⾼速性と、多⽬的なライブラリを持つ分散処理 フレームワーク。

    n Spark SQLとMLlibを組み合わせることで、弊社のケースのような⼤規模データ に対する複雑な処理も簡単に。 n データ量の少ないタスクにとっては速度的にも運⽤負荷の⾯でもいいことがない と思われるので、やみくもな導⼊は避けたい。 36 まとめ
  28. Copyright © BrainPad Inc. All Rights Reserved. n ⾃分で動かしてみて、Sparkを体感してみましょう。 n

    本を買ってみましょう。 n GraphXやSpark Streamingなど、今回触れなかったライブラリについて調べて みましょう。 n DriverやExecutorといった実⾏モデルについて調べてみましょう。 n Shuffle処理について調べてみましょう。 – パフォーマンス改善の勘所の⼀つ 37 さらに知りたい⽅へ
  29. 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
  30. Copyright © BrainPad Inc. All Rights Reserved. 42 Sparkの実⾏モデル Driver

    Executor n Driver – ユーザープログラムをtaskに変換し、 executorに実⾏を命令する。 – Actionに伴いexecutorからデータを取得する。 – ユーザープログラムのmainメソッドを実⾏す るJVMプロセス。driverが終了すると、Spark アプリケーション⾃体が終了する。 n Executor – driverから命令されたtaskを実⾏する。 – RDDのキャッシュを保持する。 – Spark起動時に起動されるJVMプロセス。 ※実際には、YARNやMesosなどのクラスタマ ネージャ上で動作するので、それによって実⾏モ デルは若⼲異なります。 Executor Executor
  31. 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による実⾏計画作成
  32. Copyright © BrainPad Inc. All Rights Reserved. n Shuffle –

    reduceByKey等により複数のパーティションを1つにまとめるため、データをある executorから別のexecutorに転送する処理。 – 処理がローカルで済まなくなるため、パフォーマンス上のボトルネックになりやすい。 – Shuffleがある場合、Stageの分割が発⽣する。 44 Shuffle RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD RDD 同じパーティションに閉じた処理ならシャッフルは 不要(mapなど) 別パーティションが必要になる処理では、 シャッフルが⽣じる。
  33. Copyright © BrainPad Inc. All Rights Reserved. n Stageは、Shuffleを境界として分断 される。

    – このケースではjoinがShuffleを起こし ている。 n 同じパーティションに対する処理が連 続する場合、処理は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
  34. Copyright © BrainPad Inc. All Rights Reserved. n py4jを使って、PythonプログラムとJVMでやりとりをする。 n

    アクションやシャッフル処理は、基本的にはJava / Scalaと同じくJVM上で実⾏される。 – ⼀部のアクションやmap、filter等に渡される関数はJVMが起動するPythonで実⾏される。 46 PythonでのSpark実⾏モデル Python py4j Driver (JVM) py4j Executer Executer Executer (JVM) Python Python Python