openLooKeng 算子接口和执行流程
1 openLooKeng 算子接口
1.1 openLooKeng 算子相关类
▲ 图 1-1 算子相关类
openLooKeng 生成物理执行计划后,真正执行计划的是一个一个的算子(即 Operator)。openLooKeng 中将算子抽象为 Operator 接口,将算子工厂抽象为 OperatorFactory 接口,如图 1-1 所示。
而具体的算子则实现相应的 OperatorFactory 接口和 Operator 接口即可。例如 Limit 算子,在 openLooKeng 中会相应的有 LimitOperatorFactory 和 LimitOperator。
1.2 openLooKeng 算子接口
OperatorFactory 提供的接口如表 1-1 所示:
createOperator,创建算子,返回相应的算子实例对象;
noMoreOperators,不再创建算子,可以释放 OperatorFactory 相关的资源;
duplicate,在 right outer join 或者 full outer join 时用到,用于复制 OperatorFactory,返回 OperatorFactory 实例对象。
▲表 1-1 OperatorFactory 接口
Operator 提供的接口如表 1-2 所示:
isBlocked,当前算子是否被 Block,返回 ListenableFuture;
isFinished,当前算子处理是否结束,结束返回 true,不再输出 page;
needsInput,当前算子是否可以接收输入 page,可以则返回 true;
addInput,当前算子接收输入 page,前提是当前算子的 needsInput 返回 true;
getOutput,当前算子输出 page,如果没有输出 page 则返回 null;
finish,通知当前算子不再接收输入 page,当前算子可以开始计算或者结束计算;
close,当前算子释放相关资源;
getOperatorContext,返回 OperatorContext;
startMemoryRevoke,内存不足时,将中间数据 spill to disk,实现可以参考 HashAggregationOperator,返回 ListenableFuture;
finishMemoryRevoke,startMemoryRevoke 完成后调用,用于清理资源。
▲表 1-2 Operator 接口
2 openLooKeng 算子执行流程
openLooKeng 算子的执行流程代码在 Driver#processInternal()方法中,其中核心代码片段如下图所示:
翻译如下:
▲图 2-1 pipeline 算子执行
通常,一个 stage 由多个 pipeline 组成,一个 pipeline 由多个 operator 组成,一个 driver 运行一个 pipeline。图 2-1 展示的是一个 pipeline 内算子的执行流程。如果某一个时刻 operator1 被阻塞,线程并不会等 operator1,而是继续往后走,即 current 指向 operator2 开始新一轮的处理。如果当前 Driver 没有结束且运行时间在 1s 内会继续从 operator1 开始处理。
对于同一个算子而言,其可能的接口调用顺序为:
isBlocked()
needsInput()
addInput()
getOperatorContext()
finish()
isFinished()
getOutput()
close()
本文作者:刘玉,转载请联系 openLooKeng 小助手
版权声明: 本文为 InfoQ 作者【openLooKeng】的原创文章。
原文链接:【http://xie.infoq.cn/article/64faadb3ebb5277f9182ac2af】。文章转载请联系作者。
评论