Hive基础知识
1 Hive相关概念
1.1 Hive是什么
Hive是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能,最终底层将HQL语句转换为MapReduce任务的,底层数据是存储在 HDFS 上。
1.2 Hive的产生背景
使用MapReduce,所面临的问题: ①人员学习成本太高;②项目周期要求太短;③MapReduce 实现复杂查询逻辑开发难度太大。
MapReduce分布式计算的时候,绝大多数的场景针对于结构化数据的,而针对结构化数据做数据统计分析,sql语句是最擅长的。Facebook 实现并开源Hive,操作接口采用类 SQL 的语法,提供快速开发的能力;避免了写 MapReduce,减少开发人员的学习成本;可自由扩展集群规模而无需重启服务,还支持用户自定义函数。
1.3 Hive的特点
(1)是Hive是基于 Hadoop 的一个数据仓库工具,底层数据存储在HDFS ,计算转换为MapReduce;
数据仓库与数据库的区别:见本文最后一节。Hive不支持事务。
(2)可以将结构化的数据映射为一张数据库表,Hive只能做结构化数据,所以Hive是不可以完全替代MapReduce,因为MapReduce不仅仅可以针对结构化数据,还可以针对半结构化数据;
(3)并提供 HQL(Hive SQL)查询功能;
(4)Hive的本质是将 SQL 语句转换为 MapReduce 任务运行;
(5)使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。
1.4 Hive的优缺点
优点:
(1)可扩展性(横向扩展):可自由的扩展集群的规模,一般不需要重启。
横向扩展:用更多的节点支撑更大量的请求,通过分担压力的方式扩展集群的规模
纵向扩展:扩展一个点的能力支撑更大的请求
(2)延展性:hive中提供的内置函数271个,还可以自定义函数
(3)良好的容错性:可以保障即使有节点出现问题,SQL 语句仍可完成执行
缺点:
(1)不支持 delete操作肯update操作
(2)不支持事务:因为不支持删改,所以主要用来做 OLAP(联机分析处理),而不是OLTP(联机事务处理),这就是数据处理的两大级别
(3)查询延时很严重:因为 MapReduce 的启动过程消耗很长时间,所以不能 用在交互查询系统中。
2 Hive的安装
由于内嵌 Derby 版本,启动hive的时候只会加载当前目录下的元数据库一旦切换目录 ,元数据库无法加载,所以derby适用于单用户不适用多用户,也不能随便切换目录,所在一般不用,下面介绍外置MySQL 版本的Hive的安装
(1)准备好 MySQL;
(2)上传
apache-hive-2.3.2-bin.tar.gz
(3)解压
tar -xvzf apache-hive-2.3.2-bin.tar.gz -C /home/refuel/opt/modules
(4)配置环境变量
vim /home/refuel/.bashrc_profile 添加以下两行内容:
export HIVE_HOME=/home/refuel/opt/modules/apache-hive-2.3.2-bin
export PATH=$PATH:$HIVE_HOME/bin
保存退出后执行 source /home/refuel/.bashrc_profile
(5)修改配置文件
touch /home/refuel/opt/modules/apache-hive-2.3.2-bin/conf/hive-site.xml
vim /home/refuel/opt/modules/apache-hive-2.3.2-bin/conf/hive-site.xml
<configuration><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://bigdata01:3306/hivedb?createDatabaseIfNotExist=true</value><description>元数据连接的url bd1904hive元数据库在mysql</description><!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost --></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value><description>Driver class name for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value><description>username to use against metastore database</description></property><property><name>javax.jdo.option.ConnectionPassword</name><value>123456</value><description>password to use against metastore database</description></property>
</configuration>
(6)将mysql的驱动(mysql-connector-java-5.1.40-bin.jar)放到hive的lib下
(7)初始化hive的元数据库
schematool -dbType mysql -initSchema
(8)启动 Hive 客户端
hive
3 Hive的基本架构
(1)用户接口层
①CLI,Shell 终端命令行,采用交互形式使用 Hive 命令行与 Hive 进行交互,最常用;
②JDBC/ODBC,是 Hive 的基于JDBC操作提供的客户端,用户通过这连接至Hive server 服务;
③Web UI,通过浏览器访问 Hive
(2)跨语言服务平台层
能让不同的编程语言调用 Hive 的接口,老版本是thift server 新版本是hiveserver2
(3)核心驱动层
Driver驱动器组件完成将HQL语句转化为MapReduce任务,并进行提交。Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
①解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
②编译器:编译器是将抽象语法树编译为逻辑执行计划
③优化器:优化器是对逻辑执行计划进行优化
④执行器:执行器是调用底层的运行框架执行最终优化结果的逻辑执行计划
(4)元数据层
元数据:描述数据的数据,Hive的元数据就是存储在 Hive 中的数据的描述信息。Hive 中的元数据通常包括:
①描述数据库相关信息的数据(DBS),Hive中创建一个数据库这个表中插入1条数据进行描述
如:
#数据库数据存储的hdfs的位置 数据库名 hdfs://hivedb/user/hive/warehouse default |
②描述表的信息(TBLS),Hive中有一个表,这个表就会有一条信息
如:
#表名 dbid 表类型(MANAGED_TABLE:管理表) student 7 MANAGED_TABLE |
③表的字段信息(columns_v2),Hive中显示的表结构来自元数据的
如:
表id 字段名 字段类型 字段顺序 1 id int 0 |
4 Hive的数据组织形式
(1)Database数据库
便于数据精细化管理,将不同模块的数据,存储在不同的数据库中。
(2)Table表
1)按照权限分(表数据管理权限):分为内部表(也叫管理表)或外部表。
①内部表(managed_table):表数据(HDFS)的管理权限都是Hive自己所有的,对于存储表数据的HDFS目录 Hive具备绝对的权限的(数据的删除)。默认创建的表,都是内部表。内部表在进行删除的时候元数据和表数据一并被删除的。
②外部表(external_table):表数据的管理权限是HDFS的 ,Hive不具备表数据权限的(数据删除),Hive对这个数据 只有使用权限 没有删除权限。外部表在进行删除的时候元数据会被删除,但是表数据不会被删除,要想彻底删除需要手动删除HDFS的数据。创建时加上external 关键字就是外部表。
内部表和外部表区别:
①建表语句:默认为内部表,创建时加external为外部表;
②删除数据时:内部表删除元数据和原始数据(表数据)一并删除,外部表删除只删除元数据;
③应用场景:
外部表:公共数据,如好多部门同用的数据,清洗原始日志数据
内部表:如自己部门的数据
2)按照功能分:分为分区表和分桶表
①分区表:Hive的分区表完全不同于MapReduce中的分区
Hive中每一个表中存储都是海量的数据,我们在进行查询时候 如select * from person where age=18;执行的全表扫描,数据量大,全表扫描严重影响查询效率。为了提高查询效率,将原来的表进行划分成不同的区域,查询的时候降低扫描范围,这里的每一个区域 就叫做一个分区。
分区本质上相当于将原来的表划分成一个个的小表,分区依据按照需要过滤的字段作为分区字段。一个分区表对应一个目录。
/user/hive/warehouse/table1.db/person/00000 没有分区的目录 有分区目录如下: /user/hive/warehouse/table1.db/person/age=19/0000 /user/hive/warehouse/table1.db/person/age=18/0000 /user/hive/warehouse/table1.db/person/age=20/0000 |
②分桶表:类似于MapReduce中的分区,将原始数据 按照一定的规则,分成不同的文件
作用主要有两个:提升抽样性能(取某一个或几个桶中的数据)和提升join性能()
默认分桶规则为:分桶字段 .hash & Integer_max % 分桶个数
/user/hive/warehouse/table1.db/person/00000 没有分桶的文件 /user/hive/warehouse/table1.db/person/00000 0 |
(3)View视图(类型:VIRTUAL_VIEW)
Hive中只存在逻辑视图 不存在物化视图,Hive中的视图不会真正的执行 仅仅将视图代表的sql语句存储,视图类似于sql查询语句的快捷方式。
视图的作用:提sql高代码的可读性
5 数据仓库
数据仓库(data warehouse)概念:含义数据仓库是一个面向主题的,集成的,不可更新的,随时间不断变化的数据集合,他可以支持企业或组织的决策分析处理。是多个数据库服务器的整体集群
数据库:按某种数据结构存储的数据的仓库,是单独的一个运行的数据主体集合,针对小批量的数据的。
(1)数据库是面向事务的设计,数据仓库是面向主题设计的;
(2)数据库一般存储在线数据即当前值,数据仓库存储的一般是历史数据;
(3)数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余;
(4)数据库是为捕获数据而设计,数据仓库是为分析数据而设计,数据库中数据的目标是面向业务处理人员的,为业务处理人员提供信息处理的支持,而数据仓库则是面向高层管理人员的,为其提供决策支持;
(5)数据库内数据是动态变化的,只要有业务发生,数据就会被更新,而数据仓库则是静态的历史数据,只能定期添加、刷新;
(6)数据库中数据访问频率较高,但访问量较少,而数据仓库的访问频率低但访问量却很高;
(7)数据库在访问数据时要求响应速度快,其响应时间一般在几秒内,而数据仓库的响应时间则可长达数几小时。
数据仓库的物理上就是数据库,数据库中有实时业务系统,我们通常所说的OLTP(On-Line Transaction Processing在线事务处理),要求的是数据库访问频率高,并发量和实时处理的能力要求高,按照秒甚至毫秒来进行的。比如银行、电力交换等业务。数据库中还有一种是联机分析系统。我们通常所说的OLAP(On-Line Analysis Processing),是用来存储过往的历史数据,将可能有用的所有数据归类放到一个库中,就是仓库。届时需要做趋势分析或者其他预测应用时,才访问数据库,实时性要求不是很高。OLAP业务应用比如宏观股指分析、年度的天气分析等。