通过 Java JDBC 连接 Hive

Posted

技术标签:

【中文标题】通过 Java JDBC 连接 Hive【英文标题】:Connect Hive through Java JDBC 【发布时间】:2015-02-27 08:00:38 【问题描述】:

这里有一个问题connect from java to Hive 但我的问题不同

我的 hive 在 machine1 上运行,我需要使用在 machine2 上运行的 Java 服务器传递一些查询。据我了解,Hive 具有用于接收远程查询的 JDBC 接口。我从这里获取了代码 - HiveServer2 Clients

我安装了文章中写的依赖:

    hive-jdbc*.jar hive-service*.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)

*** 上的另一个问题建议在 Maven 中添加 Hadoop API 依赖项 - Hive Error

我不明白为什么客户端需要 hadoop API 才能与 Hive 连接。 JDBC 驱动程序不应该与底层查询系统无关吗?我只需要传递一些 SQL 查询?

编辑: 我正在使用 Cloudera(5.3.1),我想我需要添加 CDH 依赖项。 Cloudera 实例正在运行 hadoop 2.5.0 和 HiveServer2

但是服务器在机器 1。在机器上代码至少应该编译,我应该只在运行时遇到问题!

【问题讨论】:

hadoop和hive使用的版本是什么? 【参考方案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

hive 文档可能是针对旧版本/发行版编写的。

您的例外是由于缺少 hadoop-common jar,它具有 org.apache.hadoop.conf.Configuration

希望这会有所帮助。

【讨论】:

感谢您的回复,我已经解决了这个问题,但是我对解决方案不太满意,所以我没有发布它。 但它可以解决您的问题。请满足自己。你错过了 hadoop-common.jar【参考方案2】:

尝试对 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>

【讨论】:

【参考方案3】:

回答我自己的问题!

经过一些尝试和尝试,我在我的 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>

请注意,其中一些依赖项可能不是必需的

【讨论】:

【参考方案4】:

对于其他想知道使用 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>

【讨论】:

如何获得查询结果?【参考方案5】:

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 更新问题。

【讨论】:

【参考方案6】:

好像你们都在使用cloudera,我发现maven中的repo看起来很旧,因为如果你去他们的网站,你可以下载他们的jdbc。 https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 该驱动程序似乎支持比配置单元中的功能更多的功能。我注意到他们已经实现了 addBatch。我只是希望他们在 Maven 中有这些库。也许有人可以找到使用 maven 的地方。

【讨论】:

以上是关于通过 Java JDBC 连接 Hive的主要内容,如果未能解决你的问题,请参考以下文章

Hive 通过 Jdbc 连接 HiveServer2

Hive 通过 Jdbc 连接 HiveServer2

使用hivejdbc接入hive

jdbc连hive怎么批量插入

Java使用JDBC连接Hive

JAVA 中的 Hive JDBC 连接