Подключение к удаленному Mapr Hive через JDBC

Этот вопрос похож, но не тот же, что и Hive JDBC getConnection не возвращает. Но все же речь идет об удаленном подключении. Также хранилище метаданных присутствует в каталоге, в котором был запущен hiveserver2.

У нас есть работающий кластер mapr на удаленной машине. Я хочу подключиться к Hive в этом кластере с помощью Java JDBC.

Следовательно, мы запустили сервер улья:

/opt/mapr/hive/hive-0.11/bin/hiveserver2

Выходные данные серверного процесса не содержат сообщений об ошибках. Он прослушивает порт 10000, как сообщает netstat.

Я пытаюсь подключиться к серверу, как описано в https://cwiki.apache.org/confluence/display/Hive/HiveClient, тем самым заменяя localhost именем сервера, на котором работает hiveserver2:

Connection con = 
  DriverManager.getConnection("jdbc:hive://myserver.example.com:10000/default", "", "");

И все же программа зависает именно на этом утверждении. Кажется, нет связи.

Возможно, мне нужно указать имя пользователя и пароль?

Изначально я использовал драйвер org.apache.hadoop.hive.jdbc.HiveDriver.

Тем не менее, мне кажется, что я должен использовать драйвер org.apache.hive.jdbc.HiveDriver, если сервер hive2 запущен. Теперь я получаю следующее исключение:

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

person user152468    schedule 05.12.2013    source источник


Ответы (6)


У меня была такая же проблема, и я смог ее обойти, добавив правильную зависимость в мой файл pom.xml. Я получал последний выпуск apache hive от maven central и переключился на использование выпуска cdh4 из репозитория cloudera. Итак, то, что вы видите, может быть признаком неправильной зависимости hive-jdbc. Вот фрагмент maven, который я добавил в свой файл pom:

<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.

Кроме того, добавление "; auth = noSasl" к URL-адресу привело к зависанию моего приложения, поэтому я удалил его.

person Philip O.    schedule 10.12.2013
comment
Спасибо. Похоже, вы не можете использовать клиент jdbc из центрального maven с cloudera. - person user152468; 26.02.2014

Думаю нужно указать логин. Также это должно быть hive2, а не hive, поскольку вы используете hiveserver2. Попробуйте изменить URL-адрес подключения:

Connection con = 
  DriverManager.getConnection("jdbc:hive2://myserver.example.com:10000/default", "<user>", "");

Его можно найти по ссылке Hive2.

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

person Mukesh S    schedule 05.12.2013
comment
Благодарю. С hive2 это дает следующее Исключение: Исключение в основном потоке java.sql.SQLException: Недействительный URL: jdbc: hive2: //myserver.example.com: 10000 / по умолчанию в org.apache.hadoop.hive.jdbc.HiveConnection. ‹ init ›(HiveConnection.java:86) в org.apache.hadoop.hive.jdbc.HiveDriver.connect (HiveDriver.java:106) в java.sql.DriverManager.getConnection (DriverManager.java:579) в java.sql. DriverManager.getConnection (DriverManager.java:221) в HiveJdbcClient.main (HiveJdbcClient.java:22) - person user152468; 05.12.2013
comment
похоже, я использую не тот драйвер: grokbase.com/p / cloudera / cdh-user / 12bwb8fdbd / hive-jdbc-timeout. Теперь я получаю исключение: обязательное поле client_protocol не установлено! Структура: TOpenSessionReq (протокол_клиента: нуль) - person user152468; 05.12.2013
comment
Попробуйте добавить это в hive-site.xml: ‹property› ‹name› hive.server2.authentification ‹/name› ‹value› NOSASL ‹/value› ‹/property› и добавьте этот ; auth = noSasl в URL-адресе jdbc. Также убедитесь, что hiveserver2 работает на порту 10000. - person Mukesh S; 05.12.2013
comment
Благодарю. Теперь соединение снова зависает. Возможно, я использую неправильное имя пользователя. В настоящее время я использую пользователя системы linux, который запустил куст. - person user152468; 05.12.2013
comment
Можете ли вы убедиться, что у вас есть System.exit в блоке catch, где у вас есть блок подключения Hive. Это приведет к выходу из вашей программы, если она обнаружит исключение, в противном случае для выхода потребуется время. Я не уверен, что этот фрагмент уже есть в вашем коде, если он есть, это даст исключение по правильной причине. catch (ClassNotFoundException e) {// TODO Автоматически сгенерированный блок catch e.printStackTrace (); System.exit (1); } - person Mukesh S; 05.12.2013
comment
Привет, удачи с этим? Я с той же проблемой - person eLRuLL; 14.12.2013

У меня тоже была такая же проблема. Пожалуйста, проверьте, доступен ли сервер через порт 10000 от клиента (сервер и порт включены, брандмауэр не ограничивает), а также проверьте, что hiveserver запущен и работает. если да, то он должен работать. следующий код работает для меня для улья mapr.

Если у вас есть какой-либо 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!");
    }
}
person user3129399    schedule 23.12.2013

Вы можете использовать клиент beeline для подключения к улью с помощью JDBC.

Это будет что-то вроде: beeline! Connect jdbc: hive2: // localhost: 10000

проверьте ссылку: http://dwbitechguru.blogspot.ca/2014/11/how-to-connect-to-hadoop-hive-using.html.

person user4033352    schedule 28.11.2014

В моем случае добавление: ;auth=noSasl в строку подключения JDBC решило бесконечное ожидание подключения!

jdbc:hive2://server:10000/default;auth=noSasl
person user2395959    schedule 25.02.2016

Здесь вы должны получить hive-service-X.XX.X-cdhX.XXjar: https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hive/; У меня все работает нормально.

person iwwenbo    schedule 18.05.2016