SlideShare a Scribd company logo
Prestoで実現するインタラクティブクエリ 
Taro L. Saito, Treasure Data 
leo@treasure-data.com 
November 13, 2014 
@db tech showcase Tokyo 2014 秋葉原UDX 
Copyright ©2014 Treasure Data. All Rights Reserved.
自己紹介 @taroleo 
• 2002 東京大学 理学部 情報科学科卒 
• 2007 Ph.D. 
– XMLデータベース、トランザクション処理の研究 
– ACM SIGMODなどで研究発表 
• ~ 2014 東京大学 情報生命科学専攻 助教 
– ゲノムサイエンス研究 
• 大規模データ処理、並列・分散コンピューティング 
• 2014.3月~ Treasure Data 
– ソフトウェアエンジニア, MPP Team Leader 
Copyright ©2014 Treasure Data. All Rights Reserved. 
2
「データ」に関連するオープンソース活動 
• sqlite-jdbc 
– SQLite DBMS for Java 
– 1ファイル=1DB 
Copyright ©2014 Treasure Data. All Rights Reserved. 
• snappy-java 
– 高速圧縮ライブラリ 
– 月に10万回以上ダウンロード 
– Sparkでも採用 
• msgpack-java 
• UT Genome Browser (UTGB) 
– 大規模ゲノム情報の可視化 
3
Prestoとは? 
• Facebookが開発している分散SQLエンジン 
– ペタスケールのデータに対しインタラクティブ(対話的)な検索が必要に 
• それまではHive中心 
– 2013年11月にオープンソース化 
Copyright ©2014 Treasure Data. All Rights Reserved. 
• Prestoの特徴 
– CPU使用効率・スピード重視(アドホック検索) 
– インメモリ処理 
– Javaによる実装 
– 教科書的なRDBMSの実装 
– ANSI SQLベース 
4
Prestoの開発体制 
• 主にFacebookチームの6人がGitHub 
上で開発 
– issue管理もGitHubのみ 
– Google group上のMLで議論 
• Treasure Dataの貢献数は現在第3位 
• 2014年11月現在 
– 39 contributors 
– 1949 pull requests! 
Copyright ©2014 Treasure Data. All Rights Reserved.
バッチクエリ(Hive) とアドホッククエリ (Presto) 
Copyright ©2014 Treasure Data. All Rights Reserved. 
TDでは独自にリトライ 
機構を導入 
6 
スループット重視 CPU使用効率、レスポンスタイム重視 
耐障害性
HDFS 
Hive 
PostgreSQL, etc. 
Daily/Hourly Batch 
Interactive query 
Dashboard 
Commercial 
BI Tools 
Batch analysis platform Visualization platform
HDFS 
Hive 
PostgreSQL, etc. 
Daily/Hourly Batch 
Interactive query 
✓ Less scalable 
✓ Extra cost 
Dashboard 
Commercial 
BI Tools 
✓ Can’t query against 
“live” data directly 
Batch analysis platform Visualization platform 
✓ More work to manage 
2 platforms
HDFS 
Hive Dashboard 
Presto 
PostgreSQL, etc. 
Daily/Hourly Batch 
HDFS 
Hive 
Dashboard 
Daily/Hourly Batch 
Interactive query 
Interactive query
PrestoはSQLレイヤー 
• Prestoのコア部分はSQLの実行レイヤーのみ 
– 各種ストレージ、DBMSへのアクセスはコネクター経由 
– 既存のコネクターや独自実装のコネクターを同時に使用できる 
Copyright ©2014 Treasure Data. All Rights Reserved. 
• コネクター 
– Hiveコネクター 
• HDFS上に保存されたデータにアクセス 
– Cassandraコネクター 
– MySQLコネクター 
– PostgreSQLコネクター 
10
Presto 
HDFS 
Hive 
Dashboard 
Daily/Hourly Batch 
Interactive query 
SQL on any data sets 
Cassandra MySQL Commercial DBMSs
Hive 
TD API / 
batch query 
Interactive query Web Console 
Presto 
Treasure Data 
PlazmaDB 
td-presto connector
トレジャーデータとは? 
• 米シリコンバレー発日本人創業のビッグデータ関連企業 
– 2011年12月、米Mountain Viewにて創業 
– 2012年11月、東京丸の内に日本支社設立 
• クラウド型データマネージメントサービス「Treasure Data Service」を提供 
Copyright ©2014 Treasure Data. All Rights Reserved. 
13 
芳川裕誠 – CEO 
Open source business veteran 
太田一樹 – CTO 
Founder of world’s largest Hadoop Group 
主要投資家 
Sierra Ventures – (Tim Guleri) 
企業向けソフト・データベース領域での有力VC 
Bill Tai 
Charles River Ventures, Twitterなどに投資 
まつもとゆきひろ 
Ruby言語開発者 
創業者 
Jerry Yang 
Yahoo! Inc. 創業者 
古橋貞之 – Software Engineer 
MessagePack, Fluentd開発者
Treasure Data Service 
ビッグデータのための「クラウド + マネジメント」一体型サービス 
データ収集~保存~分析までワンストップでサポート 
Copyright ©2014 Treasure Data. All Rights Reserved. 
14 
• 毎日数百億規模のレコードが取り込まれている 
– 2014年5月に5兆(trillion)レコードに到達 
• SQLベース(Hive, Presto, Pigなど)による検索サービスを提供
Over 100 customers, including: 
Copyright ©2014 Treasure Data. All Rights Reserved. 
15
Customer: Pioneer, #1 Auto Electronics Provider 
Copyright ©2014 Treasure Data. All Rights Reserved. 
16
車載センサーデータ × M2M 
競争で先んじたいが、大量のストリーミングデータを 
経済的に溜めて分析する仕組みを持っていない 
• 車載センサーデータ等を収集 
• ブレーキを踏んだ、等 
• 自動車内のセンサーデータを分析 
新規事業へのフィードバック 
Copyright ©2014 Treasure Data. All Rights Reserved. 17
O2O(online-to-offline)活用事例 
• 購買や行動の履歴を統合し横断的に分析 
– なぜ買ってくれたかを理解 
– 店舗の顧客をネットストアへ、ネットストアの顧客を店舗へと相互に送客可能に 
Copyright ©2014 Treasure Data. All Rights Reserved. 
スマホアプリ 
ネットストア 
リアル店舗 
クーポン発行 
coupon 
レコメンド最適化 
メール配信最適化 
ID 
アクションログ 
アクションログ 
購入データ 
データ統合 
+ Amazon Redshift 
18
ゲームソリューション導入事例 
• 20タイトル、2000台以上のサーバからのログを収集・保管 
– 分析、ゲームの改善に活用 
– 各デバイスからのアクセスログ, ユーザーの行動を可視化 
Copyright ©2014 Treasure Data. All Rights Reserved. 
Game1 Game2 Game3 
KPI A 
KPI B 
KPI C 
横断分析 
縦断分析 
19
TD + Metric Insights 
Copyright ©2014 Treasure Data. All Rights Reserved. 
20
Pebble: Wearable Tech 
Copyright ©2014 Treasure Data. All Rights Reserved. 
21
ウェアラブルデバイス センサーデータ × M2M 
heroku 
競争で先んじたいが、大量のストリーミングデータを 
経済的に溜めて分析する仕組みを持っていない 
• 機器情報を収集・分析 
• バッテリー残量等 
• ユーザーの操作情報を収集・分析 
新規事業へのフィードバック 
Copyright ©2014 Treasure Data. All Rights Reserved. 22
TD + Presto 
• トレジャーデータ 
– 日々大量のデータを収集 
• インタラクティブクエリ 
– 大量のデータからすばやく知見を得たい 
– システムの状態をすばやく知りたい 
– データ解析の支援 
– 日に数千個のクエリを実行するケースも(バッチ的にも使える) 
Copyright ©2014 Treasure Data. All Rights Reserved. 
• Presto 
– 低レイテンシで結果が得られる 
– Hiveの穴を埋めるインタラクティブクエリエンジン 
23
Presto + BI ツール 
Copyright ©2014 Treasure Data. All Rights Reserved. 
24
Presto 
HDFS 
Hive 
Dashboard 
Daily/Hourly Batch 
Interactive query 
SQL on any data sets Commercial 
Cassandra MySQL Commertial DBs 
BI Tools 
✓ Tableau 
✓ ChartIO 
✓ ... 
Data analysis platform
Prestogres: Presto + PostgreSQL 
• ODBCドライバの実装は大変 
– 仕様が巨大で複雑 
• PostgreSQL界隈の成熟した実装を活用できないだろうか? 
• そうして誕生したのが… 
https://github.com/treasure-data/prestogres 
Copyright ©2014 Treasure Data. All Rights Reserved.
Prestogresの仕組み 
• PostgreSQLを経由してPrestoにクエリを送信 
– pgpool-II(PostgreSQL用のコネクションプール実装)がベース 
– PostgreSQLにアクセスできるツール(JDBC, ODBCなど)は全て利用可能に 
1. SELECT COUNT(1) FROM tbl1 
client pgpool-II + patch 
2. select run_presto_as_temp_table( 
‘presto_result’, 
‘SELECT COUNT(1) FROM tbl1’ 
); 
Copyright ©2014 Treasure Data. All Rights Reserved. 
4. SELECT * FROM presto_result; 
PostgreSQL 
Presto 
Coordinator 
3. “run_persto_as_temp_table” function 
Prestoでクエリを実行
Tableau Desktop 
Copyright ©2014 Treasure Data. All Rights Reserved. 
28
TD + chartio.com 
Copyright ©2014 Treasure Data. All Rights Reserved. 29
データの収集 
Copyright ©2014 Treasure Data. All Rights Reserved. 
30
Fluentd: データを正しく集めるための入り口 
Copyright ©2014 Treasure Data. All Rights Reserved. 
31 
fluentd.org
広く活用されているFluentd 
• Kubernetes 
– GoogleのDocker(コンテナ型ソ 
フトウェア)管理ツール 
• Fluentdが標準ログコレクタに 
Copyright ©2014 Treasure Data. All Rights Reserved. 
32
PlazmaDB: スキーマレス・列志向ストレージ 
Copyright ©2014 Treasure Data. All Rights Reserved. 
33
Treasure Data: Javascript SDK 
• Webサイトのビジター情報を簡単にトラッキング 
– td_version – td-js-sdk’s version 
– td_client_id – client’s uuid 
– td_charset – character set 
– td_language – browser language 
– td_color – screen color depth 
– td_screen – screen resolution 
– td_viewport – viewport size 
– td_title – document title 
– td_url – document url 
– td_host – document host 
– td_path – document pathname 
– td_referrer – document referrer 
– td_ip – request IP (server) 
– td_browser – client browser (server) 
– td_browser_version – client browser version (server) 
– td_os – client operating system (server) 
– td_os_version – client operating system version (server) 
• スキーマの変更なしにパラメータを追加できる 
Copyright ©2014 Treasure Data. All Rights Reserved. 
34
MessagePack: スキーマレスでも型はある 
Copyright ©2014 Treasure Data. All Rights Reserved. 
35 
• レコードはMessagePack形式 
• 入力時のデータ型はそのまま保存 
– intやstring型のデータが列中に混在した状況でも使える 
PlazmaDBがスキーマに合わせて自動型変換を行う
Presto:列志向のクエリプランによる最適化 
• s 
Copyright ©2014 Treasure Data. All Rights Reserved. 
36 データ読み出しの最適化
Prestoのアーキテクチャ 
Copyright ©2014 Treasure Data. All Rights Reserved. 
37
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
1. find servers in a cluster
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
2. Client sends a query 
using HTTP
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
3. Coordinator builds 
a query plan 
Connector plugin 
provides metadata 
(table schema, etc.)
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
4. Coordinator sends 
tasks to workers
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
5. Workers read data 
through connector plugin
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
6. Workers run tasks 
in memory
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service 
Client 
7. Client gets the result 
from a worker
Client 
Coordinator Connector 
Plugin 
Worker 
Worker 
Worker 
Storage / Metadata 
Discovery Service
Query Planner 
SELECT 
name, 
count(*) AS c 
FROM impressions 
GROUP BY name 
Output 
(name, c) 
GROUP BY 
(name, count(*)) 
Copyright ©2014 Treasure Data. All Rights Reserved. 
SQL 
Table schema 
impressions ( 
name varchar 
time bigint 
) 
Table scan 
(name:varchar) 
+ 
Output 
Exchange 
Sink 
Final aggregation 
Exchange 
Sink 
Partial aggregation 
Table scan 
Logical query plan 
Distributed query plan
Query Planner - Stages 
inter-worker 
data transfer 
pipelined 
aggregation 
Copyright ©2014 Treasure Data. All Rights Reserved. 
Output 
Exchange 
Sink 
Final aggregation 
Exchange 
Sink 
Partial aggregation 
Table scan 
inter-worker 
data transfer 
Stage-0 
Stage-1 
Stage-2
Copyright ©2014 Treasure Data. All Rights Reserved. 
Output 
Exchange 
Sink 
Partial aggregation 
Table scan 
Sink 
Partial aggregation 
Table scan 
Execution Planner 
• StageをTaskに分割して並列度を上げる 
+ Node list 
✓ 2 workers 
Sink 
Final aggregation 
Exchange 
Sink 
Final aggregation 
Exchange 
Output 
Exchange 
Sink 
Final aggregation 
Exchange 
Sink 
Partial aggregation 
Table scan 
Worker 1 Worker 2
Execution Planner - Split 
• 各TaskにはSplitが割り当てられ、並列に実行される 
1 split / task 
= 1 thread / worker 
Copyright ©2014 Treasure Data. All Rights Reserved. 
Sink 
Final aggregation 
Exchange 
Sink 
Partial aggregation 
Table scan 
Sink 
Final aggregation 
Exchange 
Sink 
Partial aggregation 
Table scan 
Output 
Exchange 
Split 
many splits / task 
= many threads / worker 
(table scan) 
Worker 1 Worker 2 
1 split / worker 
= 1 thread / worker
Presto: Web Monitor 
• TPC-H Q5 
Copyright ©2014 Treasure Data. All Rights Reserved. 
51 
1053
Prestoの運用 
• クエリの実行履歴 
– TDに保存してPrestoで利用状況を管理 
• Presto coordinator/worker 
– JMX Beanやクエリの状態をJSON形式で取得できる 
• Presto-metrics 
– Rubyからprestoの各種パラメータを取得するライブラリ 
– https://github.com/xerial/presto-metrics 
– メモリ使用量、タスク実行量、エラーコード取得など 
– presto-metrics + Fluentdで常にPrestoの状態を監視 
• Librato Metricsで集約+可視化 
Copyright ©2014 Treasure Data. All Rights Reserved. 
52
Fluentdによるサービスのモニタリング 
Copyright ©2014 Treasure Data. All Rights Reserved. 
53 
Hive 
Presto
Librato MetricsによるPrestoサービスの監視 
Copyright ©2014 Treasure Data. All Rights Reserved. 
54
TD: Scheduled Query 
• 定期的にTDでクエリを実 
行 
• Prestoクエリの集計にも 
Prestoを使っている 
Copyright ©2014 Treasure Data. All Rights Reserved. 
55
td-prestoコネクタ 
• Storage 
– PlazmaDB 
– S3, Riak CS (S3とAPI互換)へのアクセス 
• TableScan operator 
– バックグラウンドで先にI/Oリクエストを発行(プリフェッチ) 
– msgpack-java v07 
• v06に比べて2倍以上高速化 
– レコード単位ではなく、ページ単位での処理 
• Presto 0.69より 
Copyright ©2014 Treasure Data. All Rights Reserved. 
56
トレジャーデータが目指すもの 
• 「世の中の誰もが手軽にデータベースを使える」ようにする 
• まずは誰もが「データを手軽に正しく集められる」ように 
– Fluentd+msgpackで柔軟にデータを取り込む 
– plazmadbによる圧縮、スキャンの最適化 
Copyright ©2014 Treasure Data. All Rights Reserved. 
• 「Presto」 
– Hiveの穴を埋める分散SQLエンジン 
– データを手軽にすばやく解析 
WE ARE HIRING! 
57

