Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 160 views
Uploaded on

Treasure ...

Treasure DataではFluentdなどで収集したデータに対し、Prestoによる低レイテンシクエリサービスを提供しています。これによりユーザーはすばやくデータに関する知見を得ることができ、データ分析の生産性を向上できます。このスライドでは分散SQLエンジンであるPrestoの特徴とその実装について紹介します。

この内容はdbtech showcase 2014 Tokyo @秋葉原UDX で紹介しました。
http://www.insight-tec.com/dbts-tokyo-2014.html

More in: Engineering
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment

Views

Total Views
160
On Slideshare
158
From Embeds
2
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
2

Embeds 2

https://twitter.com 4

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

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

Transcript

  • 1. 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.
  • 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