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,只 ...
随机推荐
- bzoj 1926: [Sdoi2010]粟粟的书架
#include<cstdio> #include<iostream> #define N 201 #define M 500008 using namespace std; ...
- c++ 普通高精减
//c++ 普通高精减 //codevs 3115 高精度练习之减法 //内容简单,就不注释了. //注意下,&&优先级高于||. #include<cstdio>#inc ...
- DP 剪枝
DP其实也是和搜索一样可以有剪枝的,昨晚看到一个超级好的DP剪枝题:(HDU - 5009) N段东东,要染色,每次给一个区间染色需要的花费为 该区间颜色总数的平方. 每一段只能被染一次色.求 最 ...
- 理解ROS rqt_console和 roslaunch
1.使用rqt_console和roslaunch 这篇教程将介绍使用rqt_console和rqt_logger_level来调试以及使用roslaunch一次启动许多nodes.如果你使用ROS ...
- IT公司100题-11-求二叉树中节点的最大距离
问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/ \6 14/ \ / \4 8 12 16 分析: 二叉树中最远的两个节点,要么是根 ...
- hql抓取要注意的点
fetchtype是lazy,那就用到了在通过缓存中的关联去取,用不到不取:lazy遇到joinfetch就失去意义,但是由于hql语句是自己编写的,可以控制加不加fetch 所以如果主力是hql语句 ...
- IIS 6.0 401 错误
1.错误号401.1 症状:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝 分析: 由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无 ...
- C# 3.0 扩展方法[转载]
实践 扩展方法是C# 3.0中新加入的特性.MSDN中对扩展方法的定义是:扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 以下以 ...
- UVa 11020 Efficient Solutions(平衡二叉树/multiset )
题意:有n个人,每个人有x.y两个属性,每次输入一个人(x,y).如果当前不存在一个人(x`,y`)的属性满足x`<=x,y`<y或者x`<x,y`<=y,就说这个人是有优势的 ...
- vc设置按钮文字颜色
设置按钮文字颜色使用 CMFCBUTTON即可 在OnInitDialog函数加入如下内容即可 ((CMFCButton*)GetDlgItem(IDC_MFCBUTTON1))->SetTex ...