Prestoのcodegen
以前、Prestoのバイトコード生成部分のソースコードを読んだので、hack再開時のためにメモしておく。
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:大量メモリを確保できる前提なのでしょう