Presto中Task管理机制理解

1、 Presto中的task

        在Presto中,coordinator对worker的任务分发和调度是以task的形式进行的。一个分布式计划的Stage包含1个或者多个Task,每个Task包含1个或者多个Split。了解Presto中的Task管理机制有助于了解Presto中的Coordinator与Worker之间的调度机制。

       在Presto中,每个task有单独的ID,TasK ID的构成格式为queryID.stageID.Task顺序号,比如:比如:20211103_225744_00000_wqant.0.0

     可以在原生页面中查看Tasks的状态:

 

2. Task的生成

    Presto中生成Task的代码在:

    SqlStageExecution::scheduleSplits

          task = scheduleTask(node, taskId, splits, OptionalInt.empty());

                  RemoteTask task = remoteTaskFactory.createRemoteTask

3. coordinator向worker提交task

     coordinator向worker提交tasks的代码流程:

     RemoteTask task = remoteTaskFactory.createRemoteTask

           new HttpRemoteTask(..., PlanFragment, ...)

                      locationFactory.createTaskLocation(node, taskId)

                           TaskInfo initialTask = createInitialTask(..., location, ...)

                                 TaskStatus.self = self //self就存放着task提交的地址,比如:http://workerip:workerport/v1/task/20211103_225744_00000_wqant.0.0

                                       executor.execute(this::sendUpdate);

                                          HttpUriBuilder uriBuilder = getHttpUriBuilder(taskStatus);

                                                 uriBuilderFrom(taskStatus.getSelf());

                                                      httpClient.executeAsync(request, ....) //至此,coordinator将Task请求提交给worker执行

4.  worker 执行Task

     @POST

   @Path("{taskId}")

          TaskResource::createOrUpdateTask

                taskManager.updateTask

                    sqlTask.updateTask

                        sqlTaskExecutionFactory.create

                              createSqlTaskExecution(..., localExecutionPlan, ...)

                                    createTaskHandle(taskExecutor)

                                        taskExecutor.addTask

           TaskExecutor::addRunnerThread

                  executor.execute

                      split.process(); // 至此进行了split的数据处理

5. Task执行结果拉取

         在构建Task的时候,下游的Task保存着上游的Task的result url, 下游任务开始的时候,实时地从上游的获取结果的url拉取数据,上游产生一批数据,下游便拉过来处理,实现了pipeline式的作业调度,避免一个task必须等另外一个task完成才能处理数据的空等待,这也是Presto能高效进行数据处理和计算一大原因。

SqlQueryScheduler::createStages

            stage::addExchangeLocations

                  URI exchangeLocation = sourceTask.getTaskStatus().getSelf(); //self 就是3提到的task的提交地址

                  newSplits.put(remoteSource.getId(), createRemoteSplitFor(task.getTaskId(), exchangeLocation));    //将下游split的source url 设置为上游的result url

                          uriBuilderFrom(taskLocation).appendPath("results") //self + results就是上游task结果存放的url

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值