配置单元JDBC getConnection不返回

配置单元JDBC getConnection不返回,jdbc,hadoop,hive,Jdbc,Hadoop,Hive,我正在学习HiveJDBC教程。我无法让它工作。当它试图获得连接时,它只是挂起。它也不报告任何错误。我确信配置单元服务器正在运行。有什么帮助吗 public class HiveJdbcClient { private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver"; public static void main(String[] args){ try { Class.for

我正在学习HiveJDBC教程。我无法让它工作。当它试图获得连接时,它只是挂起。它也不报告任何错误。我确信配置单元服务器正在运行。有什么帮助吗

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

Naresh:尝试停止triffserver,然后从终端移动到HIVE_HOME/bin目录,然后使用/HIVE--service hiveserver 10000&命令启动HIVE trift server。然后试着运行这个程序。按照配置单元客户端wiki示例创建表。然后在下一步中执行showtables查询。遵循此步骤后,请告知结果。之后我们可以讨论一下

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

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

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

我通过以下步骤追踪到了这一点

*使用LOG4J*

thrift和其他JDBC配置单元类在连接时使用log4j,如果打开调试日志,则可以看到细粒度错误。您可以通过添加


BasicConfigurator.configure()

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

*另一种方法*

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


字符串url=String.format(“jdbc:hive2://%s:%s/默认值”,
服务器,
港口)
属性p=新属性();
p、 setProperty(“主机”,con);
连接jdbc=新的HiveConnection(url,p);

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

事实上,当我出现这个错误时,我将其追溯到:


开放式运输

这最终创造了一个


org.apache.thrift.transport.TSaslClientTransport

例如

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


试一试{
System.out.println(“……1正在进行……试图打开。”+transport.getClass().getName());
transport.open();
System.out.println(“完成打开”);
}
捕获(TTransportException e){
System.out.println(“2失败”);
e、 printStackTrace();
抛出新的SQLException(“无法建立到的连接”
+uri+“:”+e.getMessage(),“08S01”);
}


仅供参考,我已经发布了关于我的连接失败原因的后续信息。它可能也和你的有关

我也有同样的问题/检查此参数:

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

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

默认情况下,配置单元将在启动trift服务器的任何目录中创建元存储。因此,当您从不同的位置启动服务器时,它具有不同的元存储,这些元存储没有引用您在其他位置创建的表。Naresh,可能这个链接会为您提供有关配置单元元存储的大量信息。。。FWIW:我认为此问题可能会发生,因为HiveServer正在运行,但您正在使用HiveServer2协议进行连接。我也有相同的问题,请检查此:[link][1][1]: