这是我参与「第四届青训营 」笔记创作活动的第7天
题目来源:【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金
-
能否区分task、pipline、split、driver等worker侧的概念
- task:单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个Task
- pipeline:Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline
- split:输入数据描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源split,也代表了不同stage间传输的数据
- driver:Pipeline 的可执行实体 , Pipeline 和 Driver 的关系可类比 程序和进程 ,是最小的执行单元,通过 火山迭代模型执行每一个Operator
-
本节课讲授的Presto重要机制有哪些?
-
多租户隔离:通过Resource Group对不同的用户创建不同Group从而实现不同租户,不同场景的资源管理
-
Stage调度方式
- AllAtOnceExecutionPolicy:所有都同时执行,可能有空跑情况,但执行速度快,可以通过内存传递数据
- PhasedExecutionPolicy:阶段执行,按stage执行,延迟高,节省资源
-
Task 调度方式
- HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
- SOFT_AFFINITY: 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
- NO_PREFERENCE: 随机选取,常用于普通的纯计算 Task
-
Back pressure mechanism
- 控制split生成流程
- 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
- 控制Operator执行速度
- "sink.max-buffer-size" 写入buffer的大小控制
- "exchange.max-buffer-size" 读取buffer的大小控制
- Buffer 达到最大值时Operator会进入阻塞状态
-
-
能否完整的描述一遍Presto多租户调度中的相关流程?
-
执行主要流程:
- 先判断query属于哪个资源组
- 看看当前组有没有quota执行该query,有直接运行,没有则塞入队列,等待资源。
- 执行的query周期性汇报资源使用情况,资源组更新quota,减去已使用部分。当quota减为0了,新进入的查询只能进入等待队列,等待有quota了,被manager调度执行。该资源组处于封禁状态,等待query执行完解禁。
- mananger轮询有quota的组,调度组里面处于队列中的query。
-
调度策略:
- FIFO:先进先出
- 公平调度:每个任务分配一定的时间片,时间片耗尽需要停止执行;任务有优先队列,按16/8/4/2/1来分配时间片,新任务进入16的队列,如果时间片耗尽还没有执行完成,就进入下一个队列,分配时间片减少;保证新任务能得到快速执行,长时间任务不会饥饿。
-
-
Pipeline化数据处理是否等价于流式计算?
- 不等价,pipeline化只能保证stage内部是流式传递
- AllAtOnceExecutionPolicy模式,前一个stage的数据可以流式传递给下一个stage,但输出数据还是按照批式来,不是流式输出
- PhasedExecutionPolicy是批式调度,一个stage完成后,再开始下一个stage
-
能否实现可中断的正则表达式,性能与普通正则表达式相比如何?
- 可以起一个后台线程,发现正则表达式执行过长,超时停止