我正在Cloudera Hive和Spark 5.10.2上构建一个项目。
当我尝试使用Thrift客户端发送请求时,我收到以下错误:
ERROR HiveConnection: Error opening session
org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=default})
at org.apache.thrift.TApplicationException.read(TApplicationException.java:111)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:79)
at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:156)
at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:143)
at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:583)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:192)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
深入研究项目的依赖关系树我发现问题是由Cloudera的hive-exec中的一个脏猴子补丁引起的,其中定义了以下依赖关系:
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>${libthrift.version}</version>
</dependency>
但是,thrift代码生成也用于生成另一组libthrift实现,它最终会在类路径中存在两个实现,其中一个实现随机加载。
我正在寻找maven,gradle或sbt的插件,以便在两者都存在时始终加载生成的libthrift版本,并且只在没有其他选择的情况下加载静态版本,即在hive中声明包 - exec在libthrift中具有更高的优先级。是否可以在整个Java生态系统中这样做?
非常感谢你的想法!
答案 0 :(得分:0)
你试过maven dependency exclusion吗?
处理依赖项时有一些有用的东西:mvn help:effective-pom
和mvn dependency:tree
。