通过 Java JDBC 连接 Hive
Connect Hive through Java JDBC
这里有一个问题 connect from java to Hive 但我的 不同
我的配置单元 运行 在 machine1 上,我需要在 machine2 上使用 Java 服务器 运行 传递一些查询。据我了解,Hive 有一个 JDBC 接口用于接收远程查询。我从这里获取代码 - HiveServer2 Clients
我安装了文中写的依赖:
- hive-jdbc*.jar
- 配置单元服务*.jar
- libfb303-0.9.0.jar
- libthrift-0.9.0.jar
- log4j-1.2.16.jar
- slf4j-api-1.6.1.jar
- slf4j-log4j12-1.6.1.jar
- commons-logging-1.0.4.jar
但是我在编译时遇到了 java.lang.NoClassDefFoundError 错误
完整错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:393)
at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:187)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:163)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.bidstalk.tools.RawLogsQuerySystem.HiveJdbcClient.main(HiveJdbcClient.java:25)
Whosebug 上的另一个问题建议在 Maven 中添加 Hadoop API 依赖项 - Hive Error
我不明白为什么客户端需要 hadoop API 才能与 Hive 连接。 JDBC 驱动程序不应该不知道底层查询系统吗?我只需要传递一些 SQL 查询?
编辑:
我正在使用 Cloudera(5.3.1),我想我需要添加 CDH 依赖项。 Cloudera 实例是 运行 hadoop 2.5.0 和 HiveServer2
但是服务器在机器 1 上。在机器上,代码至少应该可以编译,我应该只在运行时有问题!
如果你还没有解决这个问题,我已经试一试了。
我需要以下依赖项才能编译和 运行 :
libthrift-0.9.0-cdh5-2.jar
httpclient-4.2.5.jar
httpcore-4.2.5.jar
commons-logging-1.1.3.jar
hive-common.jar
slf4j-api-1.7.5.jar
hive-metastore.jar
hive-service.jar
hadoop-common.jar
hive-jdbc.jar
guava-11.0.2.jar
配置单元文档可能是针对较旧的version/distribution编写的。
您的异常是由于缺少 hadoop-common
jar,其中包含 org.apache.hadoop.conf.Configuration
.
希望对您有所帮助。
回答我自己的问题!
经过一些尝试和尝试,我在我的 pom 文件中添加了以下依赖项,从那时起我就能够 运行 在 CHD 5.3.1 和 5.2.1 集群上编写代码。
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libfb303</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>2.5.0-mr1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>
请注意,其中一些依赖项可能不是必需的
对于其他想知道使用 java...
远程执行 HIVE 查询到底需要什么的人
Java代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Runner
{
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
// Register driver and create driver instance
Class.forName(driverName);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
// get connection
System.out.println("before trying to connect");
Connection con = DriverManager.getConnection("jdbc:hive2://[HOST IP]:10000/", "hive", "");
System.out.println("connected");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("show tables");
con.close();
}
}
连同具有唯一必需依赖项的 pom 文件..
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test-executor</groupId>
<artifactId>test-executor</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<hadoop.version>2.5.2</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
</project>
尝试对 hive 0.13 使用 hive-jdbc 1.2.1 时出现相同的错误。
与其他答案中的长列表相比。现在我们使用这两个:
hive-jdbc-1.2.1-standalone.jar
hadoop-common-2.7.1.jar
另一个注意事项:当对较旧的 Hive 使用最新的 jdbc 时,您可能会得到“必填字段 'client_protocol' 未设置!”。如果是这样,请将 jdbc 版本更改为 1.1.0:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0</version>
<classifier>standalone</classifier>
</dependency>
我在CDH5.4.1版本遇到过同样的问题。我用下面的代码更新了我的 POM 文件,它对我有用。
我的 Hadoop 版本是 Hadoop 2.6.0-cdh5.4.1
,Hive 版本是 Hive 1.1.0-cdh5.4.1
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libfb303</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
我已经解决了这个 POM 更新。
好像你们都在使用cloudera,我发现maven 中的repo 看起来很旧,因为如果你去他们的站点,你可以下载他们的jdbc。 https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html
该驱动程序似乎比 hive 中的驱动程序支持更多的功能。我注意到他们已经实施了 addBatch。我只希望他们在 maven 中拥有这些库。也许有人可以使用 maven 找到从哪里获取它们。
这里有一个问题 connect from java to Hive 但我的 不同
我的配置单元 运行 在 machine1 上,我需要在 machine2 上使用 Java 服务器 运行 传递一些查询。据我了解,Hive 有一个 JDBC 接口用于接收远程查询。我从这里获取代码 - HiveServer2 Clients
我安装了文中写的依赖:
- hive-jdbc*.jar
- 配置单元服务*.jar
- libfb303-0.9.0.jar
- libthrift-0.9.0.jar
- log4j-1.2.16.jar
- slf4j-api-1.6.1.jar
- slf4j-log4j12-1.6.1.jar
- commons-logging-1.0.4.jar
但是我在编译时遇到了 java.lang.NoClassDefFoundError 错误 完整错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:393)
at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:187)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:163)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.bidstalk.tools.RawLogsQuerySystem.HiveJdbcClient.main(HiveJdbcClient.java:25)
Whosebug 上的另一个问题建议在 Maven 中添加 Hadoop API 依赖项 - Hive Error
我不明白为什么客户端需要 hadoop API 才能与 Hive 连接。 JDBC 驱动程序不应该不知道底层查询系统吗?我只需要传递一些 SQL 查询?
编辑: 我正在使用 Cloudera(5.3.1),我想我需要添加 CDH 依赖项。 Cloudera 实例是 运行 hadoop 2.5.0 和 HiveServer2
但是服务器在机器 1 上。在机器上,代码至少应该可以编译,我应该只在运行时有问题!
如果你还没有解决这个问题,我已经试一试了。 我需要以下依赖项才能编译和 运行 :
libthrift-0.9.0-cdh5-2.jar
httpclient-4.2.5.jar
httpcore-4.2.5.jar
commons-logging-1.1.3.jar
hive-common.jar
slf4j-api-1.7.5.jar
hive-metastore.jar
hive-service.jar
hadoop-common.jar
hive-jdbc.jar
guava-11.0.2.jar
配置单元文档可能是针对较旧的version/distribution编写的。
您的异常是由于缺少 hadoop-common
jar,其中包含 org.apache.hadoop.conf.Configuration
.
希望对您有所帮助。
回答我自己的问题!
经过一些尝试和尝试,我在我的 pom 文件中添加了以下依赖项,从那时起我就能够 运行 在 CHD 5.3.1 和 5.2.1 集群上编写代码。
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libfb303</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>2.5.0-mr1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>
请注意,其中一些依赖项可能不是必需的
对于其他想知道使用 java...
远程执行 HIVE 查询到底需要什么的人Java代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Runner
{
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
// Register driver and create driver instance
Class.forName(driverName);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
// get connection
System.out.println("before trying to connect");
Connection con = DriverManager.getConnection("jdbc:hive2://[HOST IP]:10000/", "hive", "");
System.out.println("connected");
// create statement
Statement stmt = con.createStatement();
// execute statement
stmt.executeQuery("show tables");
con.close();
}
}
连同具有唯一必需依赖项的 pom 文件..
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test-executor</groupId>
<artifactId>test-executor</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<hadoop.version>2.5.2</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
</project>
尝试对 hive 0.13 使用 hive-jdbc 1.2.1 时出现相同的错误。 与其他答案中的长列表相比。现在我们使用这两个:
hive-jdbc-1.2.1-standalone.jar
hadoop-common-2.7.1.jar
另一个注意事项:当对较旧的 Hive 使用最新的 jdbc 时,您可能会得到“必填字段 'client_protocol' 未设置!”。如果是这样,请将 jdbc 版本更改为 1.1.0:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.1.0</version>
<classifier>standalone</classifier>
</dependency>
我在CDH5.4.1版本遇到过同样的问题。我用下面的代码更新了我的 POM 文件,它对我有用。
我的 Hadoop 版本是 Hadoop 2.6.0-cdh5.4.1
,Hive 版本是 Hive 1.1.0-cdh5.4.1
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libfb303</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
我已经解决了这个 POM 更新。
好像你们都在使用cloudera,我发现maven 中的repo 看起来很旧,因为如果你去他们的站点,你可以下载他们的jdbc。 https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 该驱动程序似乎比 hive 中的驱动程序支持更多的功能。我注意到他们已经实施了 addBatch。我只希望他们在 maven 中拥有这些库。也许有人可以使用 maven 找到从哪里获取它们。