提交查詢的步驟
1乐埠、獲取SQL
2、發(fā)送restful請求給coordinator即寒,并返回結(jié)果
3姨蟋、cli循環(huán)分批讀取查詢結(jié)果并顯示
源碼解析
CLI客戶端啟動類就Presto? main 方法? 彩蛋? 如果啟動presto CLI 的時候有 --version or --help 將提示幫助信息
否則調(diào)用Console.run()? 會生成一個查詢執(zhí)行包裝類QueryRunner,后續(xù)的啟動和執(zhí)行都是通過該類
啟動presto CLI時,如果指定了 --execute or --file 讀取SQL 否則在CLI端輸入SQL
SQL語句的提交和執(zhí)行通過QueryRunner的 executeCommand方法与殃, 其中 QueryRunner.startQuery初始執(zhí)行单山,通過Query.renderOutput循環(huán)發(fā)送restful請求分批獲取查詢結(jié)果。
startQuery 中new statementClient對象幅疼,構(gòu)建Request(通過session中的server值 即為coordinator的URI米奸,進而將SQL以restful請求發(fā)送給coordinator 通過statementResource類) 并接收response
renderOutput? 會根據(jù)interactive標(biāo)識決定是否實時更新數(shù)據(jù),如果距離上次更新超過0.5s 則更新爽篷。不管是否實時更新都會調(diào)用client.advance()躏升,改方法通過coordinator返回的nextResultUri向coordinator繼續(xù)發(fā)請求,來分批獲得查詢結(jié)果
提交查詢的流程
client發(fā)請求給coordinator 狼忱,coordinator返回結(jié)果和nextResultUri膨疏,如果沒有結(jié)果了結(jié)束一睁,如果nextResultUri不為空繼續(xù)發(fā)請求給coordinator。