Slide 1

Slide 1 text

TreasureData Tech Talk 2022 Hive Distributed Profiling System in Treasure Data @okumin(Shohei Okumiya) 日本語版

Slide 2

Slide 2 text

© 2022 Treasure Data, Inc. Public 2 Agenda - TDのクエリエンジンサービスについて - HDPS(Hive Distributed Profiling System)の概要 - HDPS活用例 - HDPSを実装する上で工夫した点 - 今後の取り組み

Slide 3

Slide 3 text

© 2022 Treasure Data, Inc. Public 3 TDのクエリエンジンサービスについて

Slide 4

Slide 4 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public TD’s Query Engine Service 4 Web UI CDP BI tool SQL etc. Plazma (TD’s Storage) Managed by Query Engine team Data

Slide 5

Slide 5 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - SQLをインタラクティブに実行するクエリエディタ Web UI(アナリスト向け) 5

Slide 6

Slide 6 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - フルマネージドDigdagであるTreasure Data Workflowを利用可能 ワークフローエンジン(データエンジニア向け) 6

Slide 7

Slide 7 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - SQLを書かずにデータ分析 CDP - Customer Data Platform(マーケター向け) 7 Compile

Slide 8

Slide 8 text

© 2022 Treasure Data, Inc. Public 8 HDPS(Hive Distributed Profiling System)の概要

Slide 9

Slide 9 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - CPU/Method Profiling - どのメソッドや行がCPUを消費しているのか? Profilingとは? 9

Slide 10

Slide 10 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - HDPS = Hive Distributed Profiling System - HDPSはHive用に設計されたプロファイリングツール - 大量のメトリクスを蓄積可能 - 柔軟かつスケーラブルな分析機能 Hive Distributed Profiling System(HDPS) 10 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI

Slide 11

Slide 11 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - Hiveクエリのあらゆる断面からプロファイリング HDPS UI - 柔軟な検索パラメータ 11

Slide 12

Slide 12 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - CPU消費の激しい行をランキング形式で表示 HDPS UI - ボトルネックレポート 12

Slide 13

Slide 13 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - フレームグラフを用いてスタックトレース上のホットなパスを可視化 HDPS UI - Flame Graph 13 GroupByOperator.processにカーソルを当てた状態

Slide 14

Slide 14 text

© 2022 Treasure Data, Inc. Public 14 HDPS活用例

Slide 15

Slide 15 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 活用例 15 - トラブルシューティング - 性能問題の調査に活用 - 改善ポイントの発見 - 意思決定に活用

Slide 16

Slide 16 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public トラブルシューティング: HIVE-26184 16 - あるクエリがデータ量等に対して異常に遅い、とのお問い合わせ - HDPSを用いてCOLLECT_SET UDFが原因であると即座に発見

Slide 17

Slide 17 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public トラブルシューティング: HIVE-26184 17 - CPU時間の98%を java.util.HashSet#clear が消費していた - COLLECT_SETの時間計算量O(N^2) - Apache HiveにPull Requestを送り、最終的に20倍以上高速化

Slide 18

Slide 18 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 改善ポイントの発見 18 - HDPSはアカウントやジョブをまたいで分析可能 CDP関連のクエリを全部分析

Slide 19

Slide 19 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 改善ポイントの発見 19 - どの部分が改善できそうか探索 - 例: 大変だけど大幅な改善が見込めそう -> プロジェクト提案 - 例: 数%の改善だけど修正範囲は数行 -> 次のスプリントで - 例: 大変な上に少ししか改善しない -> やらない

Slide 20

Slide 20 text

© 2022 Treasure Data, Inc. Public 20 HDPSを実装する上で工夫した点

Slide 21

Slide 21 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい! 工夫した点 21 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI

Slide 22

Slide 22 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 工夫した点 (1) 22 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい!

Slide 23

Slide 23 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public - クエリシミュレータで任意のバージョン・設定でスタックトレースを取得 - 本番環境のクエリを安全にリプレイ可能 - 詳しくは『Journey of Migrating Millions of Queries on The Cloud』を参照 - https://arxiv.org/abs/2205.08664 query_fetcher: handler: com.treasudata.hadoop.hive.simulator.executor.fetch.SqlQueryFetcherImpl input_params: fetch_query_sql: | SELECT time, database, query, elapsed, job_id, success, ... FROM hive WHERE TD_TIME_RANGE(time, '2022-11-01', '2022-11-02') AND elapsed >= 600 query_executor: query_execution_params: - id: 1 hive_docker_version: worker8-hive:0.1.109-8478 hive_configurations: td.hive.jfr.enabled: "true" mapreduce.map.java.opts: "-XX:-Inline" Query Simulator 23 テスト対象をリストアップ TD Hiveバージョン サンプリング有効化 隔離された環境で実行するのでこんな設定も反映可能

