Hive:使用当前的jdbc连接Hive并执行sql(HiveServer2)

1.声明

当前内容主要用于本人学习和复习,当前的内容主要为开启当前的HiveServer2和使用Java方式操作当前的Hive中的某个表

当前使用的表基于前面的博客中的:students表

2.开启当前的HiveServer2

在这里插入图片描述

当前的HiveServer已经被移除,只能使用HiveServer2(当前的Hive版本为2.3.7)

开启HiveServer2(和原来的HiveServer启动方式一样)

./bin/hive --service hiveserver2

在这里插入图片描述

3.寻找当前的HiveServer2的连接字符串和驱动类

这里借鉴wike2上官方描述:wike上的HiveServer2

在这里插入图片描述

当前的HiveServer2中的Driver class:org.apache.hive.jdbc.HiveDriver

当前的连接字符串(Windows10中的eclipse连接Linux中Hive):jdbc:hive2://<host>:<port>/<db>,当前的默认port就是10000,所以只需要修改host和db

4.创建maven项目用于连接操作当前的HiveServer2

这里本人直接偷懒了,用maven的pom写了一个

<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
<dependency>
	<groupId>org.apache.hive</groupId>
	<artifactId>hive-jdbc</artifactId>
	<version>2.3.7</version>
</dependency>

开始编写当前的项目(这里拷贝官方的,修改部分内容)

public class HiveJdbcClient {
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";
 
  public static void main(String[] args) throws SQLException {
    try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.exit(1);
    }
    Connection con = DriverManager.getConnection("jdbc:hive2://192.168.1.102:10000/default", "", "");
    Statement stmt = con.createStatement();
    String tableName = "students";
    ResultSet res=null;
    //stmt.executeQuery("drop table " + tableName);
    //ResultSet res = stmt.executeQuery("create table " + tableName + " (key int, value string)");
    // show tables
    String sql = "show tables '" + tableName + "'";
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    if (res.next()) {
      System.out.println(res.getString(1));
    }
    // describe table
    sql = "describe " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1) + "\t" + res.getString(2));
    }
 
    // load data into table
    // NOTE: filepath has to be local to the hive server
    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
    //String filepath = "/tmp/a.txt";
    //sql = "load data local inpath '" + filepath + "' into table " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
 
    // select * query
    sql = "select * from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
    }
 
    // regular hive query
    sql = "select count(1) from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}

5.执行报错和解决方式

Could not open client transport with JDBC Uri: jdbc:hive2://192.168.1.102:10000/default: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate anonymous

发现就是root用户不允许模拟匿名用户!通过百度找到解决参考这个博文:参考博文

直接先停止HiveServer2(Ctrl-C)

停止Hadoop:./sbin/stop-all.sh

修改当前hadoop中的:etc/hadoop/core-site.xml文件并添加一下内容
在这里插入图片描述

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

保存重新启动当前的Hadoop:./sbin/start-all.sh

6.再次执行当前的HiveJdbcClient

结果如下:

在这里插入图片描述
执行成功!

7.总结

1.要使用当前的jdbc操作Hive,必须按照不同的版本来选择启动的HiveServer还是HiveServer2,当前的连接字符串和驱动类都不一样

2.必须修改hadoop中的core-site.xml文件,让外界可以访问

3.其他操作就是当前的Hive的sql操作即可

以上纯属个人见解,如有问题请联系本人!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值