无法通过 jdbc 连接到 hive

Posted

技术标签:

【中文标题】无法通过 jdbc 连接到 hive【英文标题】:Can not connect to hive via jdbc 【发布时间】:2015-09-24 12:52:01 【问题描述】:

我使用 gradle 来运行我的程序。示例代码参考https://github.com/onefoursix/Cloudera-Impala-JDBC-Example。

我可以从 repo 运行示例而不会失败。

// Apply the java plugin to add support for Java
apply plugin: 'java'
apply plugin: 'application'

mainClassName = "com.my.impala.fetcher.Fetcher"
// In this section you declare where to find the dependencies of your project
repositories 
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    mavenCentral()
    maven 
        url "https://repository.cloudera.com/artifactory/cloudera-repos/"
    


run 
     if (project.hasProperty("params")) 
         args params
         // args Eval.me(params)
     


test 
        testLogging 
            events "passed", "skipped", "failed", "standardOut", "standardError"
    



// In this section you declare the dependencies for your production and test code
dependencies 
    // The production code uses the SLF4J logging API at compile time
    compile 'org.slf4j:slf4j-api:1.7.7'
    compile 'org.apache.hadoop:hadoop-client:2.6.0-cdh5.4.4.1'
    compile 'org.json:json:20140107'
    compile 'org.apache.hive:hive-jdbc:1.1.0'

示例代码如下。

Connection con = null;
ResultSet rs = null;
try 
    Class.forName(JDBC_DRIVER_NAME);
    con = DriverManager.getConnection(CONNECTION_HOST);
    Statement stmt = con.createStatement();
    rs = stmt.executeQuery(sqlStatement);
 catch (SQLException e) 
    e.printStackTrace();
    System.exit(-1);
 catch (Exception e) 
    e.printStackTrace();
    System.exit(-1);
 finally 
    try 
        con.close();
     catch (Exception e) 
        e.printStackTrace();
        System.exit(-1);
    


rs.next();

rs.next 会抛出以下异常的地方

org.apache.thrift.transport.TTransportException: Cannot write to null outputStream
    at org.apache.thrift.transport.TiostreamTransport.write(TIOStreamTransport.java:142)
    at org.apache.thrift.protocol.TBinaryProtocol.writeI32(TBinaryProtocol.java:178)
    at org.apache.thrift.protocol.TBinaryProtocol.writeMessageBegin(TBinaryProtocol.java:106)
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.send_FetchResults(TCLIService.java:495)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.FetchResults(TCLIService.java:487)
    at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:360)
    at com.my.impala.fetcher.Fetcher.main(Fetcher.java:54)
Exception in thread "main" java.sql.SQLException: Error retrieving next row
    at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:388)
    at com.my.impala.fetcher.Fetcher.main(Fetcher.java:54)
Caused by: org.apache.thrift.transport.TTransportException: Cannot write to null outputStream
    at org.apache.thrift.transport.TIOStreamTransport.write(TIOStreamTransport.java:142)
    at org.apache.thrift.protocol.TBinaryProtocol.writeI32(TBinaryProtocol.java:178)
    at org.apache.thrift.protocol.TBinaryProtocol.writeMessageBegin(TBinaryProtocol.java:106)
    at org.apache.thrift.TServiceClient.sendBase(TServiceClient.java:62)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.send_FetchResults(TCLIService.java:495)
    at org.apache.hive.service.cli.thrift.TCLIService$Client.FetchResults(TCLIService.java:487)
    at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:360)
    ... 1 more

我不确定我错过了哪一部分。

谢谢。

【问题讨论】:

【参考方案1】:

您已经关闭了连接,当然您无法读取结果。 rs.next() 应该在 executeQuery() 行之后,在 try 块的末尾,如下所示:

rs = stmt.executeQuery(sqlStatement);
while (rs.next()) 
    // handle the record

ResultSet是一个数据库游标,它不包含整个数据集,你可以通过它访问数据库中的数据。

【讨论】:

这很有帮助。

以上是关于无法通过 jdbc 连接到 hive的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Zookeeper 连接字符串通过 JDBC 连接到 Hive

无法使用 jdbc 通过 Hive 连接到 HBase

通过远程jdbc方式连接到hive数据仓库

使用 Hive JDBC 驱动程序通过 Squirrel 连接到 Knox

直线无法连接到 hive2server

通过 squirrel sql 连接到 hive/spark sql 时读取超时