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的解读和看法相关推荐
- spark SQL Running the Thrift JDBC/ODBC server
Running the Thrift JDBC/ODBC server 1:运行 ./sbin/start-thriftserver.sh --hiveconf hive.server2.thrif ...
- 6、HIVE JDBC开发、UDF、体系结构、Thrift服务器、Driver、元数据库Metastore、数据库连接模式、单/多用户模式、远程服务模式、Hive技术原理解析、优化等(整理的笔记)
目录: 5 HIVE开发 5.1 Hive JDBC开发 5.2 Hive UDF 6 Hive的体系结构 6.2 Thrift服务器 6.3 Driver 6.4 元数据库Metastore 6.5 ...
- jdk1.8版本已经不包含jdbc.odbc连接
连接access的时候发现报错,无法加载jdbc.odbc类文件,到Java安装目录上jre/lib/rt.jar上找jdbcodbc类也没有了. 找个jdk1.7安装就ok啦. 转载于:https: ...
- MySQL吉连_Learn Jdbc : Java, Jdbc, Odbc
Learn Jdbc : Java, Jdbc, Odbc 介绍 Learn Jdbc : Java, Jdbc, Odbc Learn JDBC we precisely name what we ...
- 大数据学习笔记43:Hive - JDBC编程
文章目录 一.Hive JDBC概述 二.Hive JDBC案例 1.修改hadoop核心配置文件core-site.xml 2.修改hive配置文件hive-site.xml 3.启动hadoop服 ...
- java excel odbc_Java:无法使用JDBC ODBC更新Excel
我可以很好地读取行/列,但我无法更新,插入或删除. try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String myDB ...
- Spark Structured : HIve jdbc方式访问待下划线的表,找不到表的错误
1.背景 Spark Structured : HIve jdbc方式访问待下划线的表,找不到表的错误 > select * from default._xd_after limit 1; &g ...
- Hive jdbc执行seelct 语句时报 return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
参考1 解决方法: 对HIVE表进行条件过滤,必须要以partition为首要条件. 如:select distinct hdate from t_stage_access where hd ...
- hive jdbc连接时的乱码问题
之前写了个web端的程序用来控制从oracle向Hadoop导数据,同时在页面上可以通过jdbc调用hive,发现中文显示为乱码,因为是装在windows2003上 在网上查了一下,通过修改hive的 ...
最新文章
- 百度AI“杀入”新领域,我举双手支持!
- 超级计算机在线解方程,量子计算机10秒可得超级计算机百年运算结果
- COM笔记-CoCreateInstance
- Stas and the Queue at the Buffet
- MySQL - cast()函数
- java综合案例_综合实例 - Java House - BlogJava
- 11 如何通过 “副本传输” 传输从DEV到QAS的请求号
- 【BZOJ2149】拆迁队,分治+斜率优化DP
- TeamViewer——Ubuntu系统上的安装和卸载
- ASP.NET MVC初体验
- xmpppy获取服务器版本信息,为什么XMPP? - 今幕明的个人页面 - OSCHINA - 中文开源技术交流社区...
- Swift 使用SwiftyJSON解析JSON数据
- c语言pow为什么溢出,c – GMP pow中的溢出处理
- JoyOI1027 木瓜地
- CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- 小米盒子 远程访问 计算机,小米盒子、电视远程安装电视狗视频图文教程
- 华为手机android是什么意思,华为手机的英文文件夹是什么意思?哪些可以删除?今天总算知道了...
- lil9341_使用Python评估Lil John的“拒绝接受什么”
- 反arp攻击软件_技术干货透析中间人攻击
- C++入门级——缺省参数
热门文章
- Win32 Thread Information Block
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
- C# 将PDF转为SVG的3种情况
- nodeJS之域名DNS
- JS倒计时:从某个固定时间开始倒记
- mysql的字段为bit时,插入数据报Data too long
- ios启动私有链查询区块信息
- SegmentFault D-Day 2015 武汉站回顾
- Java VisualVM远程监控JVM
- 在河北当中学老师用不用考计算机,想当教师没编制?两类教师不用考,直接进编制...