Flink-Java报错之org.apache.flink.api.common.functions.InvalidTypesException

文章讲述了在使用ApacheFlink执行作业时遇到的InvalidTypesException,主要原因是Java泛型和lambda表达式导致的类型难以自动确定。解决方法包括使用匿名类实现FlatMapFunction接口或显式指定类型信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在启动Flink作业时报错。可以看到是在实现FlatMapFunction时InvalidTypesException类型无效。提示使用匿名类或者明确指定类型来解决。An easy workaround is to use an (anonymous) class instead that implements the 'org.apache.flink.api.common.functions.FlatMapFunction' interface. Otherwise the type has to be specified explicitly using type information.

Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function 'main(WordCount.java:22)' could not be determined automatically, due to type erasure. You can give type information hints by using the returns(...) method on the result of the transformation call, or by letting your function implement the 'ResultTypeQueryable' interface.
	at org.apache.flink.api.dag.Transformation.getOutputType(Transformation.java:496)
	at org.apache.flink.streaming.api.datastream.DataStream.getType(DataStream.java:193)
	at org.apache.flink.streaming.api.datastream.KeyedStream.<init&
### 关于Flink类型信息包缺失问题的解决方案 在开发基于Apache Flink的应用程序时,如果遇到`org.apache.flink.api.common.typeinfo.TypeInformation`类找不到的情况,通常是因为Maven项目的依赖配置不当或者运行环境中的classpath未正确加载所需的库文件。 以下是针对该问题的具体分析和解决方法: #### 1. 检查Maven依赖范围 当使用Maven构建Flink项目时,默认情况下某些依赖项可能被标记为`<scope>provided</scope>`。这意味着这些依赖仅用于编译阶段,在打包后的JAR文件中不会包含它们[^5]。 因此,如果目标是在本地环境中测试应用程序,则需要调整IDEA或其他集成开发工具的运行配置,确保将带有`provided`作用域的依赖也加入到classpath中。通过勾选 **Add dependencies with "provided" scope to classpath** 可实现这一点。 #### 2. 修改POM.xml文件 为了彻底解决问题并使应用能够在任何环境下正常工作而无需额外设置,可以考虑移除那些不必要的`<scope>provided</scope>`标签或将它们替换为默认值(即compile)。例如,对于Flink核心API相关的依赖声明如下: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.11</artifactId> <version>${flink.version}</version> </dependency> ``` #### 3. 验证CLASSPATH设置 即使解决了上述两个方面的问题,仍需确认实际执行命令所使用的classloader能够访问全部必要的jar包。如果是提交至集群运行的任务,请记得利用Flink自带的命令行参数指定附加资源路径;比如采用 `-c` 参数指明入口类的同时带上完整的fat-jar文件作为输入源之一[^3]。 #### 示例代码片段展示如何创建一个简单的WordCount作业 下面给出一段标准的Flink Word Count例子供参考学习目的使用: ```java import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.util.Collector; public class WordCountExample { public static void main(String[] args) throws Exception { final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); DataSet<String> text = env.fromElements( "To be, or not to be,--that is the question:--", "Whether 'tis nobler in the mind to suffer" ); DataSet<Tuple2<String, Integer>> wordCounts = text.flatMap(new Tokenizer()) .groupBy(0) .sum(1); wordCounts.print(); } public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { String[] tokens = value.toLowerCase().split("\\W+"); for (String token : tokens){ if(token.length() > 0){ out.collect(new Tuple2<>(token, 1)); } } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值