【问题标题】:Unable to establish a JDBC connection to Hive from Eclipse无法从 Eclipse 建立到 Hive 的 JDBC 连接
【发布时间】:2015-01-12 21:08:41
【问题描述】:

我正在尝试建立到 Hive 的 JDBC 连接,以便我可以查看和创建表并从 Eclipse 查询 Hive 表。我使用了 HiveClient 示例代码:https://cwiki.apache.org/confluence/display/Hive/HiveClient 然后我将所有需要的 jar 添加到 eclipse 中的 java 构建路径并启动 Hive Thrift Server。端口 10000 正在侦听。我正在使用 Cloudera QuickstartVM 4.6.1 和它附带的 eclipse。这是我尝试运行代码时在 IDE 中遇到的错误。

Exception in thread "main" java.sql.SQLException: org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset
    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:108)
    at org.apache.hadoop.hive.jdbc.HiveConnection.<init>(HiveConnection.java:103)
    at org.apache.hadoop.hive.jdbc.HiveDriver.connect(HiveDriver.java:104)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at jdbc.Hive.main(Hive.java:24)

当我尝试使用直线连接到 Hive 时,我得到了同样的错误。但是,当我从 !connect 命令中删除主机名和端口时,它会出现以下错误:

beeline> !connect jdbc:hive:// "" ""                 
scan complete in 4ms
Connecting to jdbc:hive://
14/03/21 18:42:03 WARN conf.HiveConf: DEPRECATED: Configuration property hive.metastore.local no longer has any effect. Make sure to provide a valid value for hive.metastore.uris if you are connecting to a remote metastore.
14/03/21 18:42:03 INFO metastore.HiveMetaStore: 0: Opening raw store with implemenation class:org.apache.hadoop.hive.metastore.ObjectStore
14/03/21 18:42:04 INFO metastore.ObjectStore: ObjectStore, initialize called
14/03/21 18:42:05 INFO DataNucleus.Persistence: Property datanucleus.cache.level2 unknown - will be ignored.

我在这里错过了什么!?

【问题讨论】:

  • 检查hadoop是否没有安全模式??

标签: java hadoop jdbc hive cloudera


【解决方案1】:

您有 2 个选项来使用 jdbc 连接 hiveserver

选项 1:Hiveserver2

您正在尝试连接 hiveserver2,cloudera manager 中的 hiveserver 版本是 hivesever2,它比 hiveserver 更安全。你使用的JDBC代码是hiveserver,hiveserver2使用下面的代码sn-p

Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
Statement stmt = con.createStatement();
String tableName = "testHiveDriverTable";
stmt.execute("drop table if exists " + tableName);
stmt.execute("create table " + tableName + " (key int, value string)");
String sql = "show tables '" + tableName + "'";

如果查看连接字符串,可以看到 hiveserver 版本 2(jdbc:hive2://localhost:10000/default", "", ""),第二个和第三个参数是用户名和密码,默认为空字符串“”。

为了执行这个程序,添加 hiveserver2 特定的库。

不用自己编写程序来检查hiveserver2 jdbc连接,可以使用beeline hive客户端如下

> [testuser02@Abcd-Host1 ~]$ beeline

> beeline> !connect jdbc:hive2://Abcd-Host1:10000/default "" "" ""
> 
> 0: jdbc:hive2://Abcd-Host1:10000/default> show tables;

+------------+
|  tab_name  |
+------------+
| sample_07  |
| sample_08  |
| test1      |
+------------+
3 rows selected (0.334 seconds)

选项 2: Hiveserver1

如果您想利用现有代码(hiveserver1 的代码),您拥有https://cwiki.apache.org/confluence/display/Hive/HiveClient。您必须在另一个端口的用户空间中启动一个新的 hiveserver。使用以下命令在给定端口启动 hiveserver

nohup hive --service hiveserver -p 10001 &

现在将jdbc连接中的端口号改为10001并运行。

【讨论】:

  • 感谢您的回答。但不应该是这样。我尝试了第一个选项,但在线程“main”java.sql.SQLException 中出现异常:无效的 URL:jdbc:hive2://localhost:10000/default 使用选项 2,错误仍然存​​在!
  • 确保在选项 1 期间仅在类路径中添加了以下 jar。不要从 hive 库中添加任何其他 jar。 hive-jdbc-0.10.0-cdh4.4.0.jar commons-logging-1.0.4.jar hive-service-0.10.0-cdh4.4.0.jar libfb303-0.9.0.jar libthrift-0.9.0-cdh4- 1.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.1.jar log4j-1.2.16.jar
  • 我删除了其他 jars。除了你提到的罐子,我还得保留 hive-metastore-0.10.0.jar。我仍然收到最初的错误消息。
  • 你可以试试第二个选项吗?
  • 您是否在 hiveserver2 中启用了安全性 (kerberos)?
猜你喜欢
  • 2021-08-06
  • 2018-03-20
  • 2019-07-04
  • 2015-01-16
  • 1970-01-01
  • 2014-10-16
  • 2023-03-06
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多