9/16 tokyo apache drill meetup - drill vs sparksql

Post on 15-Apr-2017

1.296 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related