下述Worker源码调用链路基于Trino(原PrestoSQL)330版本,在Coordinator端调用SqlStageExecution.scheduleTask()->HttpRemoteTaskFactory.createRemoteTask()和HttpRemoteTask.start()之后,最终会走到HttpRemoteTask.sendUpdate(),将执行task请求封装成JSON格式后,通过Http客户端发送给Worker节点,在Worker端收到Coordinator端发来的HTTP请求后,就会进行如下步骤:
// 生产流程,Worker启动后从这里接收Coordinator的创建task请求,其中包含了splits信息
TaskResource.createOrUpdateTask
->SqlTaskManager.updateTask
->SqlTask.updateTask
->SqlTaskExecution.addSource
->updateSources
->schedulePartitionedSource
->enqueueDriverSplitRunner
->TaskExecutor.enqueueSplits
// 消费流程,Worker进程从这里开始启动并创建TaskRunner线程池,然后利用上面链路接收Coordinator发来的task请求中的splits信息,在这里拿到split进行处理
TaskExecutor.start
->addRunnerThread
->new TaskRunner().run
->PrioritizedSplitRunner.process
->SplitRunner.run
->DriverSplitRunner.run
->Driver.processFor
->Driver.processInternal
->Driver.processNewSources
// 读取文件
Driver.processInternal
->TableScanOperator.getOutput
->PageSourceManager.createPageSource
->ClassLoaderSafeConnectorPageSourceProvider.createPageSource
->HivePageSourceProvider.createPageSource
->createPageSourceInternal
->createHivePageSource
->OrcPageSourceFactory.createPageSource
->createOrcPageSource
->new HdfsOrcDataSource
->new OrcReader与OrcReader.createRecordReader
->public OrcRecordReader中new StripeReader和createColumnReaders
// 上面各种create reader后回到上述读取文件流程开头的TableScanOperator.getOutput
TableScanOperator.getOutput
->OrcPageSource.getNextPage
->OrcRecordReader.nextPage
->advanceToNextRowGroup
->advanceToNextStripe
->StripeReader.readStripe,和OrcRecordReader.nextPage中通过ColumnReader.readBlock构建Page
在读取ORC文件方面,由于历史原因Presto社区当时自己实现了一套ORC Reader逻辑,但多年来因修bug、提升读性能等消耗了开源社区不少精力,而且其中有很多还是从ORC社区源码借鉴来的。因此有部分声音认为:现在更应该直接采用ORC社区官方的Reader逻辑,可以让Presto社区花更多精力专注于优化更核心的架构功能。