hive-jdbc/odbc的解读和看法
当前的项目中, 涉及到了hive-jdbc/odbc这块, 因此把这几天所调研的资料作一份总结.
本文讲解hive-jdbc/hive-odbc的实现, 以期对jdbc/odbc规范和实现有个较深入的理解和看法.
在具体讲述hive-jdbc之前,首先讲解一下hive的整体架构
*) hive的整体架构
这幅图很清晰的表明了hive的整体架构, 以及各个组件扮演的角色, 这边专注于讲解下hive-jdbc/hive-odbc如何实现,并如何与hiveserver进行交互.
*) 对hive-jdbc的理解和认识
JDBC/ODBC两者皆是通过hiveclient与hiveserver保持通讯的,借助thrfit rpc协议来实现交互。
hiveserver里面的session是socket连接级别,不是全局维护的,因此hiveserver的部署属于无状态节点,其HA部署方式简单采用多节点部署即可.
在hive-0.12源码目录下,odbc是c/c++编写的源码,大致浏览了下,简单易懂,但都是与hiveserver交互的那部分代码,看不到任何与ODBC协议接口相关的内容。
同时对比了下hive-jdbc的源码, 同一个模块下有两份hive-jdbc源码,分别为org.apache.hadoop.hive.jdbc, org.apache.hive.jdbc, 前者对应hiveserver ,后者对应hiveserver2 实现了tcliservice.thrift接口, hiveserver2加强了并发、认证等功能,同时对open api更友好。
JDBC是java database connection的规范,它定义了一系列java访问各类db的访问接口,因此hive-jdbc其实本质上是扮演一个协议转换的角色,把jdbc的标准协议转换为访问HiveServer服务的协议. hive-jdbc除了扮演网络协议转化的工作, 并不承担他的工作, 比如sql的合法性校验和解析,一律忽略.
jdbc的统一接口
public interface Connection extends Wrapper {
Statement createStatement() throws SQLException;
void commit() throws SQLException;
Statement createStatement() throws SQLException;
void close() throws SQLException;
}
public interface Statement extends Wrapper {
boolean execute(String sql) throws SQLException;
ResultSet getResultSet() throws SQLException;
}
public interface ResultSet extends Wrapper {
Statement createStatement() throws SQLException;
String getString(int columnIndex) throws SQLException;
}
hive-jdbc里最重要的3个类conection, statement, resultset.
conection对应hiveclient的创建, statement则对应hiveclient具体sql调用接口执行, resultset对应数据的读取(采用lazy的方式 + 分批批量读取的策略, 对涉及大数据返回结果的查询sql非常友好),因为hiveclient是个长连接, 而thrift rpc是个request/response的服务方式, 一个sql会对应多次rpc访问, 因此session扮演了很重要的角色.
其对应的服务接口如下所示:
public interface ThriftHiveMetastore.Iface {
// 对应 hive-jdbc, Statement能访问的接口,用于sql的执行
public void execute(String query) throws HiveServerException, org.apache.thrift.TException;
// 对应hive-jdbc, ResultSet涉及的数据读取的接口
public String fetchOne() throws HiveServerException, org.apache.thrift.TException;
public List<String> fetchN(int numRows) throws HiveServerException, org.apache.thrift.TException;
public List<String> fetchAll() throws HiveServerException, org.apache.thrift.TException;
}
*) hive-server的一点看法
Thrift最常用的还是当作rpc服务使用,请求没有session的概念,这边hiveserver采用thrift是采用worker thread pool来处理,它选用了ThreadPoolServer(One thread per connection)这种thrift提供的服务模型中,最简单的,也是最适合长连接并需要维护session的应用场景。单另一方面, 由于hiveserver没有zookeeper作协调, 而连接方式又是采用长链接, 因此可能会出现集群负载不均衡的情况. 而且,据之前对thrift的认识, thrift对超时控制缺少支持, 这方便在hive-jdbc的实现中,好像也有所体现. 个人的看法.
参考资料:
https://cwiki.apache.org/confluence/display/Hive/HiveClient
www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html
hive-jdbc/odbc的解读和看法的更多相关文章
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- 第5章 JDBC/ODBC服务器
第5章 JDBC/ODBC服务器 Spark SQL也提供JDBC连接支持,这对于让商业智能(BI)工具连接到Spark集群上以 及在多用户间共享一个集群的场景都非常有用.JDBC 服务器作为一个独立 ...
- JDBC ODBC区别
一.JDBC(Java DataBase Connectivity standard) 1.JDBC,它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库. 2. 驱动程序(JDBC ...
- Hive学习之六 《Hive进阶— —hive jdbc》 详解
接Hive学习五 http://www.cnblogs.com/invban/p/5331159.html 一.配置环境变量 hive jdbc的开发,在开发环境中,配置Java环境变量 修改/etc ...
- Hive 8、Hive2 beeline 和 Hive jdbc
1.Hive2 beeline Beeline 要与HiveServer2配合使用,支持嵌入模式和远程模式 启动beeline 打开两个Shell窗口,一个启动Hive2 一个beeline连接hi ...
- JSP使用JDBC ODBC 实例
1.JDBC ODBC Brige driver是JSP连接数据库的驱动,只要安装了JDK这个驱动就默认安装了 2. 配置JDBC ODBC数据源的步骤:http://blog.csdn.net/li ...
- 概念学习 - JNDI, JDBC, ODBC, DataSource
layout: post title: 概念学习 - JNDI, JDBC, ODBC, DataSource --- 最近在学习Java Hibernate,对数据库资源访问这块好多概念模糊,所以在 ...
- Hive JDBC:java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate anonymous
今天使用JDBC来操作Hive时,首先启动了hive远程服务模式:hiveserver2 &(表示后台运行),然后到eclipse中运行程序时出现错误: java.sql.SQLExcepti ...
- java 8: ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
转眼之间, java 11都快要推出了. 而我一直都在 java 7环境下写代码,真的不想升级,不想改变什么,可世界每天都在变化. 最近因为服务端需要SNI,而 java 7 只支持客户端的SNI,只 ...
随机推荐
- MSMQ消息队列
MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一 ...
- 算法导论-钢条切割 C# 递归实现
下班前看到有位兄弟写 钢条切割问题,尝试实现C#版, 还没有实现最优版,分享一下. int[] parr; private void button1_Click(object sender, Even ...
- C#常用实例
1 時間 1.1 顯示在走的時間 控件:TextBox為顯示日期時間,命名為txtDateTimer Timer為時鐘,命名為time private void dtDateTimer_Tick(ob ...
- ie9,10 uploadify cleanUp bug
起因:ie多次加载uploadify3.2版本这个组件的时候,出现了SCRIPT5007: 缺少对象. From:http://blog.163.com/xiangfei209@126/blog/s ...
- [转]change the linux startup logo
1. Make sure that you have the kernel sources installed. As annoying as this may seem, you will need ...
- C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()
本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...
- Chrome 应用推荐 - 下载管理扩展: Chrono
地址:http://goo.gl/JVdxvg Chrono下载管理器让你轻松高效地管理Chrome浏览器中的下载任务.Chrono与Chrome浏览器紧密地整合在一起,如菜单.工具栏支持等等.Chr ...
- KVO的内部实现原理
kvo概述 kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作. kvo实现原理 ...
- HTML--4格式布局
一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例: 二.position:absolute 1.外层没有position:absolute(或r ...
- 《Java中方法的参数传递方式只有一种:值传递》
//方法的参数传递机制(1):基本类型做形参的传递. class PrimitiveTransferTest { public static void swap(int a,int b) { //下面 ...