Presto 架构原理与优化介绍 课后习题 | 青训营笔记

91 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

题目来源:【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金

  1. 能否区分task、pipline、split、driver等worker侧的概念

    1. task:单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个Task
    2. pipeline:Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline
    3. split:输入数据描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源split,也代表了不同stage间传输的数据
    4. driver:Pipeline 的可执行实体 , Pipeline 和 Driver 的关系可类比 程序和进程 ,是最小的执行单元,通过 火山迭代模型执行每一个Operator
  1. 本节课讲授的Presto重要机制有哪些?

    1. 多租户隔离:通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理

    2. Stage调度方式

      1. AllAtOnceExecutionPolicy:所有都同时执行,可能有空跑情况,但执行速度快,可以通过内存传递数据
      2. PhasedExecutionPolicy:阶段执行,按stage执行,延迟高,节省资源
    3. Task 调度方式

      1. HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
      2. SOFT_AFFINITY: 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
      3. NO_PREFERENCE: 随机选取,常用于普通的纯计算 Task
    4. Back pressure mechanism

      1. 控制split生成流程
      2. 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
      3. 控制Operator执行速度
      4. "sink.max-buffer-size" 写入buffer的大小控制
      5. "exchange.max-buffer-size" 读取buffer的大小控制
      6. Buffer 达到最大值时Operator会进入阻塞状态
  1. 能否完整的描述一遍Presto多租户调度中的相关流程?

    1. 执行主要流程:

      1. 先判断query属于哪个资源组
      2. 看看当前组有没有quota执行该query,有直接运行,没有则塞入队列,等待资源。
      3. 执行的query周期性汇报资源使用情况,资源组更新quota,减去已使用部分。当quota减为0了,新进入的查询只能进入等待队列,等待有quota了,被manager调度执行。该资源组处于封禁状态,等待query执行完解禁。
      4. mananger轮询有quota的组,调度组里面处于队列中的query。
    2. 调度策略:

      1. FIFO:先进先出
      2. 公平调度:每个任务分配一定的时间片,时间片耗尽需要停止执行;任务有优先队列,按16/8/4/2/1来分配时间片,新任务进入16的队列,如果时间片耗尽还没有执行完成,就进入下一个队列,分配时间片减少;保证新任务能得到快速执行,长时间任务不会饥饿。
  1. Pipeline化数据处理是否等价于流式计算?

    1. 不等价,pipeline化只能保证stage内部是流式传递
    2. AllAtOnceExecutionPolicy模式,前一个stage的数据可以流式传递给下一个stage,但输出数据还是按照批式来,不是流式输出
    3. PhasedExecutionPolicy是批式调度,一个stage完成后,再开始下一个stage
  1. 能否实现可中断的正则表达式,性能与普通正则表达式相比如何?

    1. 可以起一个后台线程,发现正则表达式执行过长,超时停止