业务场景:
Flink消费Kafka数据写入Hbase
组件版本:
CDH:6.3.0
Flink:1.12.1
Hbase:2.1.0-cdh6.3.0
问题1:
java.lang.NoSuchMethodError:org.apache.commons.cli.Option.builder(Ljava/lang/string;)
问题原因:
hadoop-common依赖中commons-cli
版本过低,导致程序运行找不到最新版的方法
解决办法:
剔除Hadoop中commons-cli的依赖,并添加高版本依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.0.0</version>
<exclusions>
<exclusion>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</exclusion>
</exclusions>
</dependency>
问题2:
Flink-Connector-Kafka-0.11_2.11依赖找不到
问题原因:
Flink1.12.1已经不支持Flink-Connector-Kafka-0.11_2.11
解决办法:
依赖统一替换为:flink-connector-kafka_2.11
问题3:
Keyby timwindow方法过时,同样代码,在升级到1.12.1之后,运行异常:notifyHeartbeatTimeout
起初是消费kafka通过keyby+窗口写入到kafka,但升级之后一直无法运行,下游收不到任何数据,程序运行几分钟之后就开始报错
问题原因:API过时
原API:
WindowedStream<Tuple2<Integer, JSONObject>, Tuple, TimeWindow> window = jsobjectMap.keyBy(0).timeWindow(Time.seconds(5));
解决办法:使用新API,指定窗口类型
新API:
WindowedStream<Tuple2<Integer, JSONObject>, Integer, TimeWindow> window = jsobjectMap.keyBy(tuple2 -> tuple2.f0).window(TumblingProcessingTimeWindows.of(Time.seconds(5)));