[英]Connecting to remote Mapr Hive via JDBC
这个问题类似,但不一样,因为Hive JDBC getConnection没有返回 。 然而,这是一个远程连接。 此时,Metastore存在于启动hiveserver2的目录中。
我们在远程计算机上有一个正在运行的映射器集群。 我想使用Java JDBC连接到此集群上的Hive。
因此我们启动了配置单元服务器:
/opt/mapr/hive/hive-0.11/bin/hiveserver2
服务器进程的输出不包含任何错误消息。 它监听netstat报告的端口10000。
我尝试按照https://cwiki.apache.org/confluence/display/Hive/HiveClient中的描述连接到服务器,从而用运行hiveserver2的服务器名称替换localhost:
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
我有同样的问题,并能够通过向我的pom.xml文件添加正确的依赖项来绕过它。 我从maven central获得了最新的apache apive版本,并转而使用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使我的应用程序挂起,所以我删除它。
我想你需要指定用户名。 因为你正在使用hiveserver2,所以它应该是hive2而不是hive 。 尝试修改您的连接网址:
Connection con =
DriverManager.getConnection("jdbc:hive2://myserver.example.com:10000/default", "<user>", "");
它在链接Hive2中给出
希望这可以帮助...!!!
我也有同样的问题。 请检查客户端端口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!");
}
}
您可以使用beeline客户端使用JDBC连接到hive。
这将是一些事情:beeline!connect jdbc:hive2:// localhost:10000
检查链接: http : //dwbitechguru.blogspot.ca/2014/11/how-to-connect-to-hadoop-hive-using.html
在我的情况下添加: ;auth=noSasl
到JDBC连接字符串解决了无休止的等待连接!
jdbc:hive2://server:10000/default;auth=noSasl
你应该在这里获得hive-service-X.XX.X-cdhX.XXjar: https ://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hive/; 它对我来说很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.