使用自定义类作为DataStreamSource类型时Flink作业执行失败求助
使用自定义类作为DataStreamSource类型时Flink作业执行失败求助
兄弟,我仔细看了你的代码和报错堆栈,一下子就找到问题根源啦!
你看报错最底层的核心异常信息:
Caused by: java.lang.NoSuchMethodException: org.example.Ttest2.
()
这说明你的自定义Tuple子类Ttest2没有提供无参构造方法。Flink用来序列化Tuple类型的TupleSerializer在反序列化过程中,需要通过无参构造来创建类的实例,而你的Ttest2只定义了带参的构造方法,导致Flink无法实例化对象,最终抛出了实例化异常。
而你用内置Tuple类(比如Tuple2、Tuple3)的时候没问题,是因为这些官方内置的Tuple类本身就自带了public的无参构造方法,完全符合Flink序列化的要求。
解决方法很简单:给Ttest2添加一个无参构造方法
修改后的Ttest2代码如下:
class Ttest2 extends Tuple2<Integer, String> implements Serializable { // 添加public的无参构造方法 public Ttest2() { super(); // 调用父类Tuple2的无参构造 } public Ttest2(Integer first, String second) { super(first, second); } @Override public String toString() { return "QueryInfo{" + "queryId=" + f0 + ", queryValue=" + f1 + '}'; } }
另外还要提醒你一个小细节:如果Ttest2是定义在DataStreamJob类内部的内部类,一定要把它改成static内部类,否则它会隐式持有外部类DataStreamJob的引用,序列化时可能会引发其他意想不到的问题哦!
修改完之后再运行你的作业,应该就能正常输出自定义类的内容啦~
备注:内容来源于stack exchange,提问作者rsttt
相关产品推荐
相关产品推荐

