reizist's blog

ウェブ

prestodbにおけるelapsed timeとは何か

prestodbを扱っていてクエリメトリクスを見る上で必ず参照することになるelapsed timeが一体何なのかを調べたメモ。 一言でいうとクエリが作成されてからクエリが完了するまでの時間なんだけど、じゃあそれがいつなのかというのをソースを追う。

全体の流れを追うのに、

https://www.slideshare.net/frsyuki/hadoop-source-code-reading-15-in-japan-presto

https://image.slidesharecdn.com/hsr15-presto-131223202205-phpapp01/95/hadoop-source-code-reading-15-in-japan-presto-10-638.jpg?cb=1387830178

presto_executor_and_coordinator.md · GitHub

あたりが非常に参考になるので足がかりにするとよい。

実際に createTime , endTime を作成しているのは QueryStateMachine 内で、

https://github.com/prestodb/presto/blob/bcfb4c6f2872f9de39c0e8f42c6bd43dd08241c2/presto-main/src/main/java/com/facebook/presto/execution/QueryStateMachine.java#L90

  • endTime : recordDoneStats() コール時
    • transitionToFinished() or transitionToFailed() or transitionToCanceled() の処理内で recordDoneStats() が呼ばれる

https://github.com/prestodb/presto/blob/bcfb4c6f2872f9de39c0e8f42c6bd43dd08241c2/presto-main/src/main/java/com/facebook/presto/execution/QueryStateMachine.java#L657

実際に QueryStateMachineインスタンスSqlQueryExecution のコンストラクタ内で作成され、 transitionToXXX()com.google.common.util.concurrent.Futures#addCallback() によって onSuccess() などのcallbackとして処理される。

https://github.com/prestodb/presto/blob/bcfb4c6f2872f9de39c0e8f42c6bd43dd08241c2/presto-main/src/main/java/com/facebook/presto/execution/QueryStateMachine.java#L636

SqlQueryExecution のオブジェクトは SqlQueryManager#createQuery によって作成される。

https://github.com/prestodb/presto/blob/dba2648ddc34875aa8b4f8e32a4dba7ba5920e0d/presto-main/src/main/java/com/facebook/presto/execution/SqlQueryManager.java#L412


メトリクスを把握するのによく参照する時間周りのまとめ。

タイプ 処理クラス
createTime クエリ作成時間 QueryStateMachine
startTime 実際のクエリ処理開始時間 Session
endTime 実際のクエリ処理完了時間 QueryStateMachine
queuedTime duration(startTime - createTime) QueryStateMachine
elapsedTime duration(endTime - createTime) QueryStateMachine
executionTime elapsedTime - queuedTime QueryStats

雑いけどひとまずメモ。