【问题标题】:Connect to kerberised hive using jdbc from remote windows system使用来自远程 Windows 系统的 jdbc 连接到 kerberised hive
【发布时间】:2016-09-07 06:09:37
【问题描述】:

我已经在 Linux 服务器 (Red Hat) 上设置了一个启用了 Kerberos 安全性的 hive 环境。而且我需要使用 JDBC 从远程 Windows 机器连接到配置单元。

所以,我在 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

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

谢谢

【问题讨论】:

  • 好的,所以您现在有两种不同的解决方案:安装(正确)MIT Kerberos Windows 客户端(使用您的自定义 Kerberos 配置),并希望 JAAS 自动找到默认票证缓存而无需任何其他配置;或者不安装任何东西,只需附加一个(正确的)JAAS 配置文件(加上您的自定义 Kerberos 配置)。选择一个。
  • 请注意,“MIT Kerberos 客户端”解决方案每天都需要kinit,这会使批处理执行的调度变得复杂。

标签: hadoop jdbc hive kerberos


【解决方案1】:

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

在 Windows 上还有其他问题:

  1. Apache Hive JDBC 驱动程序对 Hadoop JAR 有一些依赖性,尤其是在涉及 Kerberos 时(有关详细信息,请参阅 that post
  2. 这些 Hadoop JAR 需要“本机库”——即 Hadoop 的 Windows 端口(您必须自己编译!!或从网络上不安全的源下载!!)——加上系统属性hadoop.home.dirjava.library.path 分别指向Hadoop 主目录及其bin 子目录

最重要的是,Apache Hive 驱动程序存在兼容性问题——只要有线协议发生变化,新客户端就无法连接到旧服务器。

因此,我强烈建议您将 Cloudera JDBC 驱动程序用于 Hive 用于您的 Windows 客户端。 Cloudera 网站只是询问您的电子邮件。
之后,您需要阅读 80 多页的 PDF 手册、要添加到 CLASSPATH 的 JAR 以及根据手册调整的 JDBC URL。
旁注:Cloudera 驱动程序是正确的 JDBC-4 .x 兼容的驱动程序,不需要旧版 Class.forName()...

【讨论】:

  • 如果您必须调试 Kerberos 错误消息,请查看“错误”和“恐怖”部分下的 GitBook steveloughran.gitbooks.io/kerberos_and_hadoop/content/sections/…。如果您必须构建使用 Kerberized Hadoop 集群的系统,整本书是必读的。
  • 感谢您的回复。我使用 cloudera hive jdbc jar 进行了尝试,并且我已经在类路径中引用了其他必要的库。所以我认为这不是问题。我想指出,Windows 客户端没有任何类型的 Kerberos 设置(仅在 Linux 机器中设置 kerberos),而且,如果不是 Kerberos,我也能够连接到 hiveserver2 实例。所以,这可能含糊不清,但我是否也需要 Windows 中的 Kerberos?
  • “windows 客户端没有任何类型的 Kerberos 设置”——这就是我的回答中第一个链接中提到的一点,即 你必须 b> 创建一个有效的krb5.conf 和一个有效的 JAAS conf 文件,然后使用 Java 系统属性指向这些文件。
【解决方案2】:

当我们遇到问题时,关键是:

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

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

在这种情况下,解决方案很明显:

在 windows 客户端上:在连接之前使用正确的帐户执行 kinit

【讨论】:

  • 那么,你的意思是我也需要在 windows 机器上安装 Kerberos 吗?
  • @robinabishek 你肯定需要 kerberos 客户端。当然,您不需要 kerberos 服务器。在我们的例子中,我们使用了 MIT kerberos。
【解决方案3】:
String url = "jdbc:hive2://<host>:10000/default;principal=hive/_HOST@<YOUR-REALM.COM>"

你应该用你的真实领域替换&lt;YOUR-REALM.COM&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2020-04-07
    • 2016-02-22
    • 2014-09-29
    • 1970-01-01
    • 2022-08-05
    • 2017-03-09
    相关资源
    最近更新 更多