我已经在Linux服务器(Red Hat)上设置了启用了Kerberos安全性的配置单元环境。我需要使用JDBC从远程Windows机器连接到hive。
所以,我在linux机器上运行了hiveserver2,并且我已经完成了“kinit”。
现在我尝试从Windows端的java程序连接到这样的测试程序,
Class.forName("org.apache.hive.jdbc.HiveDriver");
String url = "jdbc:hive2://<host>:10000/default;principal=hive/_HOST@<YOUR-REALM.COM>"
Connection con = DriverManager.getConnection(url);
我收到以下错误,
Exception due to: Could not open client transport with JDBC Uri:
jdbc:hive2://<host>:10000/;principal=hive/_HOST@YOUR-REALM.COM>:
GSS initiate failed
我在这做错了什么?我查了很多论坛,但无法得到合适的解决方案。任何答案都将不胜感激。
由于
答案 0 :(得分:2)
如果您在Linux中运行代码,我只需指向that post - 即您必须使用系统属性来定义Kerberos和JAAS配置,来自具有特定格式的conf文件。
您必须切换调试跟踪标志以了解子网站配置问题(即不同的JVM口味/版本可能有不同的语法要求,这些都没有记录,这是一个试错过程)。
但Windows上 还有其他问题:
hadoop.home.dir
子目录的系统属性java.library.path
和bin
最重要的是,Apache Hive驱动程序存在兼容性问题 - 只要有线协议发生更改,新客户端就无法连接到旧服务器。
因此,我强烈建议您为 Windows客户端使用 Cloudera JDBC驱动程序。 Cloudera网站只是询问您的电子邮件
之后,您需要阅读80页以上的PDF手册,要添加到CLASSPATH的JAR,以及根据手册进行调整的JDBC URL。
附注:Cloudera驱动程序是一个合适的JDBC-4.x兼容驱动程序,不需要遗留Class.forName()
...
答案 1 :(得分:0)
当我们遇到问题时,我们的关键如下:
在您的服务器上列出了某些允许对数据进行操作的kerberos主体。
当我们尝试通过JDBC运行查询时,我们没有在客户端执行正确的kinit。
在这种情况下,解决方案显而易见:
答案 2 :(得分:0)
String url = "jdbc:hive2://<host>:10000/default;principal=hive/_HOST@<YOUR-REALM.COM>"
您应将<YOUR-REALM.COM>
替换为实际的REALM。