Подключение к удаленному улью Mapr через 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.апаш.платформа Hadoop.улей.интерфейс jdbc.Хиведривер.

но кажется, что я должен использовать организацию драйвера.апаш.улей.интерфейс 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

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-адресу заставило мое приложение зависнуть, поэтому я удалил его.


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

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

его дано в ссылке Hive2

надеюсь, что это помогает...!!!


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

если у вас есть какой-либо запрос, связанный с 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!");
    }
}

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

Это было бы что-то вроде: beeline !подключение jdbc:hive2: / / localhost: 10000

регистрация по ссылке: http://dwbitechguru.blogspot.ca/2014/11/how-to-connect-to-hadoop-hive-using.html


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

jdbc:hive2://server:10000/default;auth=noSasl

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