3

我正在使用 Cloudera Manager 在集群设置中使用 CDH 4.2.1-1.cdh4.2.1.p0.5,并且我正在尝试使用 Java 中的 Hive API 使 Hive 示例工作。我使用的配置单元版本是 0.10 (hive-hwi-0.10.0-cdh4.2.1.jar),我正在尝试按照以下网址中的说明设置一个简单的示例:https ://cwiki.apache.org/confluence /display/Hive/HiveClient

运行我的代码(帖子末尾的源代码)时,我收到以下错误:

Exception in thread "main" java.sql.SQLException: org.apache.thrift.TApplicationException: Invalid method name: 'execute'
    at org.apache.hadoop.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:191)
    at org.apache.hadoop.hive.jdbc.HiveStatement.execute(HiveStatement.java:127)
    at org.apache.hadoop.hive.jdbc.HiveConnection.configureConnection(HiveConnection.java:126)
    at org.apache.hadoop.hive.jdbc.HiveConnection.<init>(HiveConnection.java:121)
    at org.apache.hadoop.hive.jdbc.HiveDriver.connect(HiveDriver.java:104)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)

我已经在 Google 中搜索了一段时间,但找不到任何解决此问题的方法。任何人都可以给我一个提示可能导致问题的原因?

提前致谢,

罗比



导致错误的代码:

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

public class HiveJob {

private static Logger mLogger = Logger.getLogger(HiveJob.class);
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

public static void main(String[] args) throws SQLException {
    HiveJob myJob = new HiveJob();
    myJob.execute();
}

public void execute() throws SQLException {
    mLogger.info("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://myHiveServer:9083/default", "", "");
    Statement stmt = con.createStatement();
    String sql = "SHOW TABLES";
    System.out.println("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    while (res.next()) {
        System.out.println(res.getString(1));
    }
    mLogger.info("HiveJob executed!");
}

}

4

5 回答 5

1

添加 hive2 和更改端口不能单独工作。我遇到了同样的问题,发现需要在 cloudera VM 中启动 hive2 服务。将驱动程序从上面提到的更改为“org.apache.hive.jdbc.HiveDriver”,然后端口为 10000。它完美地工作在我身上。您使用的链接是旧链接,并且 hive 已被重写以支持并发连接,命名为蜂巢2。此链接将为您提供完美的代码,可以正常运行以进行连接。 https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

于 2013-11-14T17:54:00.187 回答
1

jdbc url 指向myHiveServer:9083,这是 Metastore 默认端口。您收到该错误是因为 Metastore 不支持与 hive 服务器相同的 thrift api。您需要指定 hiveserver 的主机 + 端口(1 或 2)。它的默认端口是 10000。

于 2013-07-23T18:43:52.490 回答
0

你需要做两件事来解决这个问题,

  1. 将端口号从 9083 更改为 10000。 Bcz 默认端口号为 10000 用于 hive thrift 服务器...

  2. 只需要启动配置单元节俭服务器......就像这样

    $ hive --service hiveserver &

如果节俭服务器启动,那么你的输出应该是

   $ netstat -nl | grep 10000
     tcp        0      0 0.0.0.0:10000               0.0.0.0:*                   LISTEN
于 2013-11-20T06:07:03.013 回答
0

If you change to hive2 you also need to change the driver path to org.apache.hive.jdbc.HiveDriver

See:http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_18_5.html

于 2013-08-21T18:28:54.383 回答
0

将 'jdbc:hive:' 更改为 'jdbc:hive2:' 并重试

于 2013-06-13T15:25:16.333 回答