我在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!");
}
}
答案 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
答案 4 :(得分:0)
你需要做两件事来解决这个问题,
将端口号从9083更改为10000.对于hive thrift服务器,Bcz默认端口号为10000 ...
只需要启动hive thrift服务器......就像这样
$ hive --service hiveserver&amp;
如果thrift服务器启动,那么你的输出应该是
$ netstat -nl | grep 10000
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN