为类型提示提供flink输出流的非弃用方法是什么?

时间:2017-01-22 09:39:45

标签: java generics apache-flink type-erasure

我一直在Flink中遇到InvalidTypesException,通常在自定义通用SourceFunction<OUT>时。这是一个示例,当添加到我的StreamExecutionEnvironment时,会在运行时抛出这些异常:

public class MyCustomSource<OUT> extends RichSourceFunction<OUT> {
    @Override
    public void run(SourceContext<OUT> sourceContext) throws Exception {
        OUT foo = null;
        // ... creates foo somehow ...
        sourceContext.collect(foo);
    }
    @Override
    public void cancel() {
        // ...
    }
}

相关的例外文本是:

  

引起:org.apache.flink.api.common.functions.InvalidTypesException:无法确定'class org.apache.flink.streaming.api.functions.source.RichSourceFunction'中TypeVariable'OUT'的类型。这很可能是类型擦除问题。仅当返回类型中的所有变量都可以从输入类型推导出来时,类型提取目前仅支持具有泛型变量的类型。

无论OUT是POJO,通用类型,Flink内部类型如元组等,都会发生这种情况。

通过returns()方法添加类型提示,我找到了一种可靠的方法来避免这种情况。例如:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(new MyCustomSource<String>())
   .returns(String.class)
   //.etc.

但这种方法在flink 1.1.4中已弃用;有人知道什么是提供类型提示的非弃用方式? Flink Internals wiki仅提及returns(),但最近一年前更新过。

1 个答案:

答案 0 :(得分:1)

您的MyCustomSource应该实现ResultTypeQueryable界面,以TypeInformation的形式将类型返回给Flink。

请参阅https://ci.apache.org/projects/flink/flink-docs-release-1.1/apis/common/index.html#type-erasure--type-inference