2.2 StreamOperator的定义与实现

我们已经知道,Transformation负责描述DataStream之间的转换信息,而Transformation结构中最主要的组成部分就是StreamOperator。下面我们详细了解StreamOperator的具体实现。

如图2-3所示,从StreamOperator UML关系图中可以看出,StreamOperator作为接口,在被OneInputStreamOperator接口和TwoInputStreamOperator接口继承的同时,又分别被AbstractStreamOperator和AbstractUdfStreamOperator两个抽象类继承和实现。其中OneInputStreamOperator和TwoInputStreamOperator定义了不同输入数量的StreamOperator方法,例如:单输入类型算子通常会实现OneInputStreamOperator接口,常见的实现有StreamSource和StreamSink等算子;TwoInputStreamOperator则定义了双输入类型算子,常见的实现有CoProcessOperator、CoStreamMap等算子。从这里我们可以看出,StreamOperator和Transformation基本上是一一对应的,最多支持双输入类型算子,而不支持多输入类型,用户可以通过多次关联TwoInputTransformation实现多输入类型的算子。

图2-3 StreamOperator UML关系图

通过图2-3可以看出,不管是OneInputStreamOperator还是TwoInputStreamOperator类型的算子,最终都会继承AbstractStreamOperator基本实现类。在调度和执行Task实例时,会通过AbstractStreamOperator提供的入口方法触发和执行Operator。同时在AbstractStreamOperator中也定义了所有算子中公共的组成部分,如StreamingRuntimeContext、OperatorStateBackend等。对于AbstractStreamOperator如何被SubTask触发和执行,我们会在第4章讲解任务提交与运行时做详细介绍。另外,AbstractUdfStreamOperator基本实现类则主要包含了UserFunction成员变量,允许当前算子通过自定义UserFunction实现具体的计算逻辑。