先分析mapreduce:
mapreduce主要用于数据清洗或统计分析工作
并且绝大多数的场景都是针对的结构化数据的分析
而对于结构化的数据处理我们想到sql
但数据量非常大时,没办法使用mysql等,只能使用mapreduce
可是mapreduce的缺点是:编程不便、成本太高
hive的诞生:
如果有一个组件可以针对大数据量的结构化数据进行数据分析,但是又不用写mapreduce,直接用sql语句实现就完美了
所以hive就诞生了
直接使用 MapReduce 所面临的问题:
为什么要使用 Hive:
那么hive可以完全替代mapreduce吗?
不可以,hive仅仅处理的是mapreduce中的结构化数据处理
会对xml、html解析等,比较困难
Hive 由 Facebook 实现并开源
是基于 Hadoop 的一个数据仓库工具
可以将结构化的数据映射为一张数据库表
并提供 HQL(Hive SQL)查询功能
底层数据是存储在 HDFS 上。
Hive的本质是将 SQL 语句转换为 MapReduce 任务运行
hive的执行引擎mapreduce
hive实际上就是一个hadoop的上层应用
hive理解为hadoop的客户端 ,这个客户端支持sql编程
hive的底层中 保存很多的map reduce模板 执行一个sql语句的时候 会根据不同的sql语句的关键字(group by)将sql语句翻译为mapreduce任务进行执行
使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据
适用于离线的批量数据计算。
数据仓库之父比尔·恩门(Bill Inmon)在 1991 年出版的“Building the Data Warehouse”(《建立数据仓库》)一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行
所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce计算框架,对存储在 HDFS 中的数据进行分析和管理
数据库和数据仓库的区别:
总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
hive提供3种方式连接:
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口
jdbc——>java语言去操作
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
执行流程:
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运行MetaStore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生一个 MapReduce 任务。
内部表和外部表的区别:
删除内部表,删除表元数据和数据
删除外部表,删除元数据,不删除数据
内部表和外部表的使用选择:
分区表和分桶表的区别:
为了对数据进行模块化的管理(细化的管理)
不同的业务的数据最好存储在不同的数据库中
这里的分区不同于mapreduce的分区的
作用就是提升查询性能
当hive中的表的数据很大的时候,在进行查询的时候性能很低(进行的是全表扫描)
这个时候我们就可以对这个表以过滤的字段创建不同的分区,这个时候不同的分区的数据就会分开存储,在进行按照过滤字段查询的时候就不会全表扫描了
这里的分区指的是将原来的数据分为多个部分,分别存储在不同的目录下的,每一个目录存储的都是一个分区
如:
不创建分区表的时候
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info
所有数据全部存储在表对应的目录下
这个时候进行查询的时候都是全表扫描的
创建了分区 以过滤字段创建分区的时候(地点)
数据存储:
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/address=beijing/
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/address=dongbei/
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/address=neimeng/
这个时候进行查询 查询北京的人员信息
只会扫描hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/address=beijing/这个目录数据 不会全表扫描了
一个分区对应的就是一个存储目录
分区的标准 分区的依据字段——分区字段
查询的时候以分区字段进行查询 查询性能高
查询的时候不以分区字段进行查询 查询性能没有提升的
同mapreduce中的分区
作用:
1)提升抽样性能
2)提升join性能
需要对数据进行抽样或join的时候,这个对表进行分桶
在分桶表中指定:
分桶字段----》mapreduce的分区字段
桶的个数---》mapreduce的reducetask的个数
默认分桶算法(mapreduce的分区算法)
分桶字段是非数值型:
分桶字段.hash%桶的个数
分桶字段是数值型的:
分桶字段%分桶个数
结果:
不同的桶的数据输出到不同的文件中
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info抽样:
3个桶 分桶字段年龄
age%3 name.hash%3
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/part-r-00000 第一个桶 余数0
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/part-r-00001 第二个桶
hdfs://hdp01:9000/user/hive/warehouse/bd1809.db/info/part-r-00002 第三个桶
样本数据抽样准则:数据足够分散
抽样---直接区一个桶 半个桶
做关联的时候 两个表的桶的个数相同或倍数关系
hive中的视图只有逻辑视图没有物化视图
物化视图:将视图代表的sql执行结果
hive中的视图仅仅相当于一个sql语句的快捷键 别名
hive中的视图是为了提升hql语句的可读性
select from (
select * from (
select * from (
select ....from ..
)
)
)
select from (
select * from b_view
)
hive视图在查询视图的时候才会执行
包含2部分信息 元数据 和 表数据(原始数据)
存储在mysql中
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
<description>元数据库mysql连接的url</description>
<!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost,myhive>代表的是当前的配置的hive的在mysql中的元数据库的名字 -->
</property>
上面的参数决定的是hive的元数据库在mysql中的存储位置
myhive库就是元数据库
元数据库中的几个核心表:
hive的数据库的描述信息的元数据表DBS:
hdfs://hdp01:9000/user/hive/warehouse/test_bd1809.db test_bd1809 hadoop USER
一条数据对应的是hive中的一个数据库
hive中创建一个数据库 这表中添加一条数据
hive的表的描述信息TBLS:
hive中一个表对应这里的一条数据
1(table_id) 1545036305 2(db_id) 0 hadoop 0 1 student MANAGED_TABLE(表类型) 0
这个表中的表类型字段 有3个值:
MANAGED_TABLE 管理表、内部表
EXTERNAL_TABLE 外部表
virtual_view 视图
默认的创建的表都是管理表
hive的字段描述信息COLUMNS_V2:
这里的一条数据对应的是hive表中的一个字段
1(表id) age int 3(字段顺序,从0开始 顺序递增的)
元数据可以修改的
hive中的表或库信息都是从元数据库读取的信息
元数据库的信息只要修改 hive的表或库的信息就会修改
但是表中的存储的数据不会变的 在hdfs存储的
存储在hdfs上的
默认的存储目录:/user/hive/warehouse
这个目录下依次建库的目录 表的目录
/user/hive/warehouse/bd1809.db 库的目录
/user/hive/warehouse/bd1809.db/student 表目录
参数:
hive.metastore.warehouse.dir
/user/hadoop/hive
hive的表的数据的hdfs存储位置配置
修改这个参数值修改的就是hive的原始数据存储的hdfs目录