Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Repro における Presto の安定化・パフォーマンス改善の歩み / Repro Tech Meetup #9

Repro における Presto の安定化・パフォーマンス改善の歩み / Repro Tech Meetup #9

Takeshi Arabiki

June 04, 2019
Tweet

More Decks by Takeshi Arabiki

Other Decks in Technology

Transcript

  1. • Twitter: @a_bicky • Blog: あらびき⽇記 • 所属: Repro 株式会社

    (2017 年 8 ⽉〜) • SRE っぽいことをしたり • 分析基盤っぽいことをしたり • 開発環境整備をしたり • Rails アプリケーション触ったり • CTO の⼤規模機能開発のレビューをしたり ⾃⼰紹介
  2. • 分散 SQL クエリエンジン • Presto ⾃体はデータストレージとしての機能を持たない • リクエストを受け付けて Planning

    などを⾏う coordinator • データを処理する worker • 様々なデータソースを同時に扱える • Hive (Hadoop File System), MySQL, Cassandra etc. • 基本的にオンメモリで処理する • メモリに収まらないデータは処理できない Presto の概要
  3. • 配信対象条件(ユーザセグメンテーション)から SQL を機械的に⽣成 • 個々の SQL を最適化することが難しい • プッシュ通知の配信直前に対象を計算

    • ⻑時間かかる SQL が発⾏されると予定の配信時間に間に合わない • ⻑時間 Presto が落ちるとお客様やアプリのエンドユーザに多⼤な迷惑がかかる • アプリによってデータの規模も特性も異なる • 特定のアプリだけ問題になることもしばしば Presto を使った配信対象ユーザの決定
  4. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto Presto 導⼊当初の構成
  5. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto 1. セッションデータを S3 に Put ① Post events ② Forward events ③ Put objects (LZO)
  6. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto 2. S3 オブジェクトを temporary table の prefix に移動 ④ SSM (s3-dist-cp) ⑤ Move objects
  7. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto 3. Hive で temporary table の内容を挿⼊ ⑥ HiveQL ⑦ Get LZO objects in the temp table ⑧ Put parquet objects
  8. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto 4. Presto を使ってセグメンテーション ⑨ Presto SQL ⑩ Get parquet objects in the Hive table ⑪ user IDs etc.
  9. • presto-server が頻繁に応答しなくなる • Hive の bucketed table を使うと遅い •

    presto-cassandra connector の planning が遅い Repro が直⾯した様々な問題(抜粋)
  10. • presto-server が頻繁に応答しなくなる • Hive の bucketed table を使うと遅い •

    presto-cassandra connector の planning が遅い Repro が直⾯した様々な問題(抜粋)
  11. • Presto は 1 worker 応答しなくなるだけでクエリ全体が失敗する • com.facebook.presto.spi.PrestoException: Could not

    communicate with the remote task. • 全 worker がほぼ毎⽇死んで⼤量のアラートが届く presto-server が頻繁に応答しなくなる
  12. ある EMR インスタンスのログ [hadoop@ip-172-31-82-52 ~]$ dmesg -T | grep -i

    kill | tail [Sun Apr 22 00:12:02 2018] Out of memory: Kill process 4577 (snip) [Sun Apr 22 00:12:02 2018] Killed process 4577 (presto-server) (snip) [Tue Apr 24 00:12:34 2018] presto-server invoked oom-killer: (snip) (snip) [Tue Apr 24 00:12:34 2018] Out of memory: Kill process 21281 (snip) [Tue Apr 24 00:12:34 2018] Killed process 21281 (presto-server) (snip) [Wed Apr 25 00:12:37 2018] thread.rb:70 invoked oom-killer: (snip) (snip) [Wed Apr 25 00:12:38 2018] Out of memory: Kill process 26967 (snip) [Wed Apr 25 00:12:38 2018] Killed process 26967 (presto-server) (snip)
  13. [hadoop@ip-172-31-82-52 ~]$ dmesg -T | grep -i kill | tail

    [Sun Apr 22 00:12:02 2018] Out of memory: Kill process 4577 (snip) [Sun Apr 22 00:12:02 2018] Killed process 4577 (presto-server) (snip) [Tue Apr 24 00:12:34 2018] presto-server invoked oom-killer: (snip) (snip) [Tue Apr 24 00:12:34 2018] Out of memory: Kill process 21281 (snip) [Tue Apr 24 00:12:34 2018] Killed process 21281 (presto-server) (snip) [Wed Apr 25 00:12:37 2018] thread.rb:70 invoked oom-killer: (snip) (snip) [Wed Apr 25 00:12:38 2018] Out of memory: Kill process 26967 (snip) [Wed Apr 25 00:12:38 2018] Killed process 26967 (presto-server) (snip) _⼈⼈⼈⼈⼈⼈⼈_ > OOM Killer <  ̄Y^Y^Y^Y^Y^Y^Y^ ̄ あるインスタンスのログ
  14. • システム全体のメモリ: 60 GB • presto-server の RSS: 42 GB

    • yarn ユーザプロセスの合計 RSS: 15 GB OMM Killer 発動時の状況 Hive Presto
  15. • Presto と YARN アプリケーションの共存を避ける • EMR は Presto と

    YARN アプリケーションが共存する場合の⾯倒までは⾒ない • EMR クラスタは起動に 10 分程度かかるのでホットスタンバイクラスタが欲しい • 当時は EMR でマルチマスター構成にできなかった Hive ⽤クラスタと Presto ⽤クラスタを分ける
  16. • presto-server が頻繁に応答しなくなる • Hive の bucketed table を使うと遅い •

    presto-cassandra connector の planning が遅い Repro が直⾯した様々な問題(抜粋)
  17. • データセットを管理しやすい部分に分割するためのテクニック • 「プログラミング Hive」の「9.6 テーブルデータストレージのバケット化」より • 複数カラムでパーティションを構成するのに⽐べて次の効果が期待できる • 各ファイル(S3

    オブジェクト)が⼩さくなり過ぎない • メタデータの更新が速い • bucket 化するカラムの値から配置する bucket が⼀意に決まる • 特定の bucket のデータだけが必要な場合に効率的にデータを取得できる • Hive on Tez では hive.tez.bucket.pruning=true, hive.optimize.index.filter=true が必要 • Presto では特別な設定不要 Hive の bucketed table
  18. Bucketed table の具体例 CREATE TABLE users(user_id BIGINT, name STRING) PARTITIONED

    BY(app_id INT) CLUSTERED BY(user_id) INTO 256 BUCKETS; INSERT INTO users PARTITION (app_id=1) VALUES (1, 'foo'), (2, 'bar'), (255, 'baz'); $ hdfs dfs -ls /user/hive/warehouse/users/app_id=1/ | awk '{ print $8 }' /user/hive/warehouse/users/app_id=1/000001_0 /user/hive/warehouse/users/app_id=1/000002_0 ← user_id % 256
  19. • 同じテーブルの同じ bucket 番号のファイルは全部同じ worker が処理する • テーブル設計を上⼿くやらないと特定の worker にデータが集中する

    • hive.bucket_execution_enabled=false を指定することで無効化できる Presto における bucketed table の扱い
  20. • presto-server が頻繁に応答しなくなる • Hive の bucketed table を使うと遅い •

    presto-cassandra connector の planning が遅い Repro が直⾯した様々な問題(抜粋)
  21. Cassandra 導⼊後の構成 Amazon Simple Storage Service (S3) Rails application fluentd-forwarder

    scheduled job Hive Hive⽤兼ホットスタンバイクラスタ Presto Presto専⽤クラスタ fluentd-aggregator ⼀部で使⽤ メインで使⽤
  22. Amazon Simple Storage Service (S3) Rails application fluentd-forwarder scheduled job

    Hive Hive⽤兼ホットスタンバイクラスタ Presto Presto専⽤クラスタ fluentd-aggregator 1. セッションデータを Cassandra に Insert ① Insert data
  23. Amazon Simple Storage Service (S3) Rails application fluentd-forwarder scheduled job

    Hive Hive⽤兼ホットスタンバイクラスタ Presto Presto専⽤クラスタ fluentd-aggregator 2. Presto を使ってセグメンテーション ② Presto SQL ④ user IDs etc. ③ Get data in the Cassandra table
  24. パーティションの組み合わせの例 SELECT * FROM cassandra.default.events WHERE app_id = 1 AND

    dt IN ('2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04') AND bucket IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) ;
  25. パーティションの組み合わせの例 SELECT * FROM cassandra.default.events WHERE app_id = 1 AND

    dt IN ('2019-06-01', '2019-06-02', '2019-06-03', '2019-06-04') AND bucket IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) ; 1 ✕ 4 ✕ 16 = 64
  26. • Repro の Cassandra の使い⽅だとパーティションはほぼ必ず存在する • パーティションのサイズを⼩さくするために bucket 化している •

    パーティションの有無を確認してまで Planning するメリットがほぼない • Presto のリポジトリを fork してパーティションの存在チェックをスキップ • 改造して⾃前でビルドした presto-cassandra.jar を本番で使⽤ Planning の⾼速化
  27. • Presto ⽤クラスタの master node で ReadOps が急激に増えて応答不能になる • ⻑時間起動している

    presto-server のパフォーマンスが著しく劣化する • まだ⼀部のデータが Hive (S3) に依存している • 定期バッチでしか利⽤しない Hive ⽤クラスタが無駄 • Hive ⽤の EMR クラスタはバッチで利⽤する時だけ起動したい • Presto は EC2 で⾃前運⽤したい • coordinator のコールドスタンバイ • カスタム AMI の利⽤ • 安全な auto scaling • 最新版の Presto の利⽤ 現在抱えている問題 Hive Hive⽤兼ホットスタンバイクラスタ Presto Presto専⽤クラスタ
  28. • Twitter: @a_bicky • Blog: あらびき⽇記 • 所属: Repro 株式会社

    (2017 年 8 ⽉〜) • SRE っぽいことをしたり • 分析基盤っぽいことをしたり • 開発環境整備をしたり • Rails アプリケーション触ったり • CTO の⼤規模機能開発のレビューをしたり ⾃⼰紹介(再掲)
  29. • Twitter: @a_bicky • Blog: あらびき⽇記 • 所属: Repro 株式会社

    (2017 年 8 ⽉〜) • SRE っぽいことをしたり • 分析基盤っぽいことをしたり • 開発環境整備をしたり • Rails アプリケーション触ったり • CTO の⼤規模機能開発のレビューをしたり ⾃⼰紹介(再掲)
  30. • Twitter: @a_bicky • Blog: あらびき⽇記 • 所属: Repro 株式会社

    (2017 年 8 ⽉〜) • SRE っぽいことをしたり • 分析基盤っぽいことをしたり • 開発環境整備をしたり • Rails アプリケーション触ったり • CTO の⼤規模機能開発のレビューをしたり ⾃⼰紹介(再掲)
  31. • Twitter: @a_bicky • Blog: あらびき⽇記 • 所属: Repro 株式会社

    (2017 年 8 ⽉〜) • SRE っぽいことをしたり • 分析基盤っぽいことをしたり • 開発環境整備をしたり • Rails アプリケーション触ったり • CTO の⼤規模機能開発のレビューをしたり ⾃⼰紹介(再掲) ⼈が⾜りない!!
  32. • Repro では配信対象ユーザの算出などに Presto を利⽤している • Presto と YARN アプリケーションを共存させると

    OOM Killer に殺される • Presto で Hive の bucketed table を使う際はパフォーマンスに注意 • hive.bucket_execution_enabled=false を指定することでパフォーマンスが改善するかも • presto-cassandra はパーティションが⼤量にあると Planning に時間がかかる • パーティションの存在有無のチェックをスキップすれば全体の処理時間が速くなるかも • Repro にはデータ基盤周りをガンガン改善していく⼈が⾜りない • いち早く Amazon Managed Streaming for Kafka を本番で試せるかも! まとめ
  33. • クエリの統計情報は BigQuery に保存 • presto-fluentd で fluentd に QueryStatistics

    の情報を post • fluentd から BigQuery のテーブルに load • analysisTime や cpuTime の⼤きなレコードの query を確認 重い Presto SQL の⾒つけ⽅
  34. • Deduplication に異常に時間がかかる • presto-server が頻繁に応答しなくなる • Hive の bucketed

    table を使うと遅い • presto-cassandra connector の planning が遅い Repro が直⾯した様々な問題(番外編)
  35. Rails application fluentd-forwarder scheduled job Amazon Simple Storage Service (S3)

    fluentd-aggregator Hive Presto 3. Hive で temporary table の内容を挿⼊(再掲) ⑥ HiveQL ⑦ Get LZO objects in the temp table ⑧ Put parquet objects
  36. 1 map task に⼩さい S3 オブジェクトが集中 The number of S3

    objects task1 task2 task3 task4 task5 task6 Total S3 bytes read task1 task2 task3 task4 task5 task6 ※当時調べた時のイメージ
  37. 1. s3-dist-cp で S3 オブジェクトを HDFS に転送 • 5 分⾜らずで転送可能

    2. HDFS 上のファイルに対して S3 と同じ形式でテーブルを作成 • CREATE TABLE & MSCK REPAIR TABLE 3. 作成したテーブルを⼊⼒に deduplication 4. 作成したテーブルを削除 S3 オブジェクトの取得にかかる時間を削減 ※ 毎回の INSERT の時に hive.merge.tezfiles=true とするだけで良かったかも