5

我正在关注 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();
    }
  }
}

网络统计的输出:

$ 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
4

3 回答 3

1

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

于 2012-08-02T06:22:23.160 回答
1

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

这是对以下问题的回答:“我怎样才能找到我的 JDBC 配置单元连接挂起的位置?”

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

我通过执行以下操作跟踪了这一点。

* 使用 LOG4J *

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

BasicConfigurator.configure()

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

如何跟踪失败 ot TSaslTransport (hive 相关)

*另一种方法*

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() 类。

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

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"); }

仅供参考,我已经发布了有关我的连接失败原因的后续信息。它也可能与您的有关......我如何追踪 TSaslTransport 的失败(与蜂巢相关)

于 2014-04-05T21:48:50.467 回答
0

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

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

con = DriverManager.getConnection("jdbc:hive2://192.168.1.93:10000/default", "", "");
于 2014-04-08T07:53:13.547 回答