Upload
mitsutoshi-kiuchi
View
1.297
Download
1
Embed Size (px)
Citation preview
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
いきなり道場破り!Drillがなんぼのもんじゃ!
SparkSQL最強伝説を証明して見せる!!
2015.9.16クリエーションライン(株) 木内
1
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
はじめに・・・
9月初旬、MapR平林さま、草薙さま来社
「先日はセミナーでのセッションありがとうございました!」
「こちらこそありがとうございます!」
「ところで再来週Apache DrillのMeetupやるのでLTをお願いしたいのですが・・・」
「ほーApache Drillですかあ・・・。・・・・・・・・・・え。」
・・・Drill??
2
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
Sparkでは付属ライブラリ
SparkSQLで
さまざまな
データソースに
SQLと似た
構文でアクセスして
解析データ元とする
ことができます
べんり!
3
Parquet JSON CSV RDB
ちなみに
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
Drillも
さまざまな
データソースに
SQLと似た
構文でアクセスして
解析データ元とする
ことができます
こっちもべんり!
4
Parquet JSON CSV RDB
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
ということで・・・
5
SparkとDrillをいろんな側面で対決させてDrillユーザにSparkのよさをわかってもらうのだ!!
下心
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
と、いうことで
使い始めるまでどっちが簡単か対決!!
6
第1戦
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/ )
• 速く&手数が少なくできたほうが勝ち!• うまくいかない所があったらペナルティ• 採点は私の独断と偏見で行う
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 8
使い始めるまでどっちが簡単か対決!!
第1戦
ファイッ!
!
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
5分後・・・
9
Apache Spark Apache Drill
Spark, DrillともにVMの構成完了。JDK 8 update 60をインストール
ここまでは(あたりまえだけど)両者同着
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
10分後・・・
10
Apache Spark Apache Drill
イヤ~な予感が・・・そう。Drillのチュートリアルではビルド済みのバイナリで手順を進めているのに対してSparkのDefault Downloadはソースコードなのだ!(いちおうSparkの名誉のために言っておくと、ビルド済みのバイナリはあります)
しかしここではルールどおりに作業を進める・・・
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
15分後・・・
11
Apache Spark Apache Drill
Sparkはビルド開始。対してDrillは既に最初の起動に成功。
そりゃそーだよ!ビルド済みなんだから!!(半泣き)
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
20分後・・・
12
Apache Spark Apache Drill
Sparkは未だビルド中(T_T)
Drillは最初のチュートリアルに入るが、チュートリアルで挙げられているサンプルデータ(employee.json)がない! これはペナルティだよ・・・グフフ・・・(ゲスい顔)
配布パッケージにサンプルデータがないので実行できない
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
25分後・・・
13
Apache Spark Apache Drill
・・・Sparkは未だビルド中・・・強く生きろ・・・
DrillはParquetデータのチュートリアル。今度はサンプルデータもあり無事完了ぐぬぬ・・・
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
30分後・・・
14
Apache Spark Apache Drill
・・・Sparkは未だビルド中・・・誰か助けて・・・
Drillは国のParquetデータのチュートリアル。こちらも問題なく無事完了簡単に試せるのはよくわかったよ・・・
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
45分後・・・
15
Apache Spark Apache Drill
ようやくSparkがビルド完了最初のPiチュートリアルをやります
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
50分後・・・
16
Apache Spark Apache Drill
PiチュートリアルはScala版は問題なく完了したが、R版にてエラー終了。まじか・・・orz (←ペナルティです)
Rのチュートリアルはエラー終了
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
結果発表!!
17
所要時間 ペナルティ1個につき5分
合計
50分 1個=5分 55分
30分 1個=5分 35分
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
結果発表!!
18
使い始めるまでどっちが簡単か対決!!
第1戦
勝利!!
……
……
…
負け・・・
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
いやいやいやいや・・・
いやいや・・・
「使いやすさ、とっつき易さも重要だけど、
いろんなデータソースに対応してる方が
ユーザには重要じゃないか」
と思い込んでみる
19
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
と、いうことで
どっちがいろんなデータソースに対応できるか対決!!
20
第2戦
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
ルール
21
• 公式ドキュメント上の対応データソースの比較を行う• より多くのデータソースに対応している方が勝ち!
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 22
どっちがいろんなデータソースに対応できるか対決!!
第2戦
ファイッ!
!
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 23
先攻~☆
SparkSQL
HiveQL互換
JDBC/ODBC対応
Parquet
JSON
CSV
Hive DB
RDB
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 24
後攻~☆
Drill+
Storage Plugin
Hive
JDBC/ODBC対応
Parquet
JSON
CSV
Hive DB
RDB
HBaseHBase DB
MongoDBMongoDB
MapR DBMapR DB
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
結果発表!!
25
対応フォーマット
5個
8個
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
結果発表!!
26
対応フォーマット
5個
8個
ちょっと待った!!
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 27
SparkSQL
HiveQL互換
JDBC/ODBC互換
Parquet
JSON
CSV
Hive DB
RDB
MongoDB Plugin MongoDB
Sparkにもプラグイン拡張があるんです!MongoDBにも対応しているよ!
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 28
SparkSQL
またSparkのコミュニティが公開している拡張プラグインがあるんだ。プラグインを使えば Avro, RedShift, Cassandra, MongoDBをはじめとして11個の追加データソースに対応しているよ!
http://spark-packages.org
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
つまりこうだ!!
29
対応フォーマット
5個
8個
=> 5+11=16個
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
……
……
…
負け・・・
勝利!!
結果発表!!
30
どっちがいろんなデータソースに対応できるか対決!!
第2戦
納得いかねー
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
最終戦!
どっちが速いか対決!!
31
最終戦
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個の名前を列挙
• 速く終わったほうが勝ち!
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.SparkConfimport org.apache.spark.SparkContextimport 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) }}
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
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
(2-1) Join Query: ユーザデータをリンクし評価を行っている女性ユーザの上位10人を抽出
• [Scala(for Spark)]
35
import org.apache.spark.SparkConfimport org.apache.spark.SparkContextimport 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) }}
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) TMP2JOIN dfs.`<path>/movies.json` AS MOVtbl ON TMP2.MOVIE = MOVtbl.MOVIE ORDER BY TMP2.NUMRAT DESC LIMIT 10;
36
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
(2-2) Join Query: 評価されている映画の上位10の名前を列挙
• [Scala(for Spark)]
37
import org.apache.spark.SparkConfimport org.apache.spark.SparkContextimport 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) }) }}
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
いいところをくみあわせよう!
38
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
力をあわせよう!!
39
Data Warehouse
Spark(SQLだけで収まらない
難しいこと担当 )
Drill(お手軽SQL担当)
JDBC接続
BIツール(可視化など)
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved
まとめ!
• Drillはとっつきやすい!
• Drillはいろんなデータソースに接続できる!JSON, CSVなんでもあり!
• DrillのSQLは結構速い!難しいSQL構文もいける!
• DrillはSparkからも使える!SQLでカバーできないところはSparkで!
40
Copyright ⓒ2015 CREATIONLINE, INC. All Rights Reserved 41