Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

9/16 Tokyo Apache Drill Meetup - drill vs sparksql

1,462 views

Published on

演題:いきなり道場破り!Drillがなんぼのもんじゃ!SparkSQL最強伝説を証明して見せる!

Published in: Technology

9/16 Tokyo Apache Drill Meetup - drill vs sparksql

  1. 1. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved いきなり道場破り! Drillがなんぼのもんじゃ! SparkSQL最強伝説を証明して見せる!! 2015.9.16 クリエーションライン(株) 木内 1
  2. 2. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved はじめに・・・ 9月初旬、MapR平林さま、草薙さま来社 「先日はセミナーでのセッションありがとうございました!」 「こちらこそありがとうございます!」 「ところで再来週Apache DrillのMeetupやるのでLTをお願いしたいのですが・・・」 「ほーApache Drillですかあ・・・。・・・・・・・・・・え。」 ・・・Drill?? 2
  3. 3. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved Sparkでは付属ライブラリ SparkSQLで さまざまな データソースに SQLと似た 構文でアクセスして 解析データ元とする ことができます べんり! 3 Parquet JSON CSV RDB ちなみに
  4. 4. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved Drillも さまざまな データソースに SQLと似た 構文でアクセスして 解析データ元とする ことができます こっちもべんり! 4 Parquet JSON CSV RDB
  5. 5. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved ということで・・・ 5 SparkとDrillをいろんな側面で対決させて DrillユーザにSparkのよさをわかってもらうのだ!! 下心
  6. 6. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved と、いうことで 使い始めるまでどっちが簡単か対決!! 6 第1戦
  7. 7. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 環境とルール 7 • 環境はDigital Ocean上の仮想マシンを使用(2core, 4GB, CentOS7-64bit) • 公式ドキュメントの”Getting Started”を行う • Spark: Spark Overview( http://spark.apache.org/docs/latest/index.html ) • Drill: Drill in 10 minutes( https://drill.apache.org/docs/drill-in-10-minutes/ ) • 速く&手数が少なくできたほうが勝ち! • うまくいかない所があったらペナルティ • 採点は私の独断と偏見で行う
  8. 8. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 8 使い始めるまでどっちが簡単か対決!! 第1戦 ファイッ!!
  9. 9. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 5分後・・・ 9 Apache Spark Apache Drill Spark, DrillともにVMの構成完了。JDK 8 update 60をインストール ここまでは(あたりまえだけど)両者同着
  10. 10. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 10分後・・・ 10 Apache Spark Apache Drill イヤ~な予感が・・・ そう。Drillのチュートリアルではビルド済みのバイナリで手順を進めているのに 対して SparkのDefault Downloadはソースコードなのだ! (いちおうSparkの名誉のために言っておくと、ビルド済みのバイナリはありま す) しかしここではルールどおりに作業を進める・・・
  11. 11. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 15分後・・・ 11 Apache Spark Apache Drill Sparkはビルド開始。 対してDrillは既に最初の起動に成功。 そりゃそーだよ!ビルド済みなんだから!!(半泣き)
  12. 12. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 20分後・・・ 12 Apache Spark Apache Drill Sparkは未だビルド中(T_T) Drillは最初のチュートリアルに入るが、 チュートリアルで挙げられているサンプルデータ(employee.json)がない!  これはペナルティだよ・・・グフフ・・・(ゲスい顔) 配布パッケージにサンプルデータがない ので実行できない
  13. 13. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 25分後・・・ 13 Apache Spark Apache Drill ・・・Sparkは未だビルド中・・・強く生きろ・・・ DrillはParquetデータのチュートリアル。今度はサンプルデータもあり無事完了 ぐぬぬ・・・
  14. 14. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 30分後・・・ 14 Apache Spark Apache Drill ・・・Sparkは未だビルド中・・・誰か助けて・・・ Drillは国のParquetデータのチュートリアル。こちらも問題なく無事完了 簡単に試せるのはよくわかったよ・・・
  15. 15. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 45分後・・・ 15 Apache Spark Apache Drill ようやくSparkがビルド完了 最初のPiチュートリアルをやります
  16. 16. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 50分後・・・ 16 Apache Spark Apache Drill PiチュートリアルはScala版は問題なく完了したが、 R版にてエラー終了。まじか・・・orz (←ペナルティです) Rのチュートリアルはエラー終了
  17. 17. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 結果発表!! 17 所要時間 ペナルティ 1個につき5分 合計 50分 1個=5分 55分 30分 1個=5分 35分
  18. 18. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 結果発表!! 18 使い始めるまでどっちが簡単か対決!! 第1戦 勝利!! … … … … … 負け・・・
  19. 19. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved いやいやいやいや・・・ いやいや・・・ 「使いやすさ、とっつき易さも重要だけど、  いろんなデータソースに対応してる方が  ユーザには重要じゃないか」 と思い込んでみる 19
  20. 20. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved と、いうことで どっちがいろんなデータソースに対応できるか対決!! 20 第2戦
  21. 21. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved ルール 21 • 公式ドキュメント上の対応データソースの比較を行う • より多くのデータソースに対応している方が勝ち!
  22. 22. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 22 どっちがいろんなデータソースに対応できるか対決!! 第2戦 ファイッ!!
  23. 23. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 23 先攻~☆ Spark SQL HiveQL互換 JDBC/ODBC対応 Parquet JSON CSV Hive DB RDB
  24. 24. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 24 後攻~☆ Drill + Storage Plugin Hive JDBC/ODBC対応 Parquet JSON CSV Hive DB RDB HBase HBase DB MongoDB MongoDB MapR DB MapR DB
  25. 25. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 結果発表!! 25 対応フォーマット 5個 8個
  26. 26. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 結果発表!! 26 対応フォーマット 5個 8個 ちょっと待った!!
  27. 27. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 27 Spark SQL HiveQL互換 JDBC/ODBC互換 Parquet JSON CSV Hive DB RDB MongoDB Plugin MongoDB Sparkにもプラグイン拡張があるんです! MongoDBにも対応しているよ!
  28. 28. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 28 Spark SQL またSparkのコミュニティが公開している拡張プラグインがあるんだ。 プラグインを使えば Avro, RedShift, Cassandra, MongoDBをはじめとして 11個の追加データソースに対応しているよ! http://spark-packages.org
  29. 29. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved つまりこうだ!! 29 対応フォーマット 5個 8個 => 5+11=16個
  30. 30. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved … … … … … 負け・・・ 勝利!! 結果発表!! 30 どっちがいろんなデータソースに対応できるか対決!! 第2戦 納得いか ねー
  31. 31. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 最終戦! どっちが速いか対決!! 31 最終戦
  32. 32. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 環境とルール 32 • 環境はDigital Ocean上の仮想マシンを使用(12core, 32GB, CentOS7-64bit) • データセットは以下のもの • MovieLens( http://movielens.org ) ミネソタ大学の研究プロジェクトで収集されている 映画の視聴者による評価データベース。 今回は3つのテーブルを使用。データ元 : http://d12yw77jruda6f.cloudfront.net/ampcamp5-usb.zip   (A)実際の評価データ(約100万行)   (B)ユーザIDリスト(約72,000行)   (C) 映画(約10,000行) 元データは「コロン区切り」だが、 JSON形式に事前に変換 データサイズは約500MB。 • SQLは以下の3種類(参考: BigData Benchmark https://amplab.cs.berkeley.edu/benchmark/ ) • (1) Aggregation Query: 評価”3”以上の評価データ数を合計 • (2) Join Query: ユーザ、映画名をJoinさせて、以下の項目を算出 • (2-1) 評価を行っている女性ユーザの上位10人を抽出 • (2-2) 評価されている映画の上位10個の名前を列挙 • 速く終わったほうが勝ち!
  33. 33. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved (1) Aggregation Query: 評価”3”以上の評価データ数を合計 • [SQL(for Drill)] ALTER SYSTEM SET `store.json.read_numbers_as_double` = true; SELECT COUNT(MOVIE) FROM dfs.`<path>/ratings.json` WHERE RATE > 3.0; • [Scala(for Spark)] 33 import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ object AggQuery { def main(args: Array[String]) { val blockSize = 1024 * 1024 * 128 val conf = new SparkConf(); conf.set("spark.app.name", "Scala Aggregation Query") val sc = new SparkContext(conf) sc.hadoopConfiguration.setInt("fs.local.block.size", blockSize) val sqlContext = new org.apache.spark.sql.SQLContext(sc) val rating = sqlContext.read.json("ratings.json") rating.registerTempTable("ratings") val res = rating.filter("RATE > 3.0") val cnt = res.count() println("Result>>> ", cnt) } }
  34. 34. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved (2-1) Join Query: ユーザデータをリンクし評価を行っている女性ユーザの上位10人を抽出 • [SQL(for Drill)] SELECT RATtbl.UID, COUNT(RATtbl.UID) as NUMEVALS FROM dfs.`<path>/ratings.json` as RATtbl JOIN dfs.`<path>/users.json` as USRtbl ON RATtbl.UID = USRtbl.UID WHERE USRtbl.GENDER = 'F' GROUP BY RATtbl.UID ORDER BY COUNT(RATtbl.UID) DESC LIMIT 10; 34
  35. 35. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved (2-1) Join Query: ユーザデータをリンクし評価を行っている女性ユーザの上位10人を抽出 • [Scala(for Spark)] 35 import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.sql.functions._ object topTenWomen { def main(args: Array[String]) { val blockSize = 1024 * 1024 * 128 val conf = new SparkConf(); conf.set("spark.app.name", "Scala Join Query 1") val sc = new SparkContext(conf) sc.hadoopConfiguration.setInt("fs.local.block.size", blockSize) val sqlContext = new org.apache.spark.sql.SQLContext(sc) val rating = sqlContext.read.json("ratings.json").withColumnRenamed("UID", "RUID") val user = sqlContext.read.json("users.json").withColumnRenamed("UID", "UUID") val con = rating.join(user, rating("RUID") === user("UUID")) .filter("GENDER LIKE 'F'").groupBy("RUID").count().sort(desc("count")) con.show(10) } }
  36. 36. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved (2-2) Join Query: 評価されている映画の上位10個の名前を列挙 • [SQL(for Drill)] SELECT TMP2.MOVIE, TMP2.NUMRAT, TITLE FROM ( SELECT MOVIE, COUNT(MOVIE) as NUMRAT FROM dfs.`<path>/ratings.json` GROUP BY MOVIE) TMP2 JOIN dfs.`<path>/movies.json` AS MOVtbl ON TMP2.MOVIE = MOVtbl.MOVIE ORDER BY TMP2.NUMRAT DESC LIMIT 10; 36
  37. 37. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved (2-2) Join Query: 評価されている映画の上位10の名前を列挙 • [Scala(for Spark)] 37 import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.sql.functions._ object topTenMoviename { def main(args: Array[String]) { val blockSize = 1024 * 1024 * 128 val conf = new SparkConf(); conf.set("spark.app.name", "Scala Join Query 2") val sc = new SparkContext(conf) sc.hadoopConfiguration.setInt("fs.local.block.size", blockSize) val sqlContext = new org.apache.spark.sql.SQLContext(sc) val rating = sqlContext.read.json("ratings.json").withColumnRenamed("UID", "RUID") val movie = sqlContext.read.json("movies.json").withColumnRenamed("MOVIE", "MMOVIE") val con = rating.groupBy("MOVIE").count().sort(desc("count")) val con2 = con.take(10).foreach(x => { val movno = x(0) val movtitle = movie.where(movie("MMOVIE") === movno).select("TITLE").take(1)(0) println("RESULT>>> MOVID: ", movno, " NUMRAT: ", x(1), " TITLE: ", movtitle) }) } }
  38. 38. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved いいところをくみあわせよう! 38
  39. 39. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 力をあわせよう!! 39 Data Warehouse Spark (SQLだけで収まらない 難しいこと担当) Drill (お手軽SQL担当) JDBC接続 BIツール (可視化など)
  40. 40. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved まとめ! • Drillはとっつきやすい! • Drillはいろんなデータソースに接続できる! JSON, CSVなんでもあり! • DrillのSQLは結構速い! 難しいSQL構文もいける! • DrillはSparkからも使える! SQLでカバーできないところはSparkで! 40
  41. 41. Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 41

×