【问题标题】:Hive JDBC getConnection does not returnHive JDBC getConnection 不返回
【发布时间】:2012-07-30 22:52:21
【问题描述】:

我正在关注 hive JDBC 教程。我无法让它工作。当它试图获得连接时,它只是挂起。它也不报告任何错误。我确定 Hive 服务器正在运行。有什么帮助吗?

public class HiveJdbcClient {
  private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
  public static void main(String[] args){
      try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
           e.printStackTrace();
      System.exit(1);
    }

    try{
        Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");
        System.out.println("got the connection");

    }catch(SQLException e){
        e.printStackTrace();
    }
  }
}

netstat 的输出:

$ sudo netstat -anlp | grep 10000
Password:
tcp        0      0 0.0.0.0:10000               0.0.0.0:*                   LISTEN      27738/java
tcp      107      0 127.0.0.1:10000             127.0.0.1:45910             ESTABLISHED 27738/java
tcp        0      0 127.0.0.1:33665             127.0.0.1:10000             ESTABLISHED 24475/java
tcp        0      0 127.0.0.1:45910             127.0.0.1:10000             ESTABLISHED 7445/java
tcp      107      0 127.0.0.1:10000             127.0.0.1:33665             ESTABLISHED 27738/java

【问题讨论】:

标签: jdbc hadoop hive


【解决方案1】:

Naresh:尝试停止 triffserver,然后从终端移至 HIVE_HOME/bin 目录,然后使用 ./hive --service hiveserver 10000 & 命令。然后尝试运行程序。按照 hive 客户端 wiki 示例创建表。然后在下一步中执行显示表查询。执行此步骤后,让我们知道结果。之后我们可以进行讨论。

【讨论】:

  • 默认情况下,hive 将在您启动 trift 服务器的任何目录中创建元存储。因此,当您继续从不同位置启动服务器时,它具有不同的不同元存储,这些元存储没有引用您在其他地方创建的表。
  • Naresh,也许这个链接会给你很多关于 Hive Metastore 的信息。 ccp.cloudera.com/display/CDHDOC/…
【解决方案2】:

您可以执行以下操作来查明发生挂起的位置。这是我在断开的 Hive JDBC 连接中跟踪它的示例。请注意,这不是针对任何通用配置单元连接挂起错误的具体解决方案。

这是对以下问题的回答:“如何找出我的 JDBC hive 连接挂起的位置?”

难以追踪的是 JDBC 动态调用。相反,您可以手动创建 HiveConnection() 类。这允许您直接在代码中添加一些跟踪,以查看发生挂起的位置。

我通过执行以下操作来追踪这一点。

* 使用 LOG4J *

thrift 和其他 JDBC hive 类在连接时使用 log4j,如果你打开 DEBUG 日志,你可以看到细粒度的错误。您可以通过添加

轻松做到这一点

BasicConfigurator.configure()

到您的客户端应用程序。无论如何,这样做让我发现这似乎在 SASL 传输层中停滞不前。我想这可能与安全有关,但我认为安全错误仍然会返回,而不是挂起......所以我认为这可能值得一个 JIRA。我已经粘贴了一个后续问题:

How can I trace the failure ot TSaslTransport (hive related)

* 另一种方法 *

1) 您可以从 github 或其他任何地方获取“HiveConnection”类的副本,然后实例化一个新的:

String url=String.format("jdbc:hive2://%s:%s/default", server, port) Properties p = new Properties(); p.setProperty("host", con); Connection jdbc = new HiveConnection(url,p);

然后,您可以将调试器挂钩或日志语句添加到 HiveConnection() 类。

最终,当我遇到此错误时,我将其追溯到:

openTransport

最终创造了一个

org.apache.thrift.transport.TSaslClientTransport

实例。

挂起发生在这个代码块中:

try { System.out.println(".....1 carrying on... attempting to open. " + transport.getClass().getName()); transport.open(); System.out.println("done open."); } catch (TTransportException e) { System.out.println("2 fail ."); e.printStackTrace(); throw new SQLException("Could not establish connection to " + uri + ": " + e.getMessage(), " 08S01"); }

仅供参考,我已经发布了有关我的连接失败原因的后续信息。它也可能与您有关...How can I trace the failure ot TSaslTransport (hive related)

【讨论】:

  • ...FWIW:我认为 HiveServer 正在运行但您使用 HiveServer2 协议连接时可能会出现此问题。
【解决方案3】:

我有同样的问题/检查这个参数:

driverName = "org.apache.hive.jdbc.HiveDriver"

con = DriverManager.getConnection("jdbc:hive2://192.168.1.93:10000/default", "", "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多