回顾:hive是一个数据仓库,建了表,进行了相应的基本操作,和关系型数据库是差不多的。
01 Hive的基本介绍
1、hive产生的原因
· a) 方便对文件及数据的元数据进行管理,提供统一的元数据管理方式
b) 提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析
2、hive是什么?
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.
Hive经常被大数据企业用作企业级数据仓库。
Hive在使用过程中是使用SQL语句来进行数据分析,由SQL语句到具体的任务执行还需要经过解释器,编译器,优化器,执行器四部分才能完成。
(1)解释器:调用语法解释器和语义分析器将SQL语句转换成对应的可执行的java代码或者业务代码
(2)编译器:将对应的java代码转换成字节码文件或者jar包
(3)优化器:从SQL语句到java代码的解析转化过程中需要调用优化器,进行相关策略的优化,实现最优的 查询性能
(4)执行器:当业务代码转换完成之后,需要上传到MapReduce的集群中执行
3、数据仓库–Hive(简单了解即可)
1、数据仓库基本概念
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
2、数据处理分类:OLAP与OLTP
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
3、OLTP
OLTP,也叫联机事务处理(Online Transaction Processing),表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。在这样的系统中,单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等,如美国eBay的业务数据库,就是很典型的OLTP数据库。
4、OLAP
OLAP(On-Line Analysis Processing)在线分析处理是一种共享多维信息的快速分析技术;OLAP利用多维数据库技术使用户从不同角度观察数据;OLAP用于支持复杂的分析操作,侧重于对管理人员的决策支持,可以满足分析人员快速、灵活地进行大数据复量的复杂查询的要求,并且以一种直观、易懂的形式呈现查询结果,辅助决策。
基本概念:
度量:数据度量的指标,数据的实际含义
维度:描述与业务主题相关的一组属性
事实:不同维度在某一取值下的度量
特点:
(1)快速性:用户对OLAP的快速反应能力有很高的要求。系统应能在5秒内对用户的大部分分析要求做出反 应。
(2)可分析性:OLAP系统应能处理与应用有关的任何逻辑分析和统计分析。
(3)多维性:多维性是OLAP的关键属性。系统必须提供对数据的多维视图和分析,包括对层次维和多重层次 维的完全支持。
(4)信息性:不论数据量有多大,也不管数据存储在何处,OLAP系统应能及时获得信息,并且管理大容量信 息。
分类:
按照存储方式分类:
ROLAP:关系型在线分析处理
MOLAP:多维在线分析处理
HOLAP:混合型在线分析处理
按照处理方式分类:
Server OLAP和Client OLAP
操作:
钻取:在维的不同层次间的变化,从上层降到下一层,或者说将汇总数据拆分到更细节的数据,比如通过 对2019年第二季度的总销售数据进行钻取来查看2019年4,5,6,每个月的消费数据,再例如可以钻取 浙江省来查看杭州市、温州市、宁波市…这些城市的销售数据
上卷:钻取的逆操作,即从细粒度数据向更高汇总层的聚合,如将江苏省、上海市、浙江省的销售数据进 行汇总来查看江浙沪地区的销售数据
切片:选择维中特定的值进行分析,比如只选择电子产品的销售数据或者2019年第二季度的数据
切块:选择维中特定区间的数据或者某批特定值进行分析,比如选择2019年第一季度到第二季度的销售数 据或者是电子产品和日用品的销售数据
旋转:维的位置互换,就像是二维表的行列转换,比如通过旋转来实现产品维和地域维的互换
4、数据库与数据仓库的区别
注意:前三条重点掌握理解,后面的了解即可
1、数据库是对业务系统的支撑,性能要求高,相应的时间短,而数据仓库则对响应时间没有太多的要求,当然也是越快越好
2、数据库存储的是某一个产品线或者某个业务线的数据,数据仓库可以将多个数据源的数据经过统一的规则清洗之后进行集中统一管理
3、数据库中存储的数据可以修改,无法保存各个历史时刻的数据,数据仓库可以保存各个时间点的数据,形成时间拉链表,可以对各个历史时刻的数据做分析
4、数据库一次操作的数据量小,数据仓库操作的数据量大
5、数据库使用的是实体-关系(E-R)模型,数据仓库使用的是星型模型或者雪花模型
6、数据库是面向事务级别的操作,数据仓库是面向分析的操作
现在搭建hive的第三种模式:
上节课搭建了hive的远程数据库模式,这种模式可能会用到,但不是企业里使用最多的方式。
想一个问题:之前已经安装好hive了,并且启动hive命令行接口,当我们敲一个hive回车启动hive的时候,元数据服务有没有启动?
启动了。有手动启动hive的元数据服务么,没有。说明当前提供hive meta store的元数据服务,只能在当前节点里使用,如果想在node03或node04中使用元数据服务,不可以使用。
搭建第三种模式,保证我们其他一些比如说sparkSQL,impala能够使用hive里面的元数据服务,独立出来一个服务。依然是要进行手动配置的。
MySQL server还是在node01
meta store client作为客户端放在node03
把meta store server元数据服务放在node04
AdminManual Metastore Administration
同样给出了相关的配置:
服务端的配置:
hive.metastore.thrift.bind.host
和之前相比多了这样一个端口:默认值是9083
客户端的配置:
hive.metastore.uris
现在客户端与服务端是要独立开来的,意味着客户端只需要连接到meta store server,而meta store server连接到MySQL,连接MySQL的4个必要属性是在meta store server里配置的,而客户端只要能保证连接到meta store server就可以了。
所以这里需要使用thrift协议,RPC调用就可以进行访问了
hive.metastore.local
Metastore is remote. Note: This is no longer needed as of Hive 0.10. Setting hive.metastore.uri is sufficient.
meta store是远程连接,在hive0.10版本之后就不需要配置这个属性了,所以官网里虽然展示出来这个属性了,但是并不需要进行配置。
hive.metastore.warehouse.dir
远程hdfs目录
从node02节点拷贝到node03和node04:
cd /opt/bigdata
scp -r hive-2.3.4 root@node03:`pwd`
scp -r hive-2.3.4 root@node04:`pwd`
在node03中:
先做环境变量配置:
vi /etc/profile
添加:
export HIVE_HOME=/opt/bigdata/hive-2.3.4
在PATH中添加 :$
规定把第三台作为服务端,第四台作为客户端
服务端要连接到MySQL的 ,需要在服务端配置MySQL的连接属性,客户端连接到服务端,不需要配MySQL
只需要加两个属性就可以了
在node03中:服务端这5个属性不需要做修改,但是为了和node02做区分需要改两个东西,改数据库的名称
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01/hive_remote?createDatabaseIfNotExist=true</value>
</property>
其他地方都不需要做修改。
在node04中:
只需要配两个属性就可以了,其余的删除
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01/hive_remote?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node03:9083</value>
</property>
默认端口是9083的,只有这样才能保证连接成功。
该往MySQL存储相关的数据了:
mysql -uroot -pok
show databases; //现在还是3个数据库
在第三台节点执行:
schematool -dbType mysql -initSchema
这时候又多了一个数据库,hive_remote
接下来该启动服务了,启动对应的元数据服务
hive --service metastore
注意:这个窗口是一个阻塞式窗口,就会卡着不动。不用管它。
在第四台节点输入:
hive
远程模式搭建完成,安装就完成了,接下来开始讲SQL了。
Hive SQL
之前讲过hivesql了,但是那种方式是非常低效的,建表的时候仿照MySQL,但那种方式不够完整。hive完整的建表SQL应该怎么看:
还是回到官网,选择:
LanguageManual
现在属于数据库定义语言,SQL语句分三种,DDL DML DCL,这里用的DDL因为是建表语句
LanguageManual DDL
create database test;
show database;
这儿创建了一个test数据库,之前default存在配置的hdfs数据库里面,现在创建数据库之后,会在目录下建一个test.db的数据库,表会放在这里面
use test;
建表语句:从官网直接粘出来的
Create Table
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format] //行格式,自己指定文件分隔符
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
CREATE [TEMPORARY] [EXTERNAL] TABLE