Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JDBC连接到远程Mapr配置单元_Java_Jdbc_Hadoop_Hive_Mapr - Fatal编程技术网

Java 通过JDBC连接到远程Mapr配置单元

Java 通过JDBC连接到远程Mapr配置单元,java,jdbc,hadoop,hive,mapr,Java,Jdbc,Hadoop,Hive,Mapr,这个问题与我们的问题相似,但不同。但这是关于远程连接的。此外,元存储也存在于启动hiveserver2的目录中 我们在远程机器上有一个正在运行的mapr集群。我想使用JavaJDBC连接到此集群上的配置单元 因此,我们启动了配置单元服务器: /opt/mapr/hive/hive-0.11/bin/hiveserver2 服务器进程的输出不包含任何错误消息。它侦听netstat报告的端口10000 我尝试按中所述连接到服务器,从而将localhost替换为运行hiveserver2的服务器名称:

这个问题与我们的问题相似,但不同。但这是关于远程连接的。此外,元存储也存在于启动hiveserver2的目录中

我们在远程机器上有一个正在运行的mapr集群。我想使用JavaJDBC连接到此集群上的配置单元

因此,我们启动了配置单元服务器:

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

服务器进程的输出不包含任何错误消息。它侦听netstat报告的端口10000

我尝试按中所述连接到服务器,从而将localhost替换为运行hiveserver2的服务器名称:

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
线程“main”java.sql.SQLException中的异常:无法建立到jdbc的连接:hive2://myserver.example.com:10000/default:Required字段“client_protocol”未设置!结构:TOpenSessionReq(客户端协议:null) 位于org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:246) 位于org.apache.hive.jdbc.HiveConnection。(HiveConnection.java:132) 位于org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105) 位于java.sql.DriverManager.getConnection(DriverManager.java:579) 位于java.sql.DriverManager.getConnection(DriverManager.java:221) 位于HiveJdbcClient.main(HiveJdbcClient.java:22) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:601) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 原因:org.apache.thrift.TApplicationException:必填字段“client_protocol”未设置!结构:TOpenSessionReq(客户端协议:null) 位于org.apache.thrift.TApplicationException.read(TApplicationException.java:108) 位于org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71) 位于org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:144) 位于org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:131) 位于org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:237) ... 10多
我认为您需要指定用户名。而且它应该是hive2而不是hive,因为您使用的是hiveserver2。 尝试修改您的连接url:

Connection con = 
  DriverManager.getConnection("jdbc:hive2://myserver.example.com:10000/default", "<user>", "");
连接con=
getConnection(“jdbc:hive2://myserver.example.com:10000/default”,“”,“”);
它在链接中给出


希望这有助于

我也遇到了同样的问题,通过在pom.xml文件中添加正确的依赖项,我可以解决这个问题。我从maven central获得了最新的apache版本的hive,并转而使用cloudera repo的cdh4版本。因此,您看到的可能是具有错误的配置单元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>

克劳德拉
https://repository.cloudera.com/artifactory/cloudera-repos/
...
org.apache.hive

此外,将“auth=nosal”添加到URL会使我的应用程序挂起,因此我将其删除。

我也遇到了同样的问题。 请检查是否可以从客户端在端口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!");
    }
}

您可以使用beeline客户端使用JDBC连接到配置单元

这将是类似于:直线!连接jdbc:hive2://localhost:10000

检查链接:

在我的例子中添加:
;auth=noSasl
到JDBC连接字符串解决了无休止的等待连接的问题

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

您应该在这里获得hive-service-X.XX.X-cdhX.X.X.jar:;
这对我来说很好。

谢谢。对于hive2,它给出了以下异常:线程“main”java.sql.SQLException中的异常:无效URL:jdbc:hive2://myserver.example.com:10000/default位于org.apache.hadoop.hive.jdbc.HiveConnection。(HiveConnection.java:86)位于org.apache.hadoop.hive.jdbc.HiveDriver.connection(HiveDriver.java:106)位于java.sql.DriverManager.getConnectionHiveJdbcClient.main(HiveJdbcClient.java:22)的java.sql.DriverManager.getConnection(DriverManager.java:221)中的(DriverManager.java:579)似乎我使用了错误的驱动程序:。现在我遇到了异常:必填字段“client\u protocol”未设置!结构:TOpenSessionReq(client\u protocol:null)尝试将此添加到hive-site.xml:hive.server2.authentication nosal中,并将其追加到jdbc url中;auth=nosal。还要确保hiveserver2在端口10000处运行。谢谢。现在连接再次挂起。可能是我使用了错误的用户名。当前我使用的是启动hive的linux系统用户。您能确定吗在配置单元连接块所在的catch块中使用System.exit。如果程序遇到异常,这将退出程序,否则将需要一段时间才能退出。我不确定这段代码是否已包含在您的代码中,如果是,它将给出正确的原因exception.catch(ClassNotFoundException e){//TODO自动生成的catch block e.printStackTrace();System.exit(1);}谢谢。您似乎无法将central maven的jdbc客户端用于cloudera。