30
page Apr, 2015 24th 爆速クエリエンジン ”Presto” を使いたくなる話 1

爆速クエリエンジン”Presto”を使いたくなる話

Embed Size (px)

Citation preview

Page 1: 爆速クエリエンジン”Presto”を使いたくなる話

page

Apr, 2015

24th

!

爆速クエリエンジン”Presto”を使いたくなる話

1

Page 2: 爆速クエリエンジン”Presto”を使いたくなる話

page

1. 自己紹介

2

Page 3: 爆速クエリエンジン”Presto”を使いたくなる話
Page 4: 爆速クエリエンジン”Presto”を使いたくなる話

お知らせ

Page 5: 爆速クエリエンジン”Presto”を使いたくなる話

page

自己紹介

5

好きなプロダクト

Page 6: 爆速クエリエンジン”Presto”を使いたくなる話

page

1. 自己紹介 2. Prestoを使う理由 3. HiveからPrestoへの書換Tips 4. まとめ

本日の流れ

6

Page 7: 爆速クエリエンジン”Presto”を使いたくなる話

page

2. Prestoを使う理由

7

Page 8: 爆速クエリエンジン”Presto”を使いたくなる話

page

Prestoのメリット

8

クエリ処理が高速 トライ&エラーを繰り返しやすい 学習コストが低い

ANSI標準SQLに従って作られているため 分析・集計が捗る

WITH句・WINDOW関数が使える

Page 9: 爆速クエリエンジン”Presto”を使いたくなる話

page

PrestoとHiveの使い分け

9

Presto 長くても2~3分で終わる集計に最適 コンパクトな処理をすばやく実行したい時

Hive 数分以上~数時間掛かるバッチクエリ メモリに乗り切らないオーダーの処理

JOIN数が多い時ないし、JOINの条件が文字列である時 結果セットが数百万行、文字列型カラム多数の時

Page 10: 爆速クエリエンジン”Presto”を使いたくなる話

page

Prestoのスピード

10

SELECT count(1) FROM access WHERE status = … 約150億行のレコードに対して実行

Presto: 36秒

Hive: 12分20秒

Page 11: 爆速クエリエンジン”Presto”を使いたくなる話

page

Prestoのスピード

11

Page 12: 爆速クエリエンジン”Presto”を使いたくなる話

page

Presto雑感

12

WITH句がとても便利(可読性・UNION句での再利用性)

CASTを使うことが思いのほか多い

LIKE句よりregexp_like()が速いので積極的に使うべき

JOIN結果が数十~数百万行となるクエリで、文字列型のキーを使うとメモリを使い切って失敗する

TreasureDataにはsmart_digestがあるのでそれを使うと吉

ハッシュ関数の衝突確率を下げるため、substr()を用いた文字列の先頭一致も併せて行いましょう

Page 13: 爆速クエリエンジン”Presto”を使いたくなる話

page

WITH句の例

13

WITH t1 AS ( SELECT ... FROM ...), t2 AS ( SELECT ... FROM ...)SELECT ...FROM t1 INNER JOIN t2 USING(id)

Page 14: 爆速クエリエンジン”Presto”を使いたくなる話

page

WITH句の例

14

WITH t1 AS ( SELECT ... FROM ...)SELECT … FROM t1 WHERE …UNION ALLSELECT … FROM t1 WHERE …UNION ALLSELECT … FROM t1 WHERE …

Page 15: 爆速クエリエンジン”Presto”を使いたくなる話

page

3. HiveからPrestoへの書換Tips

15

Page 16: 爆速クエリエンジン”Presto”を使いたくなる話

page

HiveからPrestoへの書換Tips

16

正規表現のエスケープ挙動 select regexp_extract('(123)', '^\((.+)\)$', 1)

Hive: (123) Presto: 123

select regexp_extract('(123)', '^\\((.+)\\)$', 1) Hive: 123 Presto: ※空文字

Page 17: 爆速クエリエンジン”Presto”を使いたくなる話

page

HiveからPrestoへの書換Tips

17

INT型の割り算で結果がFLOAT/DOUBLE型となるとき

select 3 / 2 as division Hive: 1.5 Presto: 1

select CAST(3 AS DOUBLE) / 2 as division Hive: 1.5 Presto: 1.5 ※ 全てがINT型とならないようにいずれかをCASTする

Page 18: 爆速クエリエンジン”Presto”を使いたくなる話

page

HiveからPrestoへの書換Tips

18

substr()などでマルチバイト文字列を扱うとき

select substr('日本語学校', 1, 3)

Hive: 日本語

Presto: 日

!

Prestoは文字列をASCIIとして扱うためであるUTF-8文字は1文字3バイトとなる

Page 19: 爆速クエリエンジン”Presto”を使いたくなる話

page

HiveからPrestoへの書換Tips

19

length()などでマルチバイト文字列を扱うとき

select length('日本語学校')

Hive: 5 Presto: 15 !

Prestoは文字列をASCIIとして扱うためであるUTF-8文字は1文字3バイトとなる

Page 20: 爆速クエリエンジン”Presto”を使いたくなる話

page

HiveからPrestoへの書換Tips

20

文字列置換関数はtranslate()ではなくreplace()を使う

その他は、Qiita記事にまとめています

Hadoop利用者ならきっと知ってる、Hive/Prestoクエリ関数の挙動の違いhttp://qiita.com/y-ken/items/400b7c70c324ac67af02

Page 21: 爆速クエリエンジン”Presto”を使いたくなる話
Page 22: 爆速クエリエンジン”Presto”を使いたくなる話

page

4. まとめ

22

Page 23: 爆速クエリエンジン”Presto”を使いたくなる話

page

まとめ

23

とてもクエリ実行が速いため調査・分析業務が捗る MySQLテーブルをHadoopにインポートしてJOINしている

Prestgresを用いるとPostgreSQLのように使えるので便利

TreasureDataのオプションサービス契約して良かった

Page 24: 爆速クエリエンジン”Presto”を使いたくなる話

page

まとめ

24

2015年4月現在、マルチバイト対応が甘い リソースコントロールが甘い 重たいクエリがノードのリソースを使い切ってしまう SELECTするカラムvarchar型が多いとき、HiveQLより極端に遅くなることがあったがpresto v0.100現在は解消 日々改善・進歩しているため、今後に期待

Page 25: 爆速クエリエンジン”Presto”を使いたくなる話

page

宣伝

25

サーバ/インフラエンジニア養成読本ログ収集~可視化編 [現場主導のデータ分析環境を構築!] (Software Design plus) 出版社/メーカー: 技術評論社 定価: 本体1,980円+税

Page 26: 爆速クエリエンジン”Presto”を使いたくなる話

お知らせ

Page 27: 爆速クエリエンジン”Presto”を使いたくなる話
Page 28: 爆速クエリエンジン”Presto”を使いたくなる話
Page 29: 爆速クエリエンジン”Presto”を使いたくなる話
Page 30: 爆速クエリエンジン”Presto”を使いたくなる話

page

Thanks!

30

ご清聴ありがとうございました。