Hive不是数据库,不是数据库,不是数据库!
1)用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
2)元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
3)Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
4)驱动器:Driver
(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
1、默认是Derby数据库
Derby是一个完全用java编写的数据库,非常小巧,核心部分derby.jar只有2M,所以既可以做为单独的数据库服务器使用,也可以内嵌在应用程序中使用。其优缺点具体如下:
1、Derby定位是小型数据库, 特别是嵌入式. 支持的数据库小于50GB, 对于小型网站, 事务不复杂的应用, 使用它的还是很不错的. 另外大型桌面应用也可以用它来保存配置和其他数据, 可以做到与文件格式无关, 因为都是访问数据库.
2、功能: Derby支持标准SQL92, SQL1999, SQL2003, 支持临时表, 索引, 触发器, 视图, 存储过程, 外键, 约束, 并行, 事务, 加密与安全等. 只要有JDK(>=1.3), 就可以运行Derby.
3、安全性:Derby的安全性也做得很到位, 包括用户鉴权和加密解密.
4、性能:Derby的性能也是不错的.在插入100万条记录时, CPU的占用率一直低于40%, 平均每插一条记录耗时小于0.3毫秒. 这对于满足桌面应用程序是绰绰有余的. 但是比Oracle、MySql等专业数据库性能要低。
2、一般改用Mysql或者Oracle数据库(如何配置)
1)拷贝驱动 将MySQL的JDBC驱动拷贝到Hive的lib目录下 [user001@hadoop102 software]$ cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib 2) 配置Metastore到MySql 在$HIVE_HOME/conf目录下新建hive-site.xml文件 [atguigu@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml 添加如下内容
|
三、Hiveserver2和Metastore server的关系
hiveServer2和metaStore其实都是hive本身带的组件,那么两者究竟有什么不同呢?
小结:
1.HiveServer2和MetaStore本质上都是Thrift Service,虽然可以启动在同一个进程内,但不建议这么做。建议是拆成不同的服务进程来启动。
2.一般来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。而MetaStore才是用来访问元数据的。
如果你把两者混了,起在同一个进程内,就会产生你的问题类的疑问。
3.CliDriver是SQL本地直接编译,然后访问MetaStore,提交作业,是重客户端。
BeeLine是把SQL提交给HiveServer2,由HiveServer2编译,然后访问MetaStore,提交作业,是轻客户端。
4.具体写业务脚本两种都行,数据量大的话,建议用CliDriver
四、cli和beeline区别
1.cli是通过metaServer访问元数据的
2.beeline是通过hiverserver2访问元数据的
①bin/hive(cli命令行的方式访问元数据) --访问--> metaStore server --访问-->MySQL
② bin/beeline(jdbc的方式访问元数据) --访问-->hiveServer2 --访问--> metaStore server --访问--> MySQL