Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
© Geniee, Inc.
Report APIを支える技術
〜MySQLからClickhouseに載せ替えた話〜
2017年6月22日
基盤技術開発部・石田祥英
© Geniee, Inc. 2
1. Report APIの役割
2. ClickHouse導入の経緯
3. ClickHouseの性能・性質
4. ClickHouseの運用
5. まとめ
© Geniee, Inc. 3
1. Report APIの役割
2. ClickHouse導入の経緯
3. ClickHouseの性能・性質
4. ClickHouseの運用
5. まとめ
© Geniee, Inc.
Report APIとは
4
管理画面のレポートをDBから取得するためScala Play製のAPI
管理画面を返す
APサーバー
レポートをJsonで
取得するReportAPI
© Geniee, Inc.
Report APIとは
5
管理画面のレポートをDBから取得するためScala Play製のAPI
管理画面を返す
APサーバー
レポートをJsonで
取得するReportAPI
MySQLから
ClickHou...
© Geniee, Inc.
ReportAPIの仕事
6
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
ReportAPIが受け取れる基本的なパラメータ
①Dimension ②Measure
③sort...
© Geniee, Inc.
ReportAPIの仕事
7
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
ReportAPIが受け取れる基本的なパラメータ
①Dimension ②Measure
③sort...
© Geniee, Inc.
ReportAPIの仕事
8
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
ReportAPIが受け取れる基本的なパラメータ
①Dimension ②Measure
③sort...
© Geniee, Inc.
ReportAPIの仕事
9
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
ReportAPIが受け取れる基本的なパラメータ
①Dimension ②Measure
③sort...
© Geniee, Inc.
ReportAPIの仕事
10
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
ReportAPIが受け取れる基本的なパラメータ
①Dimension ②Measure
③sor...
© Geniee, Inc.
ReportAPIの仕事
11
¥getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
①Dimension ②Measure
③sort ④filter
何の順番でレポートを取得す...
© Geniee, Inc.
ReportAPIの仕事
12
getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す
レポートの結果がJsonで返ってくる
{
"headers": [ "interval_start...
© Geniee, Inc.
GETパラメータとSQLクエリの関係
13
この様に対応させれば条件を満たしたレポートを動的に作れる
© Geniee, Inc. 14
1. Report APIの仕事
2. ClickHouse導入の経緯
3. ClickHouseの性能・性質
4. ClickHouseの運用
5. まとめ
© Geniee, Inc.
ジーニーにおける広告主向け広告配信結果のレポートの規模
15
現状の規模
 MySQLに格納されている配信結果のサマリー
 レポートの行数 : 1,900,000,000 行
 テーブルサイズ : 500GB...
© Geniee, Inc.
新レポートへの変更点
16
データベースのキーを増やすことで240倍以上にデータが増加する見込み
新レポート現レポート
キ
ー
の
数
時
間
の
粒
度
4
1日
10
1時間
既存のキーに加え、地域コード,OS...
© Geniee, Inc.
新レポートに変更後、DBに求められる要件
17
 事業計画による要因や安全率を考慮し10倍成長しても以下を満たす
 120TBを格納
 クエリを10秒以内に返す
© Geniee, Inc.
拡大に対応するためReportAPIのMySQLからClickHouseへの移行
18
管理画面のレポートをDBから取得するためScala Play製のAPI
管理画面を返す
APサーバー
レポートをJsonで
取...
© Geniee, Inc.
What is ClickHouse
19
 ロシアの検索エンジン会社Yandex製
 YandexやCERNのプロダクションで動いている
 速度が自慢のカラムナDB
© Geniee, Inc.
公式ページに他カラムナDBとのベンチマークが掲載されている
20
© Geniee, Inc.
Clickhouseで解消される問題.1 MySQLの容量大きすぎ問題
21
Mysql使用時に比べ、データサイズが 1 / 13 に。
データベースの軽量化
 現在MySQLで500GBのところClickHou...
© Geniee, Inc.
Clickhouseで解消される問題.2
22
クエリがMySQLに比べ最大1000倍高速化 (手元で測った中で)
 SELECTの性能
 INSERTの性能
 一千万行のtsvファイルのINSERTは23秒...
© Geniee, Inc.
Clickhouseのテーブルエンジン
23
ClickHouseではテーブルをcreateする際テーブルエンジンを選択する
約20種の多種多様なテーブルエンジンがある
 MergeTree
 SummingM...
© Geniee, Inc.
テーブルエンジンの紹介.1
24
MergeTreeはClickHouseの看板テーブルエンジン
 MergeTree
 Index, Replication, partitionの操作, ALTER句, PR...
© Geniee, Inc.
テーブルエンジンの紹介.2
25
複数のテーブルを束ねるMergeエンジン
 混同注意! MergeTreeと異なるエンジン
 自身はデータを持たない。書き込みも不可。
 正規表現でテーブルを指定し、テーブル...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
26
DELETE, UPDATEがつかえない
 解決方法
トランザクション機能が無い
日や時間ごとにテーブルを作りMergeでまてめておく
修正後のデー...
© Geniee, Inc. 27
1. Report APIの仕事
2. ClickHouse導入の経緯
3. ClickHouseの性能・性質
4. ClickHouseの運用
5. まとめ
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
28
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
29
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
30
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
31
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
32
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc.
データ修正する際のClickHouseの制限の乗り越え方
33
report
Merge(buyer, ^report_)
report_2017_04_01 report_2017_04_02 report_20...
© Geniee, Inc. 34
1. Report APIの仕事
2. ClickHouse導入の経緯
3. ClickHouseの性能・性質
4. ClickHouseの運用
5. まとめ
© Geniee, Inc.
まとめ
35
分析系クエリの高速化・データ軽量化を狙うなら
社内からの声
 運用者 :「ロードに3分かかる画面が0.5秒で見れる様になった!」
 DBA : 「DBのストレージを圧迫の原因のテーブルが小さくなっ...
Upcoming SlideShare
Loading in …5
×

Report apiを支える技術

5,289 views

Published on

レポートAPIのバックエンドDBをMySQLからClickHouseに載せ替えた話

Published in: Engineering
  • Be the first to comment

Report apiを支える技術

  1. 1. © Geniee, Inc. Report APIを支える技術 〜MySQLからClickhouseに載せ替えた話〜 2017年6月22日 基盤技術開発部・石田祥英
  2. 2. © Geniee, Inc. 2 1. Report APIの役割 2. ClickHouse導入の経緯 3. ClickHouseの性能・性質 4. ClickHouseの運用 5. まとめ
  3. 3. © Geniee, Inc. 3 1. Report APIの役割 2. ClickHouse導入の経緯 3. ClickHouseの性能・性質 4. ClickHouseの運用 5. まとめ
  4. 4. © Geniee, Inc. Report APIとは 4 管理画面のレポートをDBから取得するためScala Play製のAPI 管理画面を返す APサーバー レポートをJsonで 取得するReportAPI
  5. 5. © Geniee, Inc. Report APIとは 5 管理画面のレポートをDBから取得するためScala Play製のAPI 管理画面を返す APサーバー レポートをJsonで 取得するReportAPI MySQLから ClickHouseに 変更
  6. 6. © Geniee, Inc. ReportAPIの仕事 6 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ReportAPIが受け取れる基本的なパラメータ ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か?
  7. 7. © Geniee, Inc. ReportAPIの仕事 7 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ReportAPIが受け取れる基本的なパラメータ ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か? dimensions=date,agency_id,media_id
  8. 8. © Geniee, Inc. ReportAPIの仕事 8 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ReportAPIが受け取れる基本的なパラメータ ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か? measures=imp_count,cpa,agency_cost
  9. 9. © Geniee, Inc. ReportAPIの仕事 9 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ReportAPIが受け取れる基本的なパラメータ ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か? sort=+click_through_rate,-imp_count + : ASC - : DESC
  10. 10. © Geniee, Inc. ReportAPIの仕事 10 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ReportAPIが受け取れる基本的なパラメータ ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か? filter=agency_id=1:23:456,post_click_cpa>100 • = , != • <, >, <=, >= • :でつなげてリスト
  11. 11. © Geniee, Inc. ReportAPIの仕事 11 ¥getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す ①Dimension ②Measure ③sort ④filter 何の順番でレポートを取得するか? どんな条件のレポートを取得するか? 取得するレポートのディメンジョンは何か? 取得するレポートのメジャーは何か? http://report_api/get_report ?dimensions=date,agency_id,media_id &measures=imp_count,cpa,agency_cost &sort=+click_through_rate,-imp_count &filter=agency_id=1:23:456,post_click_cpa>100 を投げるとScalaのパーサコンビネータでGetパラメータを解析し DBへ投げている ReportAPIが受け取れる基本的なパラメータ
  12. 12. © Geniee, Inc. ReportAPIの仕事 12 getパラメータでBI条件を受け取り、SQLへ変換してクエリを投げ、jsonを返す レポートの結果がJsonで返ってくる { "headers": [ "interval_start", "buyer_vendor_id", "campaign_id", "imp", "geniee_cost", "agency_cost”], ”rows": [ [ "2016-04-01 00:00:00.0", "5", "676", "6", "0.0000", "0.0000" ], [ "2016-04-01 00:00:00.0", "5", "591", "7", "0.0000", "0.0000" ], [ "2016-04-01 00:00:00.0", "2", "33", "20", "0.0004", "0.0004" ] ], "hasNext": false, "totals": [ "", "", "", "1077", "0.1802", "0.0641", "0.059583" ] }
  13. 13. © Geniee, Inc. GETパラメータとSQLクエリの関係 13 この様に対応させれば条件を満たしたレポートを動的に作れる
  14. 14. © Geniee, Inc. 14 1. Report APIの仕事 2. ClickHouse導入の経緯 3. ClickHouseの性能・性質 4. ClickHouseの運用 5. まとめ
  15. 15. © Geniee, Inc. ジーニーにおける広告主向け広告配信結果のレポートの規模 15 現状の規模  MySQLに格納されている配信結果のサマリー  レポートの行数 : 1,900,000,000 行  テーブルサイズ : 500GB  1日 3,000,000行 1.2 GB 増加する
  16. 16. © Geniee, Inc. 新レポートへの変更点 16 データベースのキーを増やすことで240倍以上にデータが増加する見込み 新レポート現レポート キ ー の 数 時 間 の 粒 度 4 1日 10 1時間 既存のキーに加え、地域コード,OS, キャリア言語, デバイス, ブラウザをキーとしてレポートを出せる様に
  17. 17. © Geniee, Inc. 新レポートに変更後、DBに求められる要件 17  事業計画による要因や安全率を考慮し10倍成長しても以下を満たす  120TBを格納  クエリを10秒以内に返す
  18. 18. © Geniee, Inc. 拡大に対応するためReportAPIのMySQLからClickHouseへの移行 18 管理画面のレポートをDBから取得するためScala Play製のAPI 管理画面を返す APサーバー レポートをJsonで 取得するReportAPI MySQLから ClickHouseに 変更
  19. 19. © Geniee, Inc. What is ClickHouse 19  ロシアの検索エンジン会社Yandex製  YandexやCERNのプロダクションで動いている  速度が自慢のカラムナDB
  20. 20. © Geniee, Inc. 公式ページに他カラムナDBとのベンチマークが掲載されている 20
  21. 21. © Geniee, Inc. Clickhouseで解消される問題.1 MySQLの容量大きすぎ問題 21 Mysql使用時に比べ、データサイズが 1 / 13 に。 データベースの軽量化  現在MySQLで500GBのところClickHouseへ以降で38GBに  新レポート移行で120TBになるところ、9TBに抑えられ一台の サーバに収まる見積もり 一台に収まらなくなった時の対策  シャーディングして分散保存されるDistributed Table Engineに移管 することで、スケールアウトできる  Yandexでは374台に20兆行以上が保存されている
  22. 22. © Geniee, Inc. Clickhouseで解消される問題.2 22 クエリがMySQLに比べ最大1000倍高速化 (手元で測った中で)  SELECTの性能  INSERTの性能  一千万行のtsvファイルのINSERTは23秒 MySQLでは1時間かかるクエリが秒単位で返ってくる
  23. 23. © Geniee, Inc. Clickhouseのテーブルエンジン 23 ClickHouseではテーブルをcreateする際テーブルエンジンを選択する 約20種の多種多様なテーブルエンジンがある  MergeTree  SummingMergeTree  Merge を紹介
  24. 24. © Geniee, Inc. テーブルエンジンの紹介.1 24 MergeTreeはClickHouseの看板テーブルエンジン  MergeTree  Index, Replication, partitionの操作, ALTER句, PREWHERE句, SAMPLE句 などMergeTreeファミリーでしか使えない操作が多い  先述した高速なクエリも基本的はMergeTreeファミリー  〜MergeTreeというエンジンをMergeTreeファミリーと呼んでいる  SummingMergeTree  MergeTreeエンジンの亜種  カラムをキーorメジャーしてcreateするとキーの同じ行を勝手に足 し上げといてくれる  広告主向けreportではこのエンジンを使用
  25. 25. © Geniee, Inc. テーブルエンジンの紹介.2 25 複数のテーブルを束ねるMergeエンジン  混同注意! MergeTreeと異なるエンジン  自身はデータを持たない。書き込みも不可。  正規表現でテーブルを指定し、テーブルを束ねる。Merge(DB名,正規表現) report Merge(buyer, ^report_) MergeTree report_2017_04_01 MergeTree report_2017_04_02 MergeTree report_2017_06_30… 複数のテーブルを1つ のテーブルに見立てて selectクエリを投げら れるので、reportテー ブルにクエリを投げる だけでOK!
  26. 26. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 26 DELETE, UPDATEがつかえない  解決方法 トランザクション機能が無い 日や時間ごとにテーブルを作りMergeでまてめておく 修正後のデータの一時テーブルを作っておきRenameして Mergeテーブルから見える様にする ClickHouseのRENAMEの機能を使用する RENAMEは複数同時に行える (RENAME操作だけトランザクションが張れる)  運用上直面する問題 一度insertしたデータを修正したい時、 「UPDATEもDELETEも無いじゃん!」 となって修正できない
  27. 27. © Geniee, Inc. 27 1. Report APIの仕事 2. ClickHouse導入の経緯 3. ClickHouseの性能・性質 4. ClickHouseの運用 5. まとめ
  28. 28. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 28 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 …
  29. 29. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 29 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 … この日のデータが壊れているとわかった! UPDATEやDELETEが使えないので データを直せない!!
  30. 30. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 30 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 … tmp_report_2017_04_02 正しいデータのテーブルを作る tmpプレフィックスを付け、 reportテーブルからは見えない 様にする
  31. 31. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 31 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 … tmp_report_2017_04_02 RENAMEをかける ! report_2017_04_02 => dropping_report_2017_04_02, Tmp_report_2017_04_02 => report_2017_04_02
  32. 32. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 32 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 … dropping_2017_04_02 かかった! 削除予定のdropingテーブルを dropする
  33. 33. © Geniee, Inc. データ修正する際のClickHouseの制限の乗り越え方 33 report Merge(buyer, ^report_) report_2017_04_01 report_2017_04_02 report_2017_06_30 … 正しいデータで元どおり
  34. 34. © Geniee, Inc. 34 1. Report APIの仕事 2. ClickHouse導入の経緯 3. ClickHouseの性能・性質 4. ClickHouseの運用 5. まとめ
  35. 35. © Geniee, Inc. まとめ 35 分析系クエリの高速化・データ軽量化を狙うなら 社内からの声  運用者 :「ロードに3分かかる画面が0.5秒で見れる様になった!」  DBA : 「DBのストレージを圧迫の原因のテーブルが小さくなった!」 まとめ  超早い分析系クエリを求めるなら導入の価値あり!  結論としては 「データ入れ直しが許容時間内に終わる見通し」 がつくなら本番投入できる可能性が高い。

×