文章目录
StreamExecutionEnvironment提示ClassNotFoundException问题
根据Flink官网提供的Maven命令搭建工程
$ mvn archetype:generate \
-DarchetypeGroupId=org.apache.flink \
-DarchetypeArtifactId=flink-walkthrough-datastream-java \
-DarchetypeVersion=1.11.2 \
-DgroupId=frauddetection \
-DartifactId=frauddetection \
-Dversion=0.1 \
-Dpackage=spendreport \
-DinteractiveMode=false
问题描述
导入IDE后运行提示ClassNotFoundException: org.apache.flink.streaming.api.environment.StreamExecutionEnvironment
解决方法:
注释掉pom文件中maven配置<scope>provided</scope>
flink中使用lambda表达式提示InvalidTypesException
问题描述
在运行以下任务
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> textStream = env.socketTextStream("localhost", 9000, "\n");
SingleOutputStreamOperator<Object> streamOperator = textStream.flatMap((s, collector) -> {
String[] strings = s.split("\\s");
Arrays.stream(strings).map(m -> Tuple2.of(m, 1)).forEach(collector::collect);
}).keyBy(0).timeWindow(Time.seconds(5)).sum(1);
streamOperator.print().setParallelism(1);
env.execute("Socket Window WordCount");
}
提示InvalidTypesException: The generic type parameters of 'Collector' are missing
异常:
解决方式
- 使用 匿名函数 来替代lambda表达式
- 使用 returns方法来明确的指定返回类型
修改后代码如下:
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> textStream = env.socketTextStream("localhost", 9000, "\n");
SingleOutputStreamOperator<Tuple2<String, Integer>> sum = textStream.flatMap((String s, Collector<Tuple2<String, Integer>> collector) -> {
String[] strings = s.split("\\s");
Arrays.stream(strings).map(m -> Tuple2.of(m, 1)).forEach(collector::collect);
})
//明确指定返回类型
.returns(Types.TUPLE(Types.STRING, Types.INT))
.keyBy(0).timeWindow(Time.seconds(5)).sum(1);
sum.print().setParallelism(1);
env.execute("Socket Window WordCount");
}
原因分析
在void flatMap(IN value, Collector<OUT> out)
由javac编译后,变成 void flatMap(IN value, Collector out)
,导致泛型丢失,导致flink无法自动推断出类型,flink会认为是Object类型,从而导致无效的序列化类型。
参考文章:
flink中使用lambda表达式