読者です 読者をやめる 読者になる 読者になる

Prestoのcodegen

以前、Prestoバイトコード生成部分のソースコードを読んだので、hack再開時のためにメモしておく。

  • コード生成にはobjectwebのASMを利用している。Parser generatorはANTLR

  • ExpressionCompiler#internalCompileFilterAndProjectOperator codegenしているのはfilter句とprojection句のみ。Joinは残念ながらcodegenされていない。

  • SqlStageExecution#startTasks evaluate planの中身はremote taskというのがsubStages(StageExecutionPlan)があると作られる

  • join関係のrewriteはPredicatePushDown。Volcanoのexchange抽象operatorでremoteの実行を抽象化。LocalExecutionPlannerのvisitJoinあたりで実行operatorを生成

  • operatorがstageddbみたいにblocking queueみたいので独立に動いている(?) inputが必要なのはpageというのをやりとり

  • PageBuilderでPageを生成。Pageはtuplesのplaceholder

  • Operator#getOutput がeval相当。HashJoinOperatorはbuild/probeのin-memory hash join。 grace hash joinもサポートしていないので、バケットがメモリに乗り切らないと駄目な…な実装ですね*1。ChannelIndexのSlice(nio.bytebuffer)にtupleを保持

  • Sliceはnon-jvmheapにメモリを確保するairliftというライブラリを利用


合わせて読みたい。

*1:大量メモリを確保できる前提なのでしょう