6

这个问题类似,但不一样,因为Hive JDBC getConnection 不返回。然而,这是关于远程连接。Metastore 也存在于启动 hiveserver2 的目录中。

我们在远程机器上有一个正在运行的 mapr 集群。我想使用 Java JDBC 连接到该集群上的 Hive。

因此我们启动了 hive 服务器:

/opt/mapr/hive/hive-0.11/bin/hiveserver2

服务器进程的输出不包含任何错误消息。它侦听 netstat 报告的端口 10000。

我尝试按照https://cwiki.apache.org/confluence/display/Hive/HiveClient中的描述连接到服务器,从而将 localhost 替换为运行 hiveserver2 的服务器名称:

Connection con = 
  DriverManager.getConnection("jdbc:hive://myserver.example.com:10000/default", "", "");

然而,该程序恰好挂在此声明上。它似乎没有建立联系。

可能我需要提供用户名和密码?

最初我使用了驱动程序 org.apache.hadoop.hive.jdbc.HiveDriver。

然而,如果 hive2 服务器正在运行,我似乎应该使用驱动程序 org.apache.hive.jdbc.HiveDriver。现在我收到以下异常:

Exception in thread "main" java.sql.SQLException: Could not establish connection to jdbc:hive2://myserver.example.com:10000/default: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:246)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:132)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
at HiveJdbcClient.main(HiveJdbcClient.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
at org.apache.thrift.TApplicationException.read(TApplicationException.java:108)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71)
at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:144)
at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:131)
at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:237)
... 10 more
4

6 回答 6

3

我遇到了同样的问题,并且能够通过将正确的依赖项添加到我的 pom.xml 文件来解决它。我从 maven Central 获得了最新的 apache 版本的 hive 并切换到使用 cloudera repo 中的 cdh4 版本。因此,您所看到的可能是具有错误 hive-jdbc 依赖项的症状。这是我添加到我的 pom 文件中的 maven 片段:

<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
...
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.10.0-cdh4.3.2</version>
</dependency>

这是关于cloudera repo的链接。

此外,将“;auth=noSasl”添加到 URL 使我的应用程序挂起,因此我将其删除。

于 2013-12-10T22:39:08.730 回答
2

我认为您需要指定用户名。由于您使用的是 hiveserver2,因此它应该是hive2而不是hive 。尝试修改您的连接网址:

Connection con = 
  DriverManager.getConnection("jdbc:hive2://myserver.example.com:10000/default", "<user>", "");

它在链接Hive2中给出

希望这可以帮助...!!!

于 2013-12-05T10:40:35.363 回答
0

我也有同样的问题。请检查服务器是否可以从客户端访问端口 10000(服务器和端口已启用,没有防火墙限制)还检查 hiveserver 是否已启动并正在运行。如果是,那么它应该可以工作。以下代码适用于 mapr hive。

如果您有任何与 mapr 相关的查询,请参阅 answers.mapr.com,其中包含您可能需要的大部分信息。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
import org.apache.log4j.Logger;


import java.io.*;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.*;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.*;

public class HiveJdbcClient {
    //private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
    /**
    * @param args
    * @throws SQLException
    **/
    private static Logger mLogger = Logger.getLogger(HiveJdbcClient.class);
    private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

    public static void main(String[] args) throws SQLException {
        HiveJdbcClient myJob = new HiveJdbcClient();
        myJob.execute();
    }
    public void execute() throws SQLException {
        //mLogger.info("Start HiveJob");
        System.out.println("Start HiveJob");
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.exit(1);
        }
Connection con = DriverManager.getConnection("jdbc:hive://myserver:10000/default", "", "");
        Statement stmt = con.createStatement();
        String sql = "SHOW TABLES";
        //String tableName = "testHiveDriverTable";
       // ResultSet res1 = stmt.executeQuery("create table " + tableName + " (key int, value string)");
        System.out.println("Running: " + sql);
        ResultSet res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }

        //mLogger.info("HiveJob executed!");
        System.out.println("HiveJob executed!");
    }
}
于 2013-12-23T11:22:37.513 回答
0

您可以使用 beeline 客户端通过 JDBC 连接到 hive。

可能是这样的:beeline !connect jdbc:hive2://localhost:10000

检查链接: http ://dwbitechguru.blogspot.ca/2014/11/how-to-connect-to-hadoop-hive-using.html

于 2014-11-28T04:35:57.670 回答
0

就我而言,将:添加;auth=noSasl到 JDBC 连接字符串解决了无休止的等待连接!

jdbc:hive2://server:10000/default;auth=noSasl
于 2016-02-25T02:20:35.137 回答
-1

您应该在这里获得 hive-service-X.XX.X-cdhX.XXjar:https ://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hive/ ;它对我来说很好。

于 2016-05-18T01:58:25.007 回答