使用远程Windows系统中的jdbc连接到kerberised hive

时间:2016-09-07 06:09:38

标签: hadoop jdbc hive kerberos

我已经在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

我在这做错了什么?我查了很多论坛,但无法得到合适的解决方案。任何答案都将不胜感激。

由于

3 个答案:

答案 0 :(得分:2)

如果您在Linux中运行代码,我只需指向that post - 即您必须使用系统属性来定义Kerberos和JAAS配置,来自具有特定格式的conf文件。
您必须切换调试跟踪标志以了解子网站配置问题(即不同的JVM口味/版本可能有不同的语法要求,这些都没有记录,这是一个试错过程)。

但Windows上 还有其他问题:

  1. Apache Hive JDBC驱动程序对Hadoop JAR有一些依赖性,特别是当涉及Kerberos 时(详见that post
  2. 这些Hadoop JAR需要“本机库” - 即Hadoop 的Windows端口(您必须自己编译!!或者从网络上的不安全源下载!!) - 加上分别指向Hadoop主目录及其hadoop.home.dir子目录的系统属性java.library.pathbin
  3. 最重要的是,Apache Hive驱动程序存在兼容性问题 - 只要有线协议发生更改,新客户端就无法连接到旧服务器。

    因此,我强烈建议您为 Windows客户端使用 Cloudera JDBC驱动程序。 Cloudera网站只是询问您的电子邮件 之后,您需要阅读80页以上的PDF手册,要添加到CLASSPATH的JAR,以及根据手册进行调整的JDBC URL。
    附注:Cloudera驱动程序是一个合适的JDBC-4.x兼容驱动程序,不需要遗留Class.forName() ...

答案 1 :(得分:0)

当我们遇到问题时,我们的关键如下:

在您的服务器上列出了某些允许对数据进行操作的kerberos主体。

当我们尝试通过JDBC运行查询时,我们没有在客户端执行正确的kinit。

在这种情况下,解决方案显而易见:

在Windows客户端上:在连接

之前使用正确的帐户进行操作

答案 2 :(得分:0)

String url = "jdbc:hive2://<host>:10000/default;principal=hive/_HOST@<YOUR-REALM.COM>"

您应将<YOUR-REALM.COM>替换为实际的REALM。