Java 使用JDBC连接 Hive(HiveClient On JDBC)
来源:互联网 发布:浙江卫视网络在线直播 编辑:程序博客网 时间:2024/05/22 19:09
一、前言
Hive中有HiveServer和HiveServer2两种服务,这两种服务都是基于Thrift的,但由于HiveServer不能处理多于一个客户端的并发请求(由于HiveServer使用的Thrift接口所导致的限制),且不能通过修改HiveServer的代码进行更正,因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供更好的支持。本文使用HiveServer2为例, 介绍和编写远程操作Hive的Java API。
二、连接Hive
1. 启动hiveserver2服务
Hive的安装及配置就不再赘述,连接Hive首先需要启动HiveServer2的服务,执行以下两个命令启动:
启动metastore
hive --service metastore &
启动hiveServer2
## 或直接执行hiveserver2hive --service hiveserver2 &
启动完成后,可执行netstat -nl |grep
10000 查看hiveserver2是否已经开启
$ netstat -nl |grep 10000tcp 0 0 (你的IP):10000 0.0.0.0:* LISTEN
这证明hiveserver2已经开启。
2.Java API
接下来 编写Java API
首先列出本程序依赖的Jar包:
hadoop-common-2.6.0.jarhive-jdbc-1.0.0.jar
注意使用的jar包最好与hadoop和hive的版本相对应,否则可能会报错
以下是Java代码:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException; public class JDBCToHiveUtils { private static String driverName ="org.apache.hive.jdbc.HiveDriver"; // 此Class 位于 hive-jdbc的jar包下 private static String Url="jdbc:hive2://**.**.**.**:10000/default"; //填写hive的IP,之前在配置文件中配置的IP private static Connection conn; public static Connection getConnnection() { try { Class.forName(driverName); conn = DriverManager.getConnection(Url,"",""); //只是连接hive, 用户名可不传 } catch(ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; }}
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; public class QueryHiveUtils { private static Connection conn=JDBCToHiveUtils.getConnnection(); private static PreparedStatement ps; private static ResultSet rs; public static void getAll(String tablename) { String sql="select * from "+tablename; System.out.println(sql); try { ps=JDBCToHiveUtils.prepare(conn, sql); rs=ps.executeQuery(); int columns=rs.getMetaData().getColumnCount(); while(rs.next()) { for(int i=1;i<=columns;i++) { System.out.print(rs.getString(i)); System.out.print("\t\t"); } System.out.println(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { String tablename="test1"; QueryHiveUtils.getAll(tablename); } }
以上就是使用JDBC方式连接Hive 。
三、 使用中遇到的错误
1. 报错 : user: ** is not allowed to impersonate **
本地开发时连接Hive时报了这个错误,参考 https://stackoverflow.com/questions/36909002/authorizationexception-user-not-allowed-to-impersonate-user
可在hive-site.xml中添加
<property> <name>hive.server2.enable.doAs</name> <value>true</value></property>
在hadoop的 core-site.xml 中添加
<property> <name>hadoop.proxyuser.yourusename.groups</name><value>*</value></property><property> <name>hadoop.proxyuser.yourusename.hosts</name> <value>*</value></property>
2. 执行无返回语句
执行没有返回的语句例如"use test"时, 可使用:
Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", ""); Statement stmt = con.createStatement();## Hive 官方文档上使用 stmt.executeQuery("use test"), 我使用这个会报错 The query did not generate a result set! stmt.execute("use test");
3. 报错: java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
这是因为没有hadoop-common的jar包,引入即可
4. TezTask错误,返回码1
Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:296) at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:392) at HiveJdbcClient.main(HiveJdbcClient.java:40)
错误号1代表用户认证失败,在连接时必须指定用户名密码,有可能通过服务器设置可以不需要用户认证就可以执行,hadoop默认安装配置用户名密码是hive,hive
5. 使用SpringBoot连接Hive
报错: java.lang.NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDefault(Z)V
在引入hive-jdbc 的jar包时增加:
<!-- hive jdbc--><dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>*</artifactId> </exclusion> </exclusions></dependency>
四、参考
文章参考了: http://www.cnblogs.com/superAng/p/5939642.html,
以及Hive 官方wiki
https://cwiki.apache.org/confluence/display/Hive/HiveClient
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC
- Java 使用JDBC连接 Hive(HiveClient On JDBC)
- Java HIVE 使用Jdbc连接Hive
- Hive使用JDBC连接
- java jdbc 连接hive
- Java通过JDBC连接Hive
- java 通过JDBC连接hive
- Java使用JDBC连接Hive(新版本)API封装
- 使用beeline/jdbc 连接hive,impala,sparksql
- hive使用beeline测试JDBC连接
- java 通过jdbc驱动连接hive操作
- java jdbc 连接hive cdh4.2 hiveserver2
- java 利用jdbc连接hive查询示例
- java通过jdbc驱动连接hive
- java jdbc 连接hive cdh4.2 hiveserver2
- Hive的JDBC连接
- hive jdbc 连接 注意事项
- Jdbc连接Hive
- 通过JDBC连接hive
- myeclipse项目文件前有红色大叹号
- 表格grid
- Openvswitch手册(1): 架构,SSL, Manager, Bridge
- mysql删除字段为null的记录
- Vue2.0进阶组件篇2 解析饿了么(spinner组件)
- Java 使用JDBC连接 Hive(HiveClient On JDBC)
- 解决var url="xxx&参数名="+“中文参数”; 传到后台根据String x = request.getParameter("中文参数名");乱码问题
- Devops学习实践(三) jenkins集成findbugs
- 超级好用的iOS框架
- AVL树(旋转问题详解)
- 5、jQuery插件之jqzoom放大镜插件
- generatorConfig.xml配置
- js中Number()方法
- 关于一些Vue的文章。(5)