“Java中的Hive Client错误的方法名称:'execute'”错误

时间:2013-06-10 15:39:22

标签: java jdbc hive

我在Cloudera Manager的集群设置中使用CDH 4.2.1-1.cdh4.2.1.p0.5,我试图让Hive示例在Java中使用Hive API。 我正在使用的hive版本是0.10(hive-hwi-0.10.0-cdh4.2.1.jar),我正在尝试按照此URL中的说明设置一个简单的示例: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)

我已经在谷歌搜索了一段时间,我找不到任何解决方案。 任何人都可以给我一个提示可能导致问题的提示吗?

提前致谢,

Robbbie



导致错误的代码:

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

}

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

将'jdbc:hive:'更改为'jdbc:hive2:'然后重试

答案 3 :(得分:0)

如果更改为hive2,还需要将驱动程序路径更改为org.apache.hive.jdbc.HiveDriver

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

答案 4 :(得分:0)

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

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

  2. 只需要启动hive thrift服务器......就像这样

    $ hive --service hiveserver&amp;

  3. 如果thrift服务器启动,那么你的输出应该是

       $ netstat -nl | grep 10000
         tcp        0      0 0.0.0.0:10000               0.0.0.0:*                   LISTEN