簡體   English   中英

通過JDBC連接到遠程Mapr Hive

[英]Connecting to remote Mapr Hive via JDBC

這個問題類似,但不一樣,因為Hive JDBC getConnection沒有返回 然而,這是一個遠程連接。 此時,Metastore存在於啟動hiveserver2的目錄中。

我們在遠程計算機上有一個正在運行的映射器集群。 我想使用Java JDBC連接到此集群上的Hive。

因此我們啟動了配置單元服務器:

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

服務器進程的輸出不包含任何錯誤消息。 它監聽netstat報告的端口10000。

我嘗試按照https://cwiki.apache.org/confluence/display/Hive/HiveClient中的描述連接到服務器,從而用運行hiveserver2的服務器名稱替換localhost:

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

然而,該計划完全依賴於這一聲明。 它似乎沒有連接。

可能我需要提供用戶名和密碼?

最初我使用過驅動程序org.apache.hadoop.hive.jdbc.HiveDriver。

但是,如果hive2服務器正在運行,我似乎應該使用驅動程序org.apache.hive.jdbc.HiveDriver。 現在我得到以下例外:

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

我有同樣的問題,並能夠通過向我的pom.xml文件添加正確的依賴項來繞過它。 我從maven central獲得了最新的apache apive版本,並轉而使用cloudera repo中的cdh4版本。 因此,您所看到的可能是具有錯誤的hive-jdbc依賴性的症狀。 這是我添加到我的pom文件中的maven片段:

<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 repo的鏈接。

此外,將“; auth = noSasl”添加到URL使我的應用程序掛起,所以我刪除它。

我想你需要指定用戶名。 因為你正在使用hiveserver2,所以它應該是hive2而不是hive 嘗試修改您的連接網址:

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

它在鏈接Hive2中給出

希望這可以幫助...!!!

我也有同樣的問題。 請檢查客戶端端口10000上是否可以訪問服務器(服務器和端口已啟用,防火牆沒有限制)也檢查hiveserver是否已啟動並正在運行。 如果是,那么它應該工作。 以下代碼為我的mapr hive工作。

如果您有任何與查詢相關的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客戶端使用JDBC連接到hive。

這將是一些事情:beeline!connect 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.XXjar: https ://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hive/; 它對我來說很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM