问题描述:
使用Spark3写数据到Hudi可以正常写入,但开启元数据同步到Hive就报错:
org.apache.thrift.transport.TTransportException: Socket is closed by peer.
org.apache.hadoop.hive.ql.metadata.HiveException:
at
org.apache.hadoop.hive.ql.session.SessionState.setAuthorizerV2Config(SessionState.java:1059)
at org.apache.hadoop.hive.ql.session.SessionState.setupAuth(SessionState.java:1019)
at org.apache.haoop.hive.ql.session.SessionState.getAuthorizer(SessionState.java:1790)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException:
org.apache.hadoop.hive.ql.metadata.HiveException:
org.apache.thrift.transport.TTransportException: Socket is closed by peer.
从setAuthorizerV2Config猜测是链接Hive时权限验证没过,平台使用Kerberos做权限验证。各种配置后依然报错,尝试使用JDBC链接HiveServer2,可以正常通过权限验证。网上分享的方案大多是Hudi和Hive版本不匹配,但我们用的Hudi是0.8 hive是3.1的版本而网上的说法多基于hudi0.5 0.6。场面一度尴尬.
解决方法:
初始化Hadoop Configuration前先调用HiveConf.setLoadMetastoreConfig(true)
因为Hudi同步数据表元信息到Hive时需要连接Hive的Metastore服务,创建Hive客户端时默认没有加载metastore的配置文件,也就没有连接Metastore需要的认证信息,认证也就失败了。自己编写JDBC代码之所以能正常使用是因为只访问使用了HiveServer2.