我已经在 Linux 服务器(Red Hat)上设置了一个启用了 Kerberos 安全性的 Hive 环境。我需要使用 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/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7e2136312d2a3e27312b2c532c3b3f3233503d3133" rel="noreferrer noopener nofollow">[email protected]</a>>:
GSS initiate failed
我在这里做错了什么?我查了很多论坛,但没有找到合适的解决方案。任何答案将不胜感激。
谢谢
最佳答案
如果您在 Linux 中运行代码,我只需指向 that post -- 即,您必须使用系统属性从具有特定格式的 conf 文件定义 Kerberos 和 JAAS 配置。
而且您必须切换调试跟踪标志以了解微妙的配置问题(即不同类型/版本的 JVM 可能有不同的语法要求,这些要求没有记录在案,这是一个反复试验的过程)。
但是在 Windows 上还存在其他问题:
- Apache Hive JDBC 驱动程序对 Hadoop JAR 有一定的依赖性,尤其是在涉及 Kerberos 时(有关详细信息,请参阅 that post)
- 这些 Hadoop JAR 需要“ native 库”——即 Hadoop 的 Windows 端口(您必须自己编译!!或者从网络上不安全的源下载!!)——加上系统属性
hadoop.home.dir
和java.library.path
分别指向 Hadoop 主目录及其bin
子目录
最重要的是,Apache Hive 驱动程序存在兼容性问题 - 每当有线协议(protocol)发生变化时,新客户端就无法连接到旧服务器。
因此,我强烈建议您为 Windows 客户端使用Hive 的 Cloudera JDBC 驱动程序。 Cloudera 网站只询问您的电子邮件。
之后,您可以阅读 80 多页的 PDF 手册,将 JAR 添加到 CLASSPATH 中,并根据手册调整 JDBC URL。
旁注:Cloudera 驱动程序是一个正确的 JDBC-4.x 兼容驱动程序,不需要旧的 Class.forName()
...
关于hadoop - 使用 jdbc 从远程 Windows 系统连接到 Kerberized Hive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39362326/