Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
/ 76
ゼロから始めるSparkSQL徹底活用!
~Sparkのインストールから、 SparkSQLの概要紹介、
実務で活用するためのノウハウまでを紹介します~
ビッグデータ部 加嵜長門
2017年3月21日 【 ヒカ☆ラボ 】
/ 76
自己紹介
• 加嵜 長門(カサキ ナガト)
• 2014年4月~ DMM.comラボ
• Hadoop基盤構築・Sparkを用いたレコメンド開発
2
『詳解Apache Spark』(2016年4月29日)
8章 GraphXを担当
...
/ 76
今日の発表予定
• ゼロから始めるSparkSQL徹底活用!
3
19:45 ~ 20:50 発表
Sparkの章 20分 + 質疑応答 5分
SQLの章 20分 + 質疑応答 5分
SparkSQLの章 15分
20:50 ~ 21...
/ 76
ATNDでいただいたコメント
4
https://atnd.org/events/85919
SQLを使い始めたので聞きに行きたいです
運用やSQL初心者ですが、今後OSSなど含めて取り組んでいきた
いと思っています。
Apache ...
/ 76
A
x 人
B
x 人
C
x 人
D
x 人
会場への質問
5
Spark経験有りSpark経験無し
SQL経験有り
SQL経験無し
SQLのSELECT句, FROM句, WHERE句の意味が
分かる
何らかの方法(spark-s...
/ 76
Sparkの章
6
/ 76
Sparkの章
• 2015年6月
• IBMがSparkプロジェクトに3500名を投
入と発表
• Apache Spark
• オープンソースの分散処理フレームワー
クのデファクトスタンダードとなりつつ
ある
7
http://j...
/ 76
Sparkとは?
8
http://spark.apache.org/docs/latest/
/ 76
Sparkとは?
9
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general-purpose cluster computing system.
/ 76
Sparkとは?
10
http://spark.apache.org/docs/latest/
It provides high-level APIs in Java, Scala, Python and R, and an
opt...
/ 76
Sparkとは?
11
http://spark.apache.org/docs/latest/
It also supports a rich set of higher-level tools including Spark SQ...
/ 76
general execution graphs?
12
http://spark.apache.org/docs/latest/
It provides high-level APIs in Java, Scala, Python ...
/ 76
general execution graphs?
• DAG(Directed Acyclic Graph)実行エンジン
13
https://databricks.com/blog/2015/06/22/understanding...
/ 76
general execution graphs?
• DAG(Directed Acyclic Graph)実行エンジン
• 分かりやすい説明:
• http://nave-kazu.hatenablog.com/entry/201...
/ 76
general-purpose cluster computing system??
15
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general...
/ 76
general-purpose cluster computing system??
• Sparkは「分散処理のための汎用的なフレームワーク」とよく
言われる
• cluster computing (クラスターコンピューティング)...
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• cf. 物理的に離れたコンピュータ...
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• cf. 大量のコアを用いて並列処理...
/ 76
general-purpose cluster computing system??
• クラスターコンピューティング
• 比較的密なネットワークで接続されたコンピュータを用いて分散処理
を行う
• クラスターコンピューティングのプロ...
/ 76
general-purpose cluster computing system??
• クラスターコンピューティングのプログラミングモデルの特徴
20
プログラミング
モデル
特徴 用途
MapReduce 分散ディスクI/Oで高ス...
/ 76
【余談】 SparkでDeep Learning
• Sparkで利用できるDeep Learningフレームワークまとめ
http://data.gunosy.io/entry/spark-deep-learning
• Eleph...
/ 76
【余談】 SparkでDeep Learning - DMMの事例
『Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現』
Cloudera World Tokyo 2016
22
http:/...
/ 76
fast???
23
http://spark.apache.org/docs/latest/
Apache Spark is a fast and general-purpose cluster computing system.
/ 76
fast???
• Sparkは「速い」のか?
24
http://spark.apache.org/
→ Hadoop(MapReduce)との比較
/ 76
fast???
• MapReduceとの比較
• 100倍はさすがに極端な例
(MapReduceが不得意なイテレーション処理での比較)
• 全般的には3倍程度速い
25
https://www.slideshare.net/kna...
/ 76
fast???
• MapReduce以外との比較
• スケールアウト可能なSQLエンジンのベンチマークテスト:
Presto vs Spark SQL vs Hive on Tez
http://recruit.gmo.jp/eng...
/ 76
fast???
• MapReduce以外との比較
• PageRankアルゴリズムのベンチマーク
27
http://www.cl.cam.ac.uk/~ey204/teaching/ACS/R212_2013_2014/prese...
/ 76
fast???
• ちなみにSpark公式ページでは、このグラフが逆転する
28
http://spark.apache.org/graphx/
→ どちらの主張も正しい(後述)
/ 76
a rich set of higher-level tools
29
http://spark.apache.org/docs/latest/
It also supports a rich set of higher-level ...
/ 76
a rich set of higher-level tools
• 主なSparkコンポーネントと、その競合ソフトウェア
30
分野 Sparkコンポーネント 他のソフトウェア
SQL Spark SQL Presto, Hive ...
/ 76
では、Sparkのメリットとは?
• 再度、PageRank
アルゴリズムのパ
フォーマンス比較
31
https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-...
/ 76
では、Sparkのメリットとは?
• 生データの取得か
ら活用までのデー
タフロー例
32
https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
/ 76
では、Sparkのメリットとは?
• 前処理、後処理を
含めたデータ処理
全体の実行時間で
比べれば、Spark
が速い
33
https://www.yumpu.com/en/document/view/23451357/graph...
/ 76
では、Sparkのメリットとは?
• End-to-endの処理を一つのアプリケーションとして実装できる
汎用性
• 前処理、後処理までSparkで実現可能
• さまざまなインターフェース(Python, Scala, Java, R...
/ 76
Sparkインストール
• Spark実行環境
• Java 7以上必須(Java 8推奨)
• 必要に応じてScala 2.10+, Python 2.6+/3.4+, R 3.1+をインストール
• (Java 7, Scala ...
/ 76
Spark動作確認
• サンプルプログラムの実行
36
$./bin/run-example SparkPi 10
=> Pi is roughly 3.1435951435951437
• サンプルプログラムは ./examples...
/ 76
Spark動作確認
• Sparkアプリケーションの実行 (spark-submit)
37
# Pythonサンプルプログラムの実行
$./bin/spark-submit examples/src/main/python/pi.p...
/ 76
Spark動作確認
• インタラクティブシェルの実行
38
$./bin/spark-shell # Scalaシェル
$./bin/pyspark # Pythonシェル
$./bin/sparkR # Rシェル
$./bin/sp...
/ 76
質疑応答
39
/ 76
SQLの章
40
/ 76
SQLの章
• The 9 Most In-Demand Programming Languages of 2017
41
http://www.codingdojo.com/blog/9-most-in-demand-program...
/ 76
分析用途でよく使うSQL構文
• CTE(WITH句)
• ウィンドウ関数
• フレーム指定
• 集約関数+CASE式
42
/ 76
実践SQL: ABC分析
• ABC分析のレポート例
• 売上の70%は上位の極少数
の商品で構成される
• 売上の合計額を高い順に並
べ、構成比累計を計算
• 構成比累計に従って、
Aランク: 上位0~70%
Bランク: 上位70~...
/ 76
実践SQL: ABC分析
• サンプル購入ログ (purchase_log)
44
日付 (dt) 商品 (item) 価格 (amount)
2017-03-01 Onion 100
2017-03-01 Tomato 100
20...
/ 76
実践SQL: ABC分析
• 月別売上の集計
45
WITH
monthly_sales AS (
SELECT item, SUM(amount) AS amount
FROM purchase_log
WHERE
dt BETWE...
/ 76
実践SQL: ABC分析
• 構成比、構成比累計の計算
46
WITH
monthly_sales AS ( ... )
, sales_composition_ratio AS (
SELECT item, amount
, 100...
/ 76
実践SQL: ABC分析
• ABCランクの判定
47
WITH
monthly_sales AS ( ... )
, sales_composition_ratio AS ( ... )
SELECT
item
, cum_rati...
/ 76
実践SQL:検索ログ分析
• サンプル検索ログ (search_log)
48
タイムスタンプ
(stamp)
セッションID
(session)
アクション
(action)
検索ワード
(keyword)
検索結果数
(resul...
/ 76
実践SQL:検索ログ分析
• 検索アクションの次のアクションを補完する
49
WITH
search_log_with_next_action AS (
SELECT action, keyword, result_num
, LEA...
/ 76
WITH
search_log_with_next_action AS ( ... )
SELECT
keyword
, COUNT(1) AS search_count
, AVG(CASE WHEN next_action = '...
/ 76
SQLのメリット
• ハードウェア(物理設計)に依存しない
• 言語仕様が標準化されており、クエリをどのように解釈して実行する
かはミドルウェアに依存する
• INDEXは標準SQLではない
• “標準SQLは、インデックスその他あら...
/ 76
SQLのデメリット
• 複雑なクエリが読みにくい
• WITH句で段階的に記述できるが、限界はある
• 冗長な記述になりやすい
• SELECT句とWHERE句で同じ計算が必要
• 複雑な計算結果に名前をつけるためだけにサブクエリが必...
/ 76
もっと詳しく知りたい方は
53
https://www.amazon.co.jp/dp/4839961263
/ 76
質疑応答
54
/ 76
SparkSQLの章
55
/ 76
SparkSQLの章
• SparkSQL
• SparkのSQLインターフェイス
• SQL単体でもSparkを実行可能 (spark-sqlクライアント)
• Scala, Java, Python, RなどのSparkプログラム...
/ 76
SparkSQLの章
• DataFrames, Datasetsとの関係
• もともとRDDをSQLライクに操作するための機能であった
SchemaRDDsが、 Spark 1.3でRDDから独立してDataFramesとなった
•...
/ 76
SparkSQLの章
• まだアクティブに開発中で、更新が激しい
• 最新の機能や使い方については、
GitBook の Mastering Apache Spark 2 が詳しい
58
https://www.gitbook.com...
/ 76
SparkSQLの使い方
• DataFrameをアドホックに作成し、テーブルとして登録
59
// Found at http://stackoverflow.com/a/32514683/1305344
val dataset =...
/ 76
SparkSQLの使い方
• 登録されたテーブルに対してSQLを発行
60
// Inside spark-shell
scala > sql(
"""SELECT date_string,
from_unixtime(unix_ti...
/ 76
SparkSQLの使い方
• ファイルからDataFrameを作成
61
val df = spark.read.json("examples/src/main/resources/people.json")
// Displays ...
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
62
df.printSchema()
// root
// |-- age: long (nullable = true)
// |--...
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
63
// Select everybody, but increment the age by 1
df.select($"name",...
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
64
// Select people older than 21
df.filter($"age" > 21).show()
// +-...
/ 76
DataFrame API
• SQLだけでなく、DataFramesのオペレーションも使える
65
// Count people by age
df.groupBy("age").count().show()
// +----+-...
/ 76
実践SparkSQL: ABC分析
• サンプルデータの作成
66
case class Sales(item: String, amount: Int)
val monthlySales = Seq(
Sales("Onion", ...
/ 76
実践SparkSQL: ABC分析
• ウィンドウ関数の使用
67
import org.apache.spark.sql.expressions._
monthlySales.
withColumn("totalAmount", s...
/ 76
実践SparkSQL: ABC分析
• withColumnの連結で前のカラムを再利用できる
68
monthlySales.
withColumn("totalAmount", sum("amount") over Window.p...
/ 76
実践SparkSQL: ABC分析
• UDFの定義
69
// ABC分析のランク判定用UDF
val abcUdf = udf { r: Double =>
r match {
case r if (0 <= r && r <= ...
/ 76
実践SparkSQL: ABC分析
• UDFの使用
70
monthlySales.
withColumn("totalAmount", sum("amount") over Window.partitionBy()).
withC...
/ 76
実践SparkSQL: ABC分析
• SQLの記述との比較
71
WITH
sales_composition_ratio AS (
SELECT item, amount
, 100.0 * amount / NULLIF(SUM...
/ 76
実践SparkSQL: ABC分析
• ロジック中にテストやアサーションを入れられる
72
// amountに0を含むデータ
val malMonthlySales = Seq(
Sales("Onion", 185000),
Sa...
/ 76
DataFramesベースのSparkモジュール
• ML Pipelines
• 機械学習の典型的な処理(モデル、学習、テストなど)をパイプライ
ン化
• パイプラインの保存や再利用、パラメタを少しずつ変えて実行などが
簡単に行える...
/ 76
発表まとめ
• Spark
• End-to-endの処理を一つのアプリケーションとして実装できる汎用性
• 機械学習、グラフ処理、ストリーム処理などのモジュールが充実
• SQL
• 分析用途のSQLの需要拡大
• SparkSQL...
/ 76
お知らせ(今後のイベント)
• 3月28日(火)
• 【 ヒカ☆ラボ 】ビッグデータを使ってバナーを動的表示させたらコン
バージョンが 323% 増加した話~Golang x Presto での高速集計処理 と Docker
を利用し...
/ 76
質疑応答
76
Nächste SlideShare
Wird geladen in …5
×

ゼロから始めるSparkSQL徹底活用!

2017年3月21日 ヒカラボ登壇資料
【 ヒカ☆ラボ 】ゼロから始めるSparkSQL徹底活用!~Sparkのインストールから、 SparkSQLの概要紹介、実務で活用するためのノウハウまでを紹介します~
https://atnd.org/events/85919

  • Als Erste(r) kommentieren

ゼロから始めるSparkSQL徹底活用!

  1. 1. / 76 ゼロから始めるSparkSQL徹底活用! ~Sparkのインストールから、 SparkSQLの概要紹介、 実務で活用するためのノウハウまでを紹介します~ ビッグデータ部 加嵜長門 2017年3月21日 【 ヒカ☆ラボ 】
  2. 2. / 76 自己紹介 • 加嵜 長門(カサキ ナガト) • 2014年4月~ DMM.comラボ • Hadoop基盤構築・Sparkを用いたレコメンド開発 2 『詳解Apache Spark』(2016年4月29日) 8章 GraphXを担当 『ビッグデータ分析・活用のためのSQLレシピ』(2017年3月27日) SQL全般、レコメンドなどを担当
  3. 3. / 76 今日の発表予定 • ゼロから始めるSparkSQL徹底活用! 3 19:45 ~ 20:50 発表 Sparkの章 20分 + 質疑応答 5分 SQLの章 20分 + 質疑応答 5分 SparkSQLの章 15分 20:50 ~ 21:00 質疑応答・アンケート 21:00 ~ 21:30 懇親会(ドリンクとお菓子をご用意しています)
  4. 4. / 76 ATNDでいただいたコメント 4 https://atnd.org/events/85919 SQLを使い始めたので聞きに行きたいです 運用やSQL初心者ですが、今後OSSなど含めて取り組んでいきた いと思っています。 Apache Spark自体は未経験ですが今後触ることになりそうで興味 があり参加させていただきます。 sparkでリアルタイムな機械学習に挑戦したいです
  5. 5. / 76 A x 人 B x 人 C x 人 D x 人 会場への質問 5 Spark経験有りSpark経験無し SQL経験有り SQL経験無し SQLのSELECT句, FROM句, WHERE句の意味が 分かる 何らかの方法(spark-submit, spark-shell, ...)で Sparkジョブを実行したことがある SQL経験有り Spark経験有り
  6. 6. / 76 Sparkの章 6
  7. 7. / 76 Sparkの章 • 2015年6月 • IBMがSparkプロジェクトに3500名を投 入と発表 • Apache Spark • オープンソースの分散処理フレームワー クのデファクトスタンダードとなりつつ ある 7 http://jp.techcrunch.com/2015/06/16/20150615ibm-pours-researchers-and-resources-into-apache-spark-project/
  8. 8. / 76 Sparkとは? 8 http://spark.apache.org/docs/latest/
  9. 9. / 76 Sparkとは? 9 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  10. 10. / 76 Sparkとは? 10 http://spark.apache.org/docs/latest/ It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs.
  11. 11. / 76 Sparkとは? 11 http://spark.apache.org/docs/latest/ It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
  12. 12. / 76 general execution graphs? 12 http://spark.apache.org/docs/latest/ It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs.
  13. 13. / 76 general execution graphs? • DAG(Directed Acyclic Graph)実行エンジン 13 https://databricks.com/blog/2015/06/22/understanding-your-spark-application-through-visualization.html
  14. 14. / 76 general execution graphs? • DAG(Directed Acyclic Graph)実行エンジン • 分かりやすい説明: • http://nave-kazu.hatenablog.com/entry/2015/11/30/154810 • 複雑なデータ処理フローを、循環のない有向グラフで表現 • 実行計画を自動的に最適化してくれる • 適切にキャッシュを用いることで劇的にパフォーマンスを向上 できる 14
  15. 15. / 76 general-purpose cluster computing system?? 15 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  16. 16. / 76 general-purpose cluster computing system?? • Sparkは「分散処理のための汎用的なフレームワーク」とよく 言われる • cluster computing (クラスターコンピューティング) ≠ distributed computing (分散処理) 16
  17. 17. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • cf. 物理的に離れたコンピュータを用いて分散処理を行う グリッドコンピューティング • 衛星画像の処理、DNA配列のデータベース化など • ネットワークIOが少ない処理に向く 17
  18. 18. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • cf. 大量のコアを用いて並列処理を行うGPGPU • 動画エンコーディング、ディープラーニング、ビットコインのマイニ ングなど • 条件分岐がないベクトル計算に向く 18
  19. 19. / 76 general-purpose cluster computing system?? • クラスターコンピューティング • 比較的密なネットワークで接続されたコンピュータを用いて分散処理 を行う • クラスターコンピューティングのプログラミングモデル • MapReduce → Hadoop • RDD+DAG → Spark • BSP: Bulk Synchronous Parallel → Apache Hama 19
  20. 20. / 76 general-purpose cluster computing system?? • クラスターコンピューティングのプログラミングモデルの特徴 20 プログラミング モデル 特徴 用途 MapReduce 分散ディスクI/Oで高スループット を実現 大規模で単純なバッチ処理 RDD+DAG 複雑な処理をDAGで表現し、 実行計画を最適化 機械学習などの複雑な繰り返し 処理 ※ ただしDeep Learningは難しい BSP 各Worker間で差分データのみを 通信し、ネットワークI/Oを削減 グラフ処理などの単純な繰り返 し処理
  21. 21. / 76 【余談】 SparkでDeep Learning • Sparkで利用できるDeep Learningフレームワークまとめ http://data.gunosy.io/entry/spark-deep-learning • Elephas • Deeplearning4j • SparkNet • CaffeOnSpark • TensorFlow on Spark • Sparkling Water (H2O + Spark) http://qiita.com/pyr_revs/items/82443fe9728b2b027948 21 Deep Learningを高速で実 現するためには、GPUの活 用がほぼ必須
  22. 22. / 76 【余談】 SparkでDeep Learning - DMMの事例 『Deep Learningを用いた類似画像レコメンドのSQL on Hadoopによる実現』 Cloudera World Tokyo 2016 22 http://labotech.dmm.com/entry/2016/11/11/154709 Deep Learningの処理にはSparkを 用いず、学習結果のみを利用する 方式
  23. 23. / 76 fast??? 23 http://spark.apache.org/docs/latest/ Apache Spark is a fast and general-purpose cluster computing system.
  24. 24. / 76 fast??? • Sparkは「速い」のか? 24 http://spark.apache.org/ → Hadoop(MapReduce)との比較
  25. 25. / 76 fast??? • MapReduceとの比較 • 100倍はさすがに極端な例 (MapReduceが不得意なイテレーション処理での比較) • 全般的には3倍程度速い 25 https://www.slideshare.net/knagato/hive-on-spark-hadoop-spark-conference-japan-2016 Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
  26. 26. / 76 fast??? • MapReduce以外との比較 • スケールアウト可能なSQLエンジンのベンチマークテスト: Presto vs Spark SQL vs Hive on Tez http://recruit.gmo.jp/engineer/jisedai/blog/presto_spark_hive/ 26 SparkとTezが同じくらい、 Prestoはその3倍速い
  27. 27. / 76 fast??? • MapReduce以外との比較 • PageRankアルゴリズムのベンチマーク 27 http://www.cl.cam.ac.uk/~ey204/teaching/ACS/R212_2013_2014/presentation/S8/Niko_GraphLabx.pdf Mahout(MapReduce) vs GraphX(Spark) vs PowerGraph(GraphLab) MapReduceよりは速いが、 GraphLabよりは遅い
  28. 28. / 76 fast??? • ちなみにSpark公式ページでは、このグラフが逆転する 28 http://spark.apache.org/graphx/ → どちらの主張も正しい(後述)
  29. 29. / 76 a rich set of higher-level tools 29 http://spark.apache.org/docs/latest/ It also supports a rich set of higher-level tools including Spark SQL for SQL and structured data processing, MLlib for machine learning, GraphX for graph processing, and Spark Streaming.
  30. 30. / 76 a rich set of higher-level tools • 主なSparkコンポーネントと、その競合ソフトウェア 30 分野 Sparkコンポーネント 他のソフトウェア SQL Spark SQL Presto, Hive on Tez, Redshift, BigQuery, ... 機械学習 MLlib TensorFlow, Torch, Mxnet, ... グラフ処理 GraphX Graphlab, Titan, Microsoft Graph Engine, ... ストリーム処理 Spark Streaming Apache Flink, Apache Storm, ... それぞれの分野で見た場合、特出した機能がある訳ではない
  31. 31. / 76 では、Sparkのメリットとは? • 再度、PageRank アルゴリズムのパ フォーマンス比較 31 https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
  32. 32. / 76 では、Sparkのメリットとは? • 生データの取得か ら活用までのデー タフロー例 32 https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
  33. 33. / 76 では、Sparkのメリットとは? • 前処理、後処理を 含めたデータ処理 全体の実行時間で 比べれば、Spark が速い 33 https://www.yumpu.com/en/document/view/23451357/graphxstrata2014-final
  34. 34. / 76 では、Sparkのメリットとは? • End-to-endの処理を一つのアプリケーションとして実装できる 汎用性 • 前処理、後処理までSparkで実現可能 • さまざまなインターフェース(Python, Scala, Java, R, SQL) • さまざまなデータソース(HDFS, S3, Kafka, JDBC, ...) • 特定の目的に特化するのであれば、Spark以外の選択肢が最善 の場合もある 同じデータやクラスタを、さまざまな目的で汎用的に使いたい なら、Sparkがベスト 34
  35. 35. / 76 Sparkインストール • Spark実行環境 • Java 7以上必須(Java 8推奨) • 必要に応じてScala 2.10+, Python 2.6+/3.4+, R 3.1+をインストール • (Java 7, Scala 2.10, Python 2.6はdeprecated) • ダウンロードページ • http://spark.apache.org/downloads.html • Hadoop関連ライブラリ同梱版も利用できる • https://ja.osdn.net/projects/win-hadoop/ • Windowsの場合は winutils.exe も必要 • 参考: http://hired.hateblo.jp/entry/2015/12/10/183000 35
  36. 36. / 76 Spark動作確認 • サンプルプログラムの実行 36 $./bin/run-example SparkPi 10 => Pi is roughly 3.1435951435951437 • サンプルプログラムは ./examples/src/main/* にある • ログレベルを変えるには、conf/log4j.propertiesファイルで指定
  37. 37. / 76 Spark動作確認 • Sparkアプリケーションの実行 (spark-submit) 37 # Pythonサンプルプログラムの実行 $./bin/spark-submit examples/src/main/python/pi.py 10 # Rサンプルプログラムの実行 $./bin/spark-submit examples/src/main/r/dataframe.R
  38. 38. / 76 Spark動作確認 • インタラクティブシェルの実行 38 $./bin/spark-shell # Scalaシェル $./bin/pyspark # Pythonシェル $./bin/sparkR # Rシェル $./bin/spark-sql # SQLシェル
  39. 39. / 76 質疑応答 39
  40. 40. / 76 SQLの章 40
  41. 41. / 76 SQLの章 • The 9 Most In-Demand Programming Languages of 2017 41 http://www.codingdojo.com/blog/9-most-in-demand-programming-languages-of-2017/ 2016年に引き続き、SQLの需要が1位 アプリケーションで実行されるSQLを生で 記述する機会は減っているが、 それ以上に分析用途のSQLの需要が高 まっている。 例: Hive, Redshift, BigQuery, SparkSQL, ...
  42. 42. / 76 分析用途でよく使うSQL構文 • CTE(WITH句) • ウィンドウ関数 • フレーム指定 • 集約関数+CASE式 42
  43. 43. / 76 実践SQL: ABC分析 • ABC分析のレポート例 • 売上の70%は上位の極少数 の商品で構成される • 売上の合計額を高い順に並 べ、構成比累計を計算 • 構成比累計に従って、 Aランク: 上位0~70% Bランク: 上位70~90% Cランク: 上位90~100% というランク分けを行う 43 『ビッグデータ分析・活用のためのSQLレシピ』 p.116
  44. 44. / 76 実践SQL: ABC分析 • サンプル購入ログ (purchase_log) 44 日付 (dt) 商品 (item) 価格 (amount) 2017-03-01 Onion 100 2017-03-01 Tomato 100 2017-03-01 Green Onion 80 2017-03-01 Eggplant 120 … … …
  45. 45. / 76 実践SQL: ABC分析 • 月別売上の集計 45 WITH monthly_sales AS ( SELECT item, SUM(amount) AS amount FROM purchase_log WHERE dt BETWEEN '2017-03-01' AND '2017-03-31' GROUP BY item ) SELECT * FROM monthly_sales; item amount Onion 185,000 Tomato 168,000 Green Onion 130,000 Eggplant 98,000 … …
  46. 46. / 76 実践SQL: ABC分析 • 構成比、構成比累計の計算 46 WITH monthly_sales AS ( ... ) , sales_composition_ratio AS ( SELECT item, amount , 100.0 * amount / NULLIF(SUM(amount) OVER(), 0) AS comp_ratio , 100.0 * SUM(amount) OVER(ORDER BY amount DESC) / NULLIF(SUM(amount) OVER(), 0) AS cum_ratio FROM monthly_sales ) SELECT * FROM sales_composition_ratio; item amount comp_ratio cum_ratio Onion 185,000 19.331 19.331 Tomato 168,000 17.554 36.886 Green Onion 130,000 13.584 50.470 ウィンドウ関数で全 体売上・累計売上 を計算 分母が0のときは NULLに変換
  47. 47. / 76 実践SQL: ABC分析 • ABCランクの判定 47 WITH monthly_sales AS ( ... ) , sales_composition_ratio AS ( ... ) SELECT item , cum_ratio , CASE WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A' WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B' WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C' END AS abc_rank FROM sales_composition_ratio; item cum_ratio abc_rank Onion 19.331 A Tomato 36.886 A … … … Carrot 74.721 B … … … CASE式で値を 変換
  48. 48. / 76 実践SQL:検索ログ分析 • サンプル検索ログ (search_log) 48 タイムスタンプ (stamp) セッションID (session) アクション (action) 検索ワード (keyword) 検索結果数 (result_num) 2017-03-01 10:00:00 Fad5bg Search Pstgres 0 2017-03-01 10:00:01 Fad5bg Search Postgres 889 2017-03-01 10:00:05 Fad5bg Click 2017-03-01 10:00:07 Fad5bg Search Hive 864 … … …
  49. 49. / 76 実践SQL:検索ログ分析 • 検索アクションの次のアクションを補完する 49 WITH search_log_with_next_action AS ( SELECT action, keyword, result_num , LEAD(action) OVER(PARTITION BY session ORDER BY stamp) AS next_action , LEAD(keyword) OVER(PARTITION BY session ORDER BY stamp) AS next_keyword , LEAD(result_num) OVER(PARTITION BY session ORDER BY stamp) AS next_result_num FROM search_log ) SELECT * FROM search_log_with_next_action WHERE action = 'search'; action keyword result_num next_action next_keyword next_result_num Search Pstgres 0 Search Postgres 889 Search Postgres 889 Click Search Hive 864 … … … 再検索 クリック 離脱 LEAD関数で次のレ コードの値を取得
  50. 50. / 76 WITH search_log_with_next_action AS ( ... ) SELECT keyword , COUNT(1) AS search_count , AVG(CASE WHEN next_action = 'search' THEN 1.0 ELSE 0.0 END) AS retry_rate , AVG(CASE WHEN next_action = 'click' THEN 1.0 ELSE 0.0 END) AS click_rate , AVG(CASE WHEN next_action IS NULL THEN 1.0 ELSE 0.0 END) AS exit_rate FROM search_log_with_next_action WHERE action = 'search' GROUP BY keyword; 実践SQL:検索ログ分析 • クリック率、再検索率、離脱率を同時に計算する 50 keyword search_count retry_rate click_rate exit_rate Postgres 1082 0.2145 0.1548 0.6307 … … … 0除算の考慮 は不要 CASE式で0, 1 のフラグ に変換し、AVGで集約
  51. 51. / 76 SQLのメリット • ハードウェア(物理設計)に依存しない • 言語仕様が標準化されており、クエリをどのように解釈して実行する かはミドルウェアに依存する • INDEXは標準SQLではない • “標準SQLは、インデックスその他あらゆる物理的なデータアクセス方法を定義 していない”(ジョー・セルコ(著)、ミック(訳)『プログラマのためのSQL 第4版』) • 歴史が長く、ノウハウが蓄積されている 51
  52. 52. / 76 SQLのデメリット • 複雑なクエリが読みにくい • WITH句で段階的に記述できるが、限界はある • 冗長な記述になりやすい • SELECT句とWHERE句で同じ計算が必要 • 複雑な計算結果に名前をつけるためだけにサブクエリが必要 • デバッグが難しい • 途中結果を確認できない 52
  53. 53. / 76 もっと詳しく知りたい方は 53 https://www.amazon.co.jp/dp/4839961263
  54. 54. / 76 質疑応答 54
  55. 55. / 76 SparkSQLの章 55
  56. 56. / 76 SparkSQLの章 • SparkSQL • SparkのSQLインターフェイス • SQL単体でもSparkを実行可能 (spark-sqlクライアント) • Scala, Java, Python, RなどのSparkプログラムに、シームレスに組み 込むこともできる 56 http://spark.apache.org/sql/
  57. 57. / 76 SparkSQLの章 • DataFrames, Datasetsとの関係 • もともとRDDをSQLライクに操作するための機能であった SchemaRDDsが、 Spark 1.3でRDDから独立してDataFramesとなった • この時点では、型付けやラムダ関数など、RDDが持っていたメリットが損なわれ ており、使い分けが必要だった • Spark 1.6で、RDDとDataFramesのメリットを併せ持つ Dataset APIが 導入され、Spark 2.0でDataFramesはDatasetsに統合された 57 https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark- apis-rdds-dataframes-and-datasets.html
  58. 58. / 76 SparkSQLの章 • まだアクティブに開発中で、更新が激しい • 最新の機能や使い方については、 GitBook の Mastering Apache Spark 2 が詳しい 58 https://www.gitbook.com/book/jaceklaskowski/mastering-apache-spark/details
  59. 59. / 76 SparkSQLの使い方 • DataFrameをアドホックに作成し、テーブルとして登録 59 // Found at http://stackoverflow.com/a/32514683/1305344 val dataset = Seq( "08/11/2015", "09/11/2015", "09/12/2015").toDF("date_string") dataset.registerTempTable("dates") https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
  60. 60. / 76 SparkSQLの使い方 • 登録されたテーブルに対してSQLを発行 60 // Inside spark-shell scala > sql( """SELECT date_string, from_unixtime(unix_timestamp(date_string,'MM/dd/yyyy'), 'EEEEE') AS dow FROM dates""").show +-----------+--------+ |date_string| dow| +-----------+--------+ | 08/11/2015| Tuesday| | 09/11/2015| Friday| | 09/12/2015|Saturday| +-----------+--------+ https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
  61. 61. / 76 SparkSQLの使い方 • ファイルからDataFrameを作成 61 val df = spark.read.json("examples/src/main/resources/people.json") // Displays the content of the DataFrame to stdout df.show() // +----+-------+ // | age| name| // +----+-------+ // |null|Michael| // | 30| Andy| // | 19| Justin| // +----+-------+ http://spark.apache.org/docs/latest/sql-programming-guide.html 代表的な読み込み関数 spark.read.json spark.read.csv spark.read.orc spark.read.parquet spark.read.text spark.read.jdbc
  62. 62. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 62 df.printSchema() // root // |-- age: long (nullable = true) // |-- name: string (nullable = true) // Select only the "name" column df.select("name").show() // +-------+ // | name| // +-------+ // |Michael| // | Andy| // | Justin| // +-------+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  63. 63. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 63 // Select everybody, but increment the age by 1 df.select($"name", $"age" + 1).show() // +-------+---------+ // | name|(age + 1)| // +-------+---------+ // |Michael| null| // | Andy| 31| // | Justin| 20| // +-------+---------+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  64. 64. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 64 // Select people older than 21 df.filter($"age" > 21).show() // +---+----+ // |age|name| // +---+----+ // | 30|Andy| // +---+----+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  65. 65. / 76 DataFrame API • SQLだけでなく、DataFramesのオペレーションも使える 65 // Count people by age df.groupBy("age").count().show() // +----+-----+ // | age|count| // +----+-----+ // | 19| 1| // |null| 1| // | 30| 1| // +----+-----+ http://spark.apache.org/docs/latest/sql-programming-guide.html
  66. 66. / 76 実践SparkSQL: ABC分析 • サンプルデータの作成 66 case class Sales(item: String, amount: Int) val monthlySales = Seq( Sales("Onion", 185000), Sales("Tomato", 168000), Sales("Green Onion", 130000) ).toDS() monthlySales.show() +-----------+------+ | item|amount| +-----------+------+ | Onion|185000| | Tomato|168000| |Green Onion|130000| +-----------+------+
  67. 67. / 76 実践SparkSQL: ABC分析 • ウィンドウ関数の使用 67 import org.apache.spark.sql.expressions._ monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). show() +-----------+------+-----------+---------+ | item|amount|totalAmount|cumAmount| +-----------+------+-----------+---------+ |Green Onion|130000| 483000| 130000| | Tomato|168000| 483000| 298000| | Onion|185000| 483000| 483000| +-----------+------+-----------+---------+
  68. 68. / 76 実践SparkSQL: ABC分析 • withColumnの連結で前のカラムを再利用できる 68 monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount"). withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount"). show() +-----------+------+-----------+---------+--------+--------+ | item|amount|totalAmount|cumAmount|compRate| cumRate| +-----------+------+-----------+---------+--------+--------+ |Green Onion|130000| 483000| 130000| 26.9151| 26.9151| | Tomato|168000| 483000| 298000| 34.7826| 61.6977| | Onion|185000| 483000| 483000| 38.3022|100.0000| +-----------+------+-----------+---------+--------+--------+
  69. 69. / 76 実践SparkSQL: ABC分析 • UDFの定義 69 // ABC分析のランク判定用UDF val abcUdf = udf { r: Double => r match { case r if (0 <= r && r <= 70) => "A" case r if (70 < r && r <= 90) => "B" case r if (90 < r && r <= 100) => "C" case _ => "" } }
  70. 70. / 76 実践SparkSQL: ABC分析 • UDFの使用 70 monthlySales. withColumn("totalAmount", sum("amount") over Window.partitionBy()). withColumn("cumAmount", sum("amount") over Window.orderBy("amount")). withColumn("compRate", lit(100.0) * $"amount" / $"totalAmount"). withColumn("cumRate", lit(100.0) * $"cumAmount" / $"totalAmount"). withColumn("abcRank", abcUdf($"cumRate")). show() +-----------+------+-----------+---------+--------+--------+-------+ | item|amount|totalAmount|cumAmount|compRate| cumRate|abcRank| +-----------+------+-----------+---------+--------+--------+-------+ |Green Onion|130000| 483000| 130000| 26.9151| 26.9151| A| | Tomato|168000| 483000| 298000| 34.7826| 61.6977| A| | Onion|185000| 483000| 483000| 38.3022|100.0000| C| +-----------+------+-----------+---------+--------+--------+-------+
  71. 71. / 76 実践SparkSQL: ABC分析 • SQLの記述との比較 71 WITH sales_composition_ratio AS ( SELECT item, amount , 100.0 * amount / NULLIF(SUM(amount) OVER(), 0) AS comp_ratio , 100.0 * SUM(amount) OVER(ORDER BY amount DESC) / NULLIF(SUM(amount) OVER(), 0) AS cum_ratio FROM monthly_sales ) SELECT item, cum_ratio , CASE WHEN cum_ratio BETWEEN 0 AND 70 THEN 'A' WHEN cum_ratio BETWEEN 70 AND 90 THEN 'B' WHEN cum_ratio BETWEEN 90 AND 100 THEN 'C' END AS abc_rank FROM sales_composition_ratio;
  72. 72. / 76 実践SparkSQL: ABC分析 • ロジック中にテストやアサーションを入れられる 72 // amountに0を含むデータ val malMonthlySales = Seq( Sales("Onion", 185000), Sales("Tomato", 168000), Sales("Green Onion", 0) ).toDS() // amount = 0 となるレコードが存在しないことを確認するアサーション assert(malMonthlySales.filter("amount = 0").count == 0, "amount must not be 0") java.lang.AssertionError: assertion failed: Amount must not be 0 at scala.Predef$.assert(Predef.scala:170) ... 48 elided
  73. 73. / 76 DataFramesベースのSparkモジュール • ML Pipelines • 機械学習の典型的な処理(モデル、学習、テストなど)をパイプライ ン化 • パイプラインの保存や再利用、パラメタを少しずつ変えて実行などが 簡単に行える • Structured Streaming • DataFrame APIをストリームデータに対して適用できる • GraphFrames • グラフ構造、グラフ処理のためのDataFrames拡張 73
  74. 74. / 76 発表まとめ • Spark • End-to-endの処理を一つのアプリケーションとして実装できる汎用性 • 機械学習、グラフ処理、ストリーム処理などのモジュールが充実 • SQL • 分析用途のSQLの需要拡大 • SparkSQL • SparkとSQLの良い所取り • SQLの直感的操作+型安全・Sparkモジュール連携 74
  75. 75. / 76 お知らせ(今後のイベント) • 3月28日(火) • 【 ヒカ☆ラボ 】ビッグデータを使ってバナーを動的表示させたらコン バージョンが 323% 増加した話~Golang x Presto での高速集計処理 と Docker を利用した Blue-Green Deployment による無停止の API~ https://atnd.org/events/86105 • 4月11日(火) • 【 ヒカ☆ラボ 】データを武器に変える!エンジニアによるデータ活用 のススメ! https://atnd.org/events/86766 • 4月24日(月) • 【でじらぼ by DMM.com labo】SQLで身につける!初めてのレコメン ド 〜 基礎から応用まで ~ https://atnd.org/events/86479 75
  76. 76. / 76 質疑応答 76

×