1.使用StreamExecutionEnvironment创建StreamTableEnvironment写hive报错
2.在IDE中无法写入hive
3.flink使用catalog写入hive报错没有权限(相同问题在sparksql写入hive时也有)
4.flink源码编译问题
问题描述:job在flink web界面中状态一直显示为restarting,检查job的exception报错如下图所示:
Cannot load user class:
org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
网上没有搜到相关问题,实际上代码中并未使用到FlinkKafkaConsumer,而且flink-connector-kafka_2.11.jar已经在工程依赖中,flink集群的lib中也有该jar包。
因为代码最初是直接使用TableEnvironment实现读取kafka写入hive的,分析认为报错代码与flink的StreamExecutionEnvironment创建StreamTableEnvironment有关。报错代码如下:
原因未知,猜测与stream api和table api体系的冲突导致的。
解决办法:将checkpoint的相关设置放在StreamExecutionEnvironment中,而不是StreamTableEnvironment的config中,变更后代码如下:
问题描述:相同代码打包后从flink web中上传提交是可以正常写入hive的,但是在ide中直接运行无法写入hive。
原因:flink写入hive依赖于hadoop环境,IDE中运行缺少hadoop环境,项目依赖hadoop的jar包也不行。
解决办法:1.windows下载hadoop环境包winutils,注意对应hadoop版本
2.windows配置系统环境变量HADOOP_HOME
问题描述:远程连接hive时报错没有访问权限
Permission denied: user=xxxx, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
此问题与使用sparksql连接hive时一样。
原因:从这个异常可以看出,客户端的用户是xxxx(jar运行的用户),要求的write权限,但是hdfs的节点上用户是root,从而判断用户没有权限,拒绝访问。
登陆hdfs有2种安全认证模式:弱认证和强认证。弱认证只要求登陆使用hdfs目录用户名,强认证需要配合kerberos。而弱认证时默认取的是系统登陆用户名来远程连接hdfs。
解决办法:可以直接修改hdfs目录的权限为777,但实际安全认证时不会这么干,那么弱认证情况下代码中需要加入
System.setProperty("HADOOP_USER_NAME","root");
或者使用强认证登陆hdfs。
遇到两个问题:
删除本地maven仓库中的jar包目录后会重新下载,直到所有包都下载完成。对于访问外网有麻烦的童鞋可以换成阿里云的maven仓库地址https://maven.aliyun.com/repository/apache-snapshots。
应该是Flink源码中要求的,编译会提示使用mvn spotless进行格式化。但是IDE中默认maven仓库地址是10.10.xx,总是执行失败。查询该命令后发现可以指定自己的setting.xml,命令如下:
mvn spotless:apply -s C:\Users\xxx\.m2\settings.xml
从终端进入flink-connector-jdbc的目录后,顺利执行,再次编译即可。