More Related Content

Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo

  • 1. Prestoで実現するインタラクティブクエリ Taro L. Saito, Treasure Data [email protected] November 13, 2014 @db tech showcase Tokyo 2014 秋葉原UDX Copyright ©2014 Treasure Data. All Rights Reserved.
  • 2. 自己紹介 @taroleo • 2002 東京大学 理学部 情報科学科卒 • 2007 Ph.D. – XMLデータベース、トランザクション処理の研究 – ACM SIGMODなどで研究発表 • ~ 2014 東京大学 情報生命科学専攻 助教 – ゲノムサイエンス研究 • 大規模データ処理、並列・分散コンピューティング • 2014.3月~ Treasure Data – ソフトウェアエンジニア, MPP Team Leader Copyright ©2014 Treasure Data. All Rights Reserved. 2
  • 3. 「データ」に関連するオープンソース活動 • sqlite-jdbc – SQLite DBMS for Java – 1ファイル=1DB Copyright ©2014 Treasure Data. All Rights Reserved. • snappy-java – 高速圧縮ライブラリ – 月に10万回以上ダウンロード – Sparkでも採用 • msgpack-java • UT Genome Browser (UTGB) – 大規模ゲノム情報の可視化 3
  • 4. Prestoとは? • Facebookが開発している分散SQLエンジン – ペタスケールのデータに対しインタラクティブ(対話的)な検索が必要に • それまではHive中心 – 2013年11月にオープンソース化 Copyright ©2014 Treasure Data. All Rights Reserved. • Prestoの特徴 – CPU使用効率・スピード重視(アドホック検索) – インメモリ処理 – Javaによる実装 – 教科書的なRDBMSの実装 – ANSI SQLベース 4
  • 5. Prestoの開発体制 • 主にFacebookチームの6人がGitHub 上で開発 – issue管理もGitHubのみ – Google group上のMLで議論 • Treasure Dataの貢献数は現在第3位 • 2014年11月現在 – 39 contributors – 1949 pull requests! Copyright ©2014 Treasure Data. All Rights Reserved.
  • 6. バッチクエリ(Hive) とアドホッククエリ (Presto) Copyright ©2014 Treasure Data. All Rights Reserved. TDでは独自にリトライ 機構を導入 6 スループット重視 CPU使用効率、レスポンスタイム重視 耐障害性
  • 7. HDFS Hive PostgreSQL, etc. Daily/Hourly Batch Interactive query Dashboard Commercial BI Tools Batch analysis platform Visualization platform
  • 8. HDFS Hive PostgreSQL, etc. Daily/Hourly Batch Interactive query ✓ Less scalable ✓ Extra cost Dashboard Commercial BI Tools ✓ Can’t query against “live” data directly Batch analysis platform Visualization platform ✓ More work to manage 2 platforms
  • 9. HDFS Hive Dashboard Presto PostgreSQL, etc. Daily/Hourly Batch HDFS Hive Dashboard Daily/Hourly Batch Interactive query Interactive query
  • 10. PrestoはSQLレイヤー • Prestoのコア部分はSQLの実行レイヤーのみ – 各種ストレージ、DBMSへのアクセスはコネクター経由 – 既存のコネクターや独自実装のコネクターを同時に使用できる Copyright ©2014 Treasure Data. All Rights Reserved. • コネクター – Hiveコネクター • HDFS上に保存されたデータにアクセス – Cassandraコネクター – MySQLコネクター – PostgreSQLコネクター 10
  • 11. Presto HDFS Hive Dashboard Daily/Hourly Batch Interactive query SQL on any data sets Cassandra MySQL Commercial DBMSs
  • 12. Hive TD API / batch query Interactive query Web Console Presto Treasure Data PlazmaDB td-presto connector
  • 13. トレジャーデータとは? • 米シリコンバレー発日本人創業のビッグデータ関連企業 – 2011年12月、米Mountain Viewにて創業 – 2012年11月、東京丸の内に日本支社設立 • クラウド型データマネージメントサービス「Treasure Data Service」を提供 Copyright ©2014 Treasure Data. All Rights Reserved. 13 芳川裕誠 – CEO Open source business veteran 太田一樹 – CTO Founder of world’s largest Hadoop Group 主要投資家 Sierra Ventures – (Tim Guleri) 企業向けソフト・データベース領域での有力VC Bill Tai Charles River Ventures, Twitterなどに投資 まつもとゆきひろ Ruby言語開発者 創業者 Jerry Yang Yahoo! Inc. 創業者 古橋貞之 – Software Engineer MessagePack, Fluentd開発者
  • 14. Treasure Data Service ビッグデータのための「クラウド + マネジメント」一体型サービス データ収集~保存~分析までワンストップでサポート Copyright ©2014 Treasure Data. All Rights Reserved. 14 • 毎日数百億規模のレコードが取り込まれている – 2014年5月に5兆(trillion)レコードに到達 • SQLベース(Hive, Presto, Pigなど)による検索サービスを提供
  • 15. Over 100 customers, including: Copyright ©2014 Treasure Data. All Rights Reserved. 15
  • 16. Customer: Pioneer, #1 Auto Electronics Provider Copyright ©2014 Treasure Data. All Rights Reserved. 16
  • 17. 車載センサーデータ × M2M 競争で先んじたいが、大量のストリーミングデータを 経済的に溜めて分析する仕組みを持っていない • 車載センサーデータ等を収集 • ブレーキを踏んだ、等 • 自動車内のセンサーデータを分析 新規事業へのフィードバック Copyright ©2014 Treasure Data. All Rights Reserved. 17
  • 18. O2O(online-to-offline)活用事例 • 購買や行動の履歴を統合し横断的に分析 – なぜ買ってくれたかを理解 – 店舗の顧客をネットストアへ、ネットストアの顧客を店舗へと相互に送客可能に Copyright ©2014 Treasure Data. All Rights Reserved. スマホアプリ ネットストア リアル店舗 クーポン発行 coupon レコメンド最適化 メール配信最適化 ID アクションログ アクションログ 購入データ データ統合 + Amazon Redshift 18
  • 19. ゲームソリューション導入事例 • 20タイトル、2000台以上のサーバからのログを収集・保管 – 分析、ゲームの改善に活用 – 各デバイスからのアクセスログ, ユーザーの行動を可視化 Copyright ©2014 Treasure Data. All Rights Reserved. Game1 Game2 Game3 KPI A KPI B KPI C 横断分析 縦断分析 19
  • 20. TD + Metric Insights Copyright ©2014 Treasure Data. All Rights Reserved. 20
  • 21. Pebble: Wearable Tech Copyright ©2014 Treasure Data. All Rights Reserved. 21
  • 22. ウェアラブルデバイス センサーデータ × M2M heroku 競争で先んじたいが、大量のストリーミングデータを 経済的に溜めて分析する仕組みを持っていない • 機器情報を収集・分析 • バッテリー残量等 • ユーザーの操作情報を収集・分析 新規事業へのフィードバック Copyright ©2014 Treasure Data. All Rights Reserved. 22
  • 23. TD + Presto • トレジャーデータ – 日々大量のデータを収集 • インタラクティブクエリ – 大量のデータからすばやく知見を得たい – システムの状態をすばやく知りたい – データ解析の支援 – 日に数千個のクエリを実行するケースも(バッチ的にも使える) Copyright ©2014 Treasure Data. All Rights Reserved. • Presto – 低レイテンシで結果が得られる – Hiveの穴を埋めるインタラクティブクエリエンジン 23
  • 24. Presto + BI ツール Copyright ©2014 Treasure Data. All Rights Reserved. 24
  • 25. Presto HDFS Hive Dashboard Daily/Hourly Batch Interactive query SQL on any data sets Commercial Cassandra MySQL Commertial DBs BI Tools ✓ Tableau ✓ ChartIO ✓ ... Data analysis platform
  • 26. Prestogres: Presto + PostgreSQL • ODBCドライバの実装は大変 – 仕様が巨大で複雑 • PostgreSQL界隈の成熟した実装を活用できないだろうか? • そうして誕生したのが… https://github.com/treasure-data/prestogres Copyright ©2014 Treasure Data. All Rights Reserved.
  • 27. Prestogresの仕組み • PostgreSQLを経由してPrestoにクエリを送信 – pgpool-II(PostgreSQL用のコネクションプール実装)がベース – PostgreSQLにアクセスできるツール(JDBC, ODBCなど)は全て利用可能に 1. SELECT COUNT(1) FROM tbl1 client pgpool-II + patch 2. select run_presto_as_temp_table( ‘presto_result’, ‘SELECT COUNT(1) FROM tbl1’ ); Copyright ©2014 Treasure Data. All Rights Reserved. 4. SELECT * FROM presto_result; PostgreSQL Presto Coordinator 3. “run_persto_as_temp_table” function Prestoでクエリを実行
  • 28. Tableau Desktop Copyright ©2014 Treasure Data. All Rights Reserved. 28
  • 29. TD + chartio.com Copyright ©2014 Treasure Data. All Rights Reserved. 29
  • 30. データの収集 Copyright ©2014 Treasure Data. All Rights Reserved. 30
  • 31. Fluentd: データを正しく集めるための入り口 Copyright ©2014 Treasure Data. All Rights Reserved. 31 fluentd.org
  • 32. 広く活用されているFluentd • Kubernetes – GoogleのDocker(コンテナ型ソ フトウェア)管理ツール • Fluentdが標準ログコレクタに Copyright ©2014 Treasure Data. All Rights Reserved. 32
  • 33. PlazmaDB: スキーマレス・列志向ストレージ Copyright ©2014 Treasure Data. All Rights Reserved. 33
  • 34. Treasure Data: Javascript SDK • Webサイトのビジター情報を簡単にトラッキング – td_version – td-js-sdk’s version – td_client_id – client’s uuid – td_charset – character set – td_language – browser language – td_color – screen color depth – td_screen – screen resolution – td_viewport – viewport size – td_title – document title – td_url – document url – td_host – document host – td_path – document pathname – td_referrer – document referrer – td_ip – request IP (server) – td_browser – client browser (server) – td_browser_version – client browser version (server) – td_os – client operating system (server) – td_os_version – client operating system version (server) • スキーマの変更なしにパラメータを追加できる Copyright ©2014 Treasure Data. All Rights Reserved. 34
  • 35. MessagePack: スキーマレスでも型はある Copyright ©2014 Treasure Data. All Rights Reserved. 35 • レコードはMessagePack形式 • 入力時のデータ型はそのまま保存 – intやstring型のデータが列中に混在した状況でも使える PlazmaDBがスキーマに合わせて自動型変換を行う
  • 36. Presto:列志向のクエリプランによる最適化 • s Copyright ©2014 Treasure Data. All Rights Reserved. 36 データ読み出しの最適化
  • 37. Prestoのアーキテクチャ Copyright ©2014 Treasure Data. All Rights Reserved. 37
  • 38. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service
  • 39. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 1. find servers in a cluster
  • 40. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 2. Client sends a query using HTTP
  • 41. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 3. Coordinator builds a query plan Connector plugin provides metadata (table schema, etc.)
  • 42. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 4. Coordinator sends tasks to workers
  • 43. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 5. Workers read data through connector plugin
  • 44. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service 6. Workers run tasks in memory
  • 45. Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service Client 7. Client gets the result from a worker
  • 46. Client Coordinator Connector Plugin Worker Worker Worker Storage / Metadata Discovery Service
  • 47. Query Planner SELECT name, count(*) AS c FROM impressions GROUP BY name Output (name, c) GROUP BY (name, count(*)) Copyright ©2014 Treasure Data. All Rights Reserved. SQL Table schema impressions ( name varchar time bigint ) Table scan (name:varchar) + Output Exchange Sink Final aggregation Exchange Sink Partial aggregation Table scan Logical query plan Distributed query plan
  • 48. Query Planner - Stages inter-worker data transfer pipelined aggregation Copyright ©2014 Treasure Data. All Rights Reserved. Output Exchange Sink Final aggregation Exchange Sink Partial aggregation Table scan inter-worker data transfer Stage-0 Stage-1 Stage-2
  • 49. Copyright ©2014 Treasure Data. All Rights Reserved. Output Exchange Sink Partial aggregation Table scan Sink Partial aggregation Table scan Execution Planner • StageをTaskに分割して並列度を上げる + Node list ✓ 2 workers Sink Final aggregation Exchange Sink Final aggregation Exchange Output Exchange Sink Final aggregation Exchange Sink Partial aggregation Table scan Worker 1 Worker 2
  • 50. Execution Planner - Split • 各TaskにはSplitが割り当てられ、並列に実行される 1 split / task = 1 thread / worker Copyright ©2014 Treasure Data. All Rights Reserved. Sink Final aggregation Exchange Sink Partial aggregation Table scan Sink Final aggregation Exchange Sink Partial aggregation Table scan Output Exchange Split many splits / task = many threads / worker (table scan) Worker 1 Worker 2 1 split / worker = 1 thread / worker
  • 51. Presto: Web Monitor • TPC-H Q5 Copyright ©2014 Treasure Data. All Rights Reserved. 51 1053
  • 52. Prestoの運用 • クエリの実行履歴 – TDに保存してPrestoで利用状況を管理 • Presto coordinator/worker – JMX Beanやクエリの状態をJSON形式で取得できる • Presto-metrics – Rubyからprestoの各種パラメータを取得するライブラリ – https://github.com/xerial/presto-metrics – メモリ使用量、タスク実行量、エラーコード取得など – presto-metrics + Fluentdで常にPrestoの状態を監視 • Librato Metricsで集約+可視化 Copyright ©2014 Treasure Data. All Rights Reserved. 52
  • 53. Fluentdによるサービスのモニタリング Copyright ©2014 Treasure Data. All Rights Reserved. 53 Hive Presto
  • 54. Librato MetricsによるPrestoサービスの監視 Copyright ©2014 Treasure Data. All Rights Reserved. 54
  • 55. TD: Scheduled Query • 定期的にTDでクエリを実 行 • Prestoクエリの集計にも Prestoを使っている Copyright ©2014 Treasure Data. All Rights Reserved. 55
  • 56. td-prestoコネクタ • Storage – PlazmaDB – S3, Riak CS (S3とAPI互換)へのアクセス • TableScan operator – バックグラウンドで先にI/Oリクエストを発行(プリフェッチ) – msgpack-java v07 • v06に比べて2倍以上高速化 – レコード単位ではなく、ページ単位での処理 • Presto 0.69より Copyright ©2014 Treasure Data. All Rights Reserved. 56
  • 57. トレジャーデータが目指すもの • 「世の中の誰もが手軽にデータベースを使える」ようにする • まずは誰もが「データを手軽に正しく集められる」ように – Fluentd+msgpackで柔軟にデータを取り込む – plazmadbによる圧縮、スキャンの最適化 Copyright ©2014 Treasure Data. All Rights Reserved. • 「Presto」 – Hiveの穴を埋める分散SQLエンジン – データを手軽にすばやく解析 WE ARE HIRING! 57