Slide 24

Slide 24 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 工夫した点 (2) 24 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい!

Slide 25

Slide 25 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public Java Flight Recorder 25 - Java Flight Recorderを使用してスタックトレースのサンプルを取得 - OpenJDKに同梱されているので導入が容易 - Java APIがHiveと連携する上で便利 final Recording recording = new Recording(settings); recording.setToDisk(true); recording.setDestination(dumpFile); recording.start(); // You can measure anything ... recording.stop(); try (RecordingFile file = new RecordingFile(dumpFile)) { while (file.hasMoreEvents()) { final RecordedEvent event = file.readEvent(); final RecordedStackTrace stackTrace = event.getStackTrace(); stackTrace.getFrames().forEach(frame -> { final String methodName = frame.getMethod().getName(); final int lineNumber = frame.getLineNumber(); sendToAnywhere(methodName, lineNumber); }); } }

Slide 26

Slide 26 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public Hive on Tezとの連携 26 - HiveはSQLやデータによって実行されるコードパスが大きく変わる - Hive on Tezは単一JVM上で様々なタスクを実行する - タスクに関連するIDをスタックトレースと一緒に保存すると分析時に便利 - 例: TD job id, YARN application id, Tez vertex id, Tez task attempt id ReduceSinkOperator TableScanOperator SelectOperator GroupByOperator GroupByOperator FileSinkOperator Map 1 Map 1 Reduce 2 Map 1 Reduce 2 Map 1 Plan Reduce 2 Plan Container(JVM) Container(JVM)

Slide 27

Slide 27 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 工夫した点 (3) 27 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい!

Slide 28

Slide 28 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public Plazmaへメトリクスを保存 28 - PlazmaはTreasure Dataが開発する分散ストレージ - スケーラブルなストレージとストリーミングインサートAPI - 現在200兆以上のレコードを保存 - 大量にスタックトレースを生成してもPlazmaなら問題なく受け止められる - 1000並列で1秒間に10回サンプリングすると毎秒1万 <- 余裕 - 各スタックトレースに30以上のメソッド呼び出しが含まれる <- 余裕

Slide 29

Slide 29 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 工夫した点 (4) 29 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい!

Slide 30

Slide 30 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 分析にもHiveを使用 30 - 大量のスタックトレースと関連メトリクスの読み込み・結合が発生 - 毎秒1万のスタックトレース => 1時間分で3600万 - HDPS UIは入力パラメータをもとにSQLを生成しHiveで実行 - Hiveのスケーラビリティにより、入力データがどれだけ巨大でも分析可能 SELECT ... FROM tez_task_attempt_method_sampling AS t JOIN tez_vertex_finished AS v ON t.vertex_id = v.vertex_id JOIN tez_vertex_execution_plan AS p ON t.vertex_id = p.vertex_id JOIN hive AS h ON t.job_id = h.job_id WHERE TD_TIME_RANGE(t.time, '2022-11-21 00:00:00', '2022-11-22 00:00:00') AND TD_TIME_RANGE(v.time, '2022-11-21 00:00:00', '2022-11-22 00:00:00') AND TD_TIME_RANGE(p.time, '2022-11-21 00:00:00', '2022-11-22 00:00:00') AND TD_TIME_RANGE(h.time, '2022-11-21 00:00:00', '2022-11-22 00:00:00') AND t.thread = 'TezChild' AND v.vertex_name LIKE 'Reducer %' AND h.query LIKE '-- CDP: Audience:' AND p.plan LIKE '%Merge Join Operator%'

Slide 31

Slide 31 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 工夫した点 (5) 31 Hadoop Metrics DB (Plazma) Hive Query Hive Query Hive Query Hive Query Stack Traces Aggregation Visualization Query Simulator HDPS UI 1. 分析対象を好きなバージョンやパラメータで実行したい! 2. スタックトレースを実行コンテキストと一緒に保存したい! 3. 大量のスタックトレースを保存したい! 4. 大量のスタックトレースを柔軟な条件で分析したい! 5. GUIがほしい!

Slide 32

Slide 32 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public HDPS UI 32 - 結果をいい感じに一覧するためにフレームグラフが欲しかった - TypeScript + React + d3-flame-graph

Slide 33

Slide 33 text

© 2022 Treasure Data, Inc. Public 33 今後の取り組み

Slide 34

Slide 34 text

© 2022 Treasure Data, Inc. Public © 2022 Treasure Data, Inc. Public 今後やりたいこと 34 - Apache Hiveに分析結果やパッチをフィードバック - TDはOSSの改善をする上で最も良質なデータを集められる環境 - Trino(PrestoSQL)に対しても似たようなシステムを構築 - 似たシステムなので似た課題がある

Slide 35

Slide 35 text

© 2022 Treasure Data, Inc. Public 35 Thank you