我一直在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()
,但最近一年前更新过。
答案 0 :(得分:1)
您的MyCustomSource
应该实现ResultTypeQueryable
界面,以TypeInformation
的形式将类型返回给Flink。