Здесь есть вопрос подключиться с java к Hive, но у меня < сильный> другой

Мой улей работает на машине1, и мне нужно передать несколько запросов с помощью сервера Java, запущенного на машине2. Насколько я понимаю, у Hive есть интерфейс JDBC для приема удаленных запросов. Я взял код отсюда - HiveServer2 Clients

Я установил зависимости, написанные в статье:

  1. улей-jdbc * .jar
  2. улей-сервис * .jar
  3. libfb303-0.9.0.jar
  4. libthrift - 0.9.0.jar
  5. log4j - 1.2.16.jar
  6. SLF4J - апи - 1.6.1.jar
  7. SLF4J - log4j12-1.6.1.jar
  8. 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)

Еще один вопрос в StackOverflow: рекомендуется добавить зависимости Hadoop API в Maven - Hive Error

Я не понимаю, зачем мне нужен API-интерфейс hadoop для подключения клиента к Hive. Разве драйвер JDBC не должен зависеть от базовой системы запросов? Мне просто нужно передать какой-нибудь SQL-запрос?

Редактировать : Я использую Cloudera (5.3.1), думаю, мне нужно добавить зависимости CDH. Экземпляр Cloudera работает под управлением hadoop 2.5.0 и HiveServer2

Но серверы находятся на машине 1. На машине код должен по крайней мере компилироваться, и у меня должны быть проблемы только во время выполнения!

9
Mangat Rai Modi 27 Фев 2015 в 11:00

6 ответов

Лучший ответ

Отвечая на мой собственный вопрос!

С некоторым успехом и пробной версией я добавил следующие зависимости в свой файл 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
Mangat Rai Modi 9 Мар 2015 в 09:16

В случае, если вы все еще не решили это, я попробовал. А для его компиляции и запуска мне потребовались следующие зависимости:

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

Документация по улью, вероятно, написана для более старой версии / дистрибутива.

Ваше исключение связано с отсутствующей банкой hadoop-common, в которой есть org.apache.hadoop.conf.Configuration.

Надеюсь это поможет.

8
Shyam 9 Мар 2015 в 04:29

Похоже, вы все работаете с cloudera, я обнаружил, что репо в maven выглядит старым, потому что, если вы зайдете на их сайт, вы можете скачать их jdbc. https://www.cloudera.com/downloads/ коннекторы / hive / jdbc / 2-5-20.html Похоже, что драйвер поддерживает больше функций, чем драйвер в улье. Я заметил, что они реализовали addBatch. Я просто хочу, чтобы у них были эти библиотеки в maven. Может быть, кто-то сможет найти, где их взять с помощью maven.

1
pitchblack408 14 Май 2018 в 23:50

Я столкнулся с той же проблемой с версией 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.

1
Manindar 25 Апр 2016 в 12:48

Для других, интересующихся, что именно требуется для удаленного выполнения запроса HIVE с использованием java ...

Код 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>
1
Mez 2 Ноя 2015 в 09:59

Та же ошибка при попытке использовать hive-jdbc 1.2.1 против hive 0.13. По сравнению с длинным списком в других ответах. Теперь мы используем эти два:

hive-jdbc-1.2.1-standalone.jar
hadoop-common-2.7.1.jar

Еще одно примечание: вы можете получить сообщение « Обязательное поле« client_protocol »не задано! » при использовании последней версии jdbc для более старого Hive. Если это так, измените версию jdbc на 1.1.0:

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-jdbc</artifactId>
  <version>1.1.0</version>
  <classifier>standalone</classifier>
</dependency>
6
LeOn - Han Li 5 Янв 2016 в 18:34