Hive JDBC 错误:java.lang.NoSuchFieldError:HIVE_CLI_SERVICE_PROTOCOL_V7

Posted

技术标签:

【中文标题】Hive JDBC 错误:java.lang.NoSuchFieldError:HIVE_CLI_SERVICE_PROTOCOL_V7【英文标题】:Hive JDBC error: java.lang.NoSuchFieldError: HIVE_CLI_SERVICE_PROTOCOL_V7 【发布时间】:2016-12-15 16:50:07 【问题描述】:

我正在尝试使用 Hive2 连接器通过 JDBC 创建与 Impala 的连接。但我收到了这个错误:

Exception in thread "main" java.lang.NoSuchFieldError: HIVE_CLI_SERVICE_PROTOCOL_V7
      at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:175)
      at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
      at java.sql.DriverManager.getConnection(DriverManager.java:664)
      at java.sql.DriverManager.getConnection(DriverManager.java:208)
      at dsnoc.dsnoc_api.dolar.getDolarFromImpala(dolar.java:145)
      at dsnoc.dsnoc_api.dsnoc.main(dsnoc.java:75)

不知道是不是依赖兼容性问题:

  <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.1.0</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
  </dependency>
  <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>2.6.0</version>
  </dependency>

我将 CDH 5.8.0 与 Hive 1.1.0 和 Hadoop 2.6.0 一起使用

或者可能是代码问题:

public static double getDolarFromImpala(String date)  
    double dolar = 0.0;
    try 
        Class.forName(JDBC_DRIVER_HIVE);
        String sql = "SELECT valor FROM dolar where fecha ='"+date+"'";

        Connection con = DriverManager.getConnection(JDBC_HIVE2_URL,USERNAME,PASSWORD);
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(sql);

        while(rs.next())
            dolar = rs.getDouble("valor");                                          
        
        stmt.close();
        con.close();
    
    catch(SQLException se)
          //Handle errors for JDBC
          se.printStackTrace();
    
    catch(Exception e)
          //Handle errors for Class.forName
          e.printStackTrace();
    
    return dolar;

但我认为不是,因为我使用 Impala-JDBC 进行了尝试并成功了。

另一件事是我没有使用 Impala-JDBC,因为它不读取或发送 USERNAMEPASSWORD,给我这个错误:

 [Simba][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AuthorizationException: User '' does not have privileges to execute 'SELECT'

问候,

【问题讨论】:

听起来您的依赖项不匹配。 如果您想连接到 Impala,只需使用 Cloudera 网站上提供的 Impala JDBC 驱动程序。您会尝试 mysql 驱动程序还是 Oracle 驱动程序?不,所以不要在 Apache Hive 驱动程序上浪费时间(顺便说一句,它对 JDBC 功能的支持非常有限,不适用于较旧的 Hive 服务器版本等——在许多情况下,Cloudera Hive 驱动程序是更好的选择) 我使用 hive2 因为 Impala-JDBC 不读取用户名和密码。 【参考方案1】:

试试这个罐子:

hive-jdbc-2.1.1-standalone.jar hadoop-common-2.7.3.jar

依赖:

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.7.3</version>
</dependency>

你可以在这里找到这个罐子:https://search.maven.org

这个 jar 在 JMeter 中为我工作。

【讨论】:

以上是关于Hive JDBC 错误:java.lang.NoSuchFieldError:HIVE_CLI_SERVICE_PROTOCOL_V7的主要内容,如果未能解决你的问题,请参考以下文章

DataGrip 连接 Kerberos 认证的 hive 报 Hive JDBC Kerberose Authentication Error: GSS initiate failed 错误

Zeppelin 版本 0.7.3 - 连接到 Hive - 错误“找不到解释器 jdbc”

通过 JDBC 将文件加载到 hive

Apache Drill - hiveserver2 jdbc 错误

通过 jdbc 客户端使用 hive udf 时出现奇怪的错误

Java使用JDBC连接Hive