Editor's Notes

  1. トレジャーデータがデータベースの企業として成長するお手伝いをしています
  2. 3~4週間に1回 新しいversionがリリースされるくらい開発速度が速い。 TDのcontributionは現在Facebookに次いで2位 UDF機能の追加、TD_TIME_FORMAT, TD_TIME_RANGEなど
  3. Treasure Dataでは2種類のSQL Engineを提供 Hive バッチクエリ:スループット重視 日に数千~数万件以上のクエリを処理するなど 時間はかかるが大量データ処理を確実に処理する 耐障害性 CPU使用効率が悪い(1 map/reduce task = 1 core) Presto アドホッククエリ:レスポンスタイム重視 数秒〜数分でクエリの結果を知りたい場合 耐障害性なし TDでは独自にリトライ機構を導入 CPU使用効率が良い 相互に補完しあう関係
  4. ではHadoopを使った良くあるデータ解析システムの問題を、図を使って具体的に見てみます。 可視化ツールが直接Hiveクエリを投げる使い方は、遅すぎてストレスフルなので、Hiveが定期的にクエリを実行し、中間的なDBに結果を書き出し、BIツールなどから可視化する。この中間DBはデータマートと呼ばれたりします。しかし…
  5. そこがスケールしない。あるいは余計にコストがかかる。 BIツールやDashboardが生のデータに直接投げられないとなると、こっちの解析チームからすると、インフラチームに頼んで、必要なデータをデータマート上に作るバッチジョブを実行しておいてね、みたいな話が起きてきます。インフラチームはさらに、実はOracleに入っているで他をHDFSに定期的にコピーするスケジュールを作ったりしないと行けない。 インフラ側の問題としても、性格の異なる2つのプラットフォームを維持し続けるには、異なる知識が必要です。このプラットフォームを維持すること自体のコストが高い。
  6. これが、Prestoがあると解決します。 DashboardやBIツールは、Prestoを使ってHDFS上にあるデータにクエリを実行できるようになります。このため、中間的なデータマートをHDFSに作れます。従って、中間データベースに割くコストは削減できます。 さらに、すべてHDFSという単一のプラットフォームに載っているので、インフラの維持が大幅に楽になります。
  7. さらに、PrestoはHDFS以外のデータストアからデータを読み出すことができます。データをHDFS上に持ってこなくても、データをJOINして可視化したりできます。そもそも、HDFSを使わないという選択肢も出てきますね。例えばCassandraをデータ解析のプライマリストレージに使う選択肢もアリです。 実はプラグイン構造なので、商用DBや、自社専用のストレージエンジンにもクエリを実行できます。
  8. さらに、PrestoはHDFS以外のデータストアからデータを読み出すことができます。データをHDFS上に持ってこなくても、データをJOINして可視化したりできます。そもそも、HDFSを使わないという選択肢も出てきますね。例えばCassandraをデータ解析のプライマリストレージに使う選択肢もアリです。 実はプラグイン構造なので、商用DBや、自社専用のストレージエンジンにもクエリを実行できます。
  9. 毎日200億レコード、数TB
  10. online to offline
  11. さらに、Prestoは商用BIツールと安定して接続が可能です。これがなぜ可能かと言う秘密は後ほど紹介します。 以上のデータ解析プラットフォームを、Prestoをハブとして構築できる。これがPrestoの大きな導入メリットです。
  12. で、考えた方法ですが、PostgreSQLプロトコルを使えばいいじゃない。 PostgreSQLのプロトコルを話すのだけど、裏側ではPrestoのクエリを実行する。これなら、PostgreSQLの安定した実績のあるODBCドライバを使えますね。 そこで、これ僕が作ったんですが、Prestogresというゲートウェイサーバを作りました。
  13. どういう仕組みで動いているかというと、pgpool-IIという既存のミドルウェアを改造しました。 pgpool-IIは、元々はPostgreSQL用のロードバランサ兼コネクションプールの実装です。そこにクエリを書き換える機能を入れたんですね。どいう書き換えるかというと、受け取ったSELECT文を、関数の引数の中に入れます。それをPostgreSQLで実行すると、PostgreSQL的には普通の関数を実行しているのと同じように見えます。 その関数は、僕が自作した関数で、Prestoにクエリを投げて結果を返す関数なんです。
  14. これがPrestoのアーキテクチャ図です。1つずつ解説していきます。
  15. まずPrestoには、3種類のサーバがあります:Coordinator、Worker、Discovery Service。 Discover Serviceは、このネットワークにどんなサーバがいるか、という情報を持っていて、coordinatorやworkerはDiscovery Serviceを経由して他のノードを見つけ出します。
  16. クエリを実行するときは、まずクライアントがCoordinatorにSQLクエリを発行します。 ここのプロトコルはHTTPです。POSTで送ります。
  17. それから、Coordinatorがクエリの実行計画を立てます。 このときに、CoordinatorがConnector pluginというライブラリを経由して、テーブル一覧やスキーマを取得してきます。
  18. 実行計画ができたら、Coordinatorはその実行タスクをWorkerに割り振ります。これで分散実行が始まります。
  19. クエリが始まったら、WorkerはConnector pluginというライブラリを経由して、ストレージから行をどんどん読み出していきます。
  20. Workerはデータを読み出しつつ相互に通信して、クエリを実行していきます。この実行は全部メモリ上で行われます。途中結果をディスクに書き出したりはしません。全部パイプライン化されています。
  21. 結果ができあがってきたら、クライアントがworkerから結果を取得します。
  22. 全体図です。Discovery serviceがサーバの発見を行います。Coordinatorがクライアントからクエリを受け取り、実行計画を立てて、Workerにタスクを割り当てます。Workerはクエリを実行します。 テーブル一覧の取得や、データの読み出しは、Connector pluginと呼ばれるライブラリを経由して行われます。
  23. まずQuery Plannerです。Query Plannerは、クライアントから受け取ったSQL文と、Hiveメタストア、つまりコネクタから取得したテーブルスキーマを元に、論理クエリプランを組み立てます。さらにそこから分散クエリプランを組み立てます。 例えば、このselect文では、partial aggregation、final aggregation、outputの3つのステージからなる分散クエリプランが出来上がります。
  24. ここで重要なのは、SinkとExchangeです。 Exchangeは、他のworkerからデータをもらってきます。Sinkは、他のworkerにデータを受け渡します。このクエリだと、2回のデータ通信が発生します。 SinkとExchangeのペアで区切られた部分をStageと呼びます。つまりこのクエリは、3ステージからなる分散クエリになっています。 アグリゲーションは、複数のステージに分けて実行されます。
  25. こうして作られたクエリプランは、Execution Plannerに渡されます。 Execution Plannerは、Node Managerからworkerの一覧を受け取り、実行計画を立てます。 分散実行可能なステージをworkerの台数分、または設定された数だけ分割して、タスクとします。 例えば2台のworkerが存在するとすれば、1ステージ2タスクになります。
  26. タスクは、1つか複数のsplitを持っています。 テーブルスキャンを含むタスクは複数のsplit、その他のタスクは1つのsplitです。このsplitが、スレッドに割り当てられて実際に実行されます。つまり、1ステージごとに、1workerごとに1タスクずつ割り当てられ、そのworkerの中ではsplitがworkerの上で並列実行されるわけです。だいたい掴んでいただけたでしょうか?