Hive
Hive基本介绍
产生原因
- 方便对文件及数据的元数据进行管理,提供统一的元数据管理方式;
- 提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析。
介绍
Hive在使用过程中,是使用SQL语句来进行数据分析,由SQL语句到具体的任务执行还需要经过解释器、编译器、优化器和执行器四个部分才能完成。
1)解释器
调用语法解释器和语义分析器将SQL语句转换成对应的可执行的Java代码或者业务代码。
2)编译器
将对应的Java代码转换成字节码文件或者Jar包。
3)优化器
从SQL语句到Java代码的解析转换过程中需要调用优化器,进行相关策略的优化,实现最优的查询性能。
4)执行器
当业务代码转换完成之后,需要上传到MapReduce集群中执行。
数据处理分类
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)和联机分析处理OLAP(on-line analytical processing)。
- OLTP是传统关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易;
- OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
操作
1. 钻取
在维的不同层次间的变化,从上层降到下层,或者说将汇总数据拆分到更细节的数据,比如通过对2019年第二季度的总销售数据进行钻取来查看2019年4、5、6,每个月的消费数据,再例如可以钻取浙江省来查看杭州市、温州市、宁波市等这些城市的销售数据。
2. 上卷
钻取的逆操作,即从细粒度数据向更高汇总层的聚合,如将江苏省、上海市、浙江省的销售数据进行汇总来查看江浙沪地区的销售数据。
3. 切片
选择维中特定的值进行分析,比如只选择电子产品的销售数据或者2019年第二季度的数据。
4. 切块
选择维中特定区间的数据或者某批特定值进行分析,比如选择2019年第一季度到第二季度的销售数据或者是电子产品和日用品的销售数据。
5. 旋转
维的位置互换,就像是二维表的行列转换,比如通过旋转来实现产品维和地域维的互换。
数据库和数据仓库的区别
- 数据库是对业务系统的支撑,性能要求高,响应的时间短,而数据仓库则对响应时间没有太多的要求,当然也是越快越好。
- 数据库存储的是某一个产品线或者某个业务线的数据,数据仓库可以将多个数据源的数据经过统一的规则清洗之后,进行集中统一管理。
- 数据库中存储的数据可以修改,无法保存各个历史时刻的数据,数据仓库可以保存各个时间点的数据,形成时间拉链表,可以对各个历史时刻的数据做分析。
- 数据库一次操作的数据量小,数据仓库操作的数据量大。
- 数据库使用的是实体-关系(E-R)模型,数据仓库使用的是星型模型或者雪花模型。
- 数据库是面向事务级别的操作,数据仓库是面向分析的操作。
Hive的架构
角色
1. 用户访问的接口(CLI)
CLI(Command Line Interface):用户可以使用Hive自带的命令行接口执行HiveQL、设置参数等功能;
JDBC/ODBC:用户可以使用JDBC或ODBC的方式在代码中操作Hive;
Web GUI:浏览器接口,用户可以在浏览器中对Hive进行操作(2.2之后,淘汰掉了)
2. Thrift Server
Thrift服务运行客户端使用Java、C++、Ruby等多种语言,通过编程的方式远程访问Hive。
3. Driver
Hive Driver是Hive的核心,其中包含了解释器、编译器、优化器等各个组件,完成从SQL语句到MapReduce任务的解析优化执行过程。
4. MetaStore
Hive的元数据存储服务,一般将数据存储再关系型数据库中,为了实现Hive元数据的持久化操作,Hive的安装包中自带了Derby内存数据库,但是在实际的生产环境中一般使用MySQL来存储元数据。
搭建方式
- Local/Embedded Metastore Database(Derby)
- Remote Metastore Database
- Local/Embedded Metastore Server
- Remote Metastore Server
根据上述分类,可以简单归纳为以下三类:
- 使用Hive自带的内存数据库Derby作为元数据存储;
- 使用远程数据库MySQL作为元数据存储;
- 使用本地 / 远程元数据服务模式安装Hive
安装步骤
无ThriftServer
-
解压安装
-
修改环境变量
vi /etc/profile
export HIVE_HOME=/opt/bigdata/hive-2.3.4
并且将HIVE_HOME/bin加到PATH路径中。
-
修改配置文件,进入到$HIVE_HOME/conf中,
mv hive-default.xml.template hive-site.xml
增加配置,将原有的配置删除,增加以下配置
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
-
添加MySQL的驱动包到$HIVE_HOME/lib目录中;
-
执行初始化元数据数据库的步骤
schematool -dbType mysql -initSchema
-
执行hive启动对应的服务。
hive
有ThriftServer
-
解压安装(ThriftServer和Thrift的Client都要)
-
修改环境变量(ThriftServer和Thrift的Client都要)
vi /etc/profile
export HIVE_HOME=/opt/bigdata/hive-2.3.4
并且将HIVE_HOME/bin加到PATH路径中。
-
ThriftServer服务端中修改配置文件,进入$HIVE_HOME/conf目录中
mv hive-default.xml.template hive-site.xml
将原有配置删除,增加以下配置(与原本的无ThriftServer的配置一样,这里不过把数据库名称和hdfs的路径做了对应修改)
<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:3306/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
-
ThriftServer的客户端中修改配置文件,进入$HIVE_HOME/conf目录中
mv hive-default.xml.template hive-site.xml
将原有配置删除,增加以下配置
ThriftServer的端口默认是9083!
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://node03:9083</value> </property>
-
添加MySQL的驱动包到$HIVE_HOME/lib目录中;
-
ThriftServer服务端执行初始化元数据数据库的步骤
schematool -dbType mysql -initSchema
-
ThriftServer服务端启动
hive --service metastore
这个启动后,是一个阻塞的窗口,可以做一个脚本去执行就可以了。
-
ThriftServer客户端启动
hive
Hive
数据类型
-
primitive_type(基本数据类型)
下面列举一些常用的
- INT
- BOOLEAN
- FLOAT
- DOUBLE
- STRING
- DECIMAL(precision, scale)
- DATE
- 等等…………
-
array_type(数组数据类型)
- ARRAY < data_type >
-
map_type(key-value键值对形式的数据类型)
-
struct_type(结构数据类型)
-
union_type
常用命令
-
CREATE TABLE
格式
行数据格式化中可以灵活指定下面这些分隔符:
- 属性的分隔符(fields)
- 集合的分隔符(collection)
- map的分隔符(map key)
(......) row format delimited feilds terminated by ',' collection items terminated by '-' map keys terminated by ':'
-
LOAD
load data local inpath '/root/data' into table psn;
其中,'local’可加可不加,加了则指本地linux路径,不加则指hdfs的路径。
如果从本地路径load,其实是将文件复制一份到hive的hdfs目录中;而若是使用hdfs的路径,则会是将文件移动到hive的hdfs目录中。
这里涉及到一个HIVE的机制,HIVE是读时检查,而在写入的时候就进行检查的机制叫写时检查。
-
INSERT INTO … VALUES…
衍生用法:从其他表中查询数据插入到另一张表中
from psn insert overwrite table psn1 select id, name where ......
内、外部表
Hive默认情况下,创建的是内部表。
创建外部表需要用到’external’和’location’关键字。
create external table psn4
(
id int,
name string,
likes array<string>,
address map<string, string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/data'
内外部表的区别:
- 内部表创建的时候,数据存储在hive的默认目录中;
外部表创建时,需要指定’external’关键字,并且指定location(存储目录)
- 内部表在删除的时候,会将