在 HDInsight 中通过 JDBC 驱动程序查询 Hive

了解如何使用 Java 应用程序中的 JDBC 驱动程序将 Hive 查询提交到 Azure HDInsight 中的 Hadoop。 本文档中的信息演示如何以编程方式从 SQuirrel SQL 客户端进行连接。

有关 Hive JDBC 接口的详细信息,请参阅 HiveJDBCInterface

先决条件

JDBC 连接字符串

连接到 Azure 上的 HDInsight 群集的 JDBC 连接是通过 443 进行的,使用 SSL 来保护通信安全。 公用网关(群集位于其后)会将通信重定向到 HiveServer2 实际进行侦听的端口。 以下连接字符串显示要用于 HDInsight 的格式:

jdbc:hive2://CLUSTERNAME.azurehdinsight.cn:443/default;transportMode=http;ssl=true;httpPath=/hive2

CLUSTERNAME 替换为 HDInsight 群集的名称。

身份验证

建立连接时,必须使用 HDInsight 群集管理员名称和密码对群集网关进行身份验证。 从 JDBC 客户端(如 SQuirreL SQL)进行连接时,必须在客户端设置中输入管理员名称和密码。

从 Java 应用程序建立连接时,必须使用该名称和密码。 例如,以下 Java 代码使用连接字符串、管理员名称和密码打开新连接:

DriverManager.getConnection(connectionString,clusterAdmin,clusterPassword);

使用 SQuirreL SQL 客户端进行连接

SQuirreL SQL 是一个 JDBC 客户端,可用于通过 HDInsight 群集远程运行 Hive 查询。 以下步骤假设已安装 SQuirreL SQL。

  1. 创建一个用于包含文件的目录。 例如, mkdir hivedriver
  1. 从命令行,使用以下命令从 HDInsight 群集复制文件:

    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hadoop-client/hadoop-common.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hadoop-client/hadoop-auth.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hadoop-client/lib/log4j-*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hadoop-client/lib/slf4j-*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/hive-*-1.2*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/httpclient-*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/httpcore-*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/libthrift-*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/libfb*.jar .
    scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/commons-logging-*.jar .
    

    USERNAME 替换为群集的 SSH 用户帐户名。 将 CLUSTERNAME 替换为 HDInsight 群集名称。

  2. 启动 SQuirreL SQL 应用程序。 在窗口左侧中,选择“驱动程序”。

    窗口左侧的“驱动程序”选项卡

  3. 从“驱动程序”对话框顶部的图标中,选择 + 图标创建驱动程序。

    驱动程序图标

  4. 在“添加驱动程序”对话框中,添加以下信息:

    • 名称:Hive
    • 示例 URLjdbc:hive2://localhost:443/default;transportMode=http;ssl=true;httpPath=/hive2
    • 额外类路径:使用“添加”按钮添加此前下载的所有 jar 文件
    • 类名:org.apache.hive.jdbc.HiveDriver

    添加驱动程序对话框

    单击“确定”保存这些设置。

  5. 在 SQuirreL SQL 窗口左侧,选择“别名”。 然后单击 + 图标创建连接别名。

    添加新的别名

  6. 将以下值用于“添加别名”对话框。

    • 名称:Hive on HDInsight

    • 驱动程序:使用下拉列表选择 Hive 驱动程序

    • URL:jdbc:hive2://CLUSTERNAME.azurehdinsight.cn:443/default;transportMode=http;ssl=true;httpPath=/hive2

      CLUSTERNAME 替换为 HDInsight 群集名。

    • 用户名:HDInsight 群集的群集登录帐户名。 默认为 admin

    • 密码:群集登录帐户的密码。

      添加别名对话框

      Important

      使用“测试”按钮验证连接是否有效。 出现“连接到: Hive on HDInsight”对话框时,选择“连接”执行测试。 如果测试成功,将会显示“连接成功”对话框。 如果发生错误,请参阅故障排除

      若要保存连接别名,请使用“添加别名”对话框底部的“确定”按钮。

  7. 在 SQuirreL SQL 顶部的“连接到”下拉列表中,选择“Hive on HDInsight”。 出现提示时,选择“连接”。

    连接对话框

  8. 连接后,在 SQL 查询对话框中输入以下查询,然后选择“运行”图标。 结果区域会显示查询的结果。

     select * from hivesampletable limit 10;
    

    sql 查询对话框,其中包括结果

从 Java 应用程序示例进行连接

https://github.com/Azure-Samples/hdinsight-java-hive-jdbc 上提供了使用 Java 客户端查询 Hive on HDInsight 的示例。 按照存储库中的说明生成并运行该示例。

Note

此示例是针对全球 Azure 编写。 对于 Azure 中国区,需要在连接字符串中将“azurehdinsight.net”替换为“azurehdinsight.cn”。

故障排除

尝试打开 SQL 连接时发生意外错误

Note

在 Azure 中国区,HDInsight Linux 仅支持 3.5 或更高版本。 在 Azure 中国区无法创建 HDInsight Linux 3.2、3.3 和 3.4。 但是,可以通过 HDInsight 模拟器使用这些版本。

症状:连接到 HDInsight 群集版本 3.3 或更高版本时,可能会遇到意外错误。 此错误的堆栈跟踪的开头为以下行:

java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.<init>(I)V
at java.util.concurrent.FutureTas...(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:206)

可能的原因:此错误由 SQuirreL 随附的较旧版本 commons-codec.jar 文件引起。

解决方法:若要解决此错误,请使用以下步骤:

  1. 从 HDInsight 群集下载 commons-codec jar 文件。

     scp USERNAME@CLUSTERNAME:/usr/hdp/current/hive-client/lib/commons-codec*.jar ./commons-codec.jar
    
  2. 退出 SQuirreL,并转到系统上安装 SQuirreL 的目录。 在 SquirreL 目录的 lib 目录下,将现有的 commons-codec.jar 替换为从 HDInsight 群集下载的文件。

  3. 重新启动 SQuirreL。 连接到 HDInsight 上的 Hive 时,应不再会出现该错误。

后续步骤

现在,已了解如何将 JDBC 与 Hive 配合使用,请使用以下链接学习 Azure HDInsight 的其他用法。