Flink1.13.2使用Hive方言执行Hive DDL抛出NullPointerException如何解决
问题根因说明
这个问题是Flink 1.13.x系列版本对接Hive 1.x版本时的已知Bug,根因是Hive 1.x中FunctionRegistry类的registerTemporaryFunction为实例方法,而非静态方法,但Flink的HiveShimV100类在反射调用该方法时错误地将调用对象传为null,最终触发空指针异常。
可行解决方案
- 方案1:升级Flink版本
官方在Flink 1.14.0及以上版本已经修复了该反射调用问题,直接将Flink版本升级到1.14.0+即可解决。 - 方案2:补丁修复(适合不能升级Flink版本的场景)
自行修改HiveShimV100的registerTemporaryFunction方法,先获取SessionState中的FunctionRegistry实例,再将实例作为反射调用的第一个参数传入,编译后替换项目和集群中flink-connector-hive包内的对应class文件即可。 - 方案3:操作规避
如果当前仅需要创建Hive维表,不需要通过Flink执行DDL,可以直接在Hive CLI/Beeline中提前创建好表,Flink侧直接使用HiveCatalog读取已存在的表即可绕开解析报错问题。
额外注意事项
你提供的Hive DDL中TBLPROPERTIES配置段重复定义了多组streaming-source相关的同名配置,实际运行时仅最后一组配置会生效,你需要根据自己需要的分区加载策略,删除另外两组不需要的配置,避免出现非预期的行为。
内容的提问来源于stack exchange,提问作者XiaoJunChen
相关产品推荐
相关产品推荐

