hive的基础与入门
一、数据仓库基础理论
1.1 概念
- 数据仓库(Data Warehouse):简称数仓,是一个用于存储分析报告的数据系统。目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持。
- 联机事务处理OLTP:操作型处理,主要针对具体业务对少量记录进行查询修改,传统的关系型数据库(RDBMS)作为数据管理的主要手段。
- 联机分析处理OLAP:分析型处理,联机分析处理,主要是做数据分析,对某些主题的历史数据进行复杂的多维分析,支持管理决策,典型应用就是DW,即数据仓库。
1.2 Database和Datawarehouse的区别
- 数据仓库不是大型的数据库,虽然数据仓库存储数据规模大。
- 数据仓库的出现,并不是要取代数据库。
- 数据库是面向事务的设计,数据仓库是面向主题设计的。
- 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
- 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
1.3 数据仓库和数据集市
数据仓库是面向整个集团组织的数据,数据集市是面向单个部门使用的,可以认为数据及时是数据仓库的子集,或者是小型的数据仓库。数据集市通常只涉及一个主题领域,因为它们较小且更具体,所以他们通常更易于管理和维护,并具有更灵活的结构。
1.4 数据仓库分层架构
每个企业根据自己的业务需求可以分成不同的层次,但是最基础的分层思想,理论上分为三个层次:操作性数据层(ODS),数据仓库层(DW)和数据应用层(DA)。
1.4.1 ODS层(Operration Data Store)
操作型数据层,也称之为源数据层,数据引入层,数据暂存层,临时缓存层。此层存放未经过处理的原始数据至数据仓库系统,结构上与源数据保持一致,是数据仓库的数据准备区。主要工作是完成基础数据引入到数仓的职责,和数据源系统进行解耦合,同时记录基础数据的历史变化。
1.4.2 DW层(Data Warehouse)
数据仓库层。内部具体包括DIM维度表、DWD和DWS,由ODS层数据加工而成。主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。
公共维度层(DIM):基于维度建模理念思想,建立整个企业一致性维度。
公共汇总粒度事实层(DWS、DWB):以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。
明细粒度事实层(DWD): 将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。
1.4.3 数据应用层(DA或ADS)
面向最终用户,面向业务定制提供给产品和数据分析使用的数据。包括前端报表、分析图表、KPI、仪表盘、OLAP专题、数据挖掘等分析。
1.5 ETL和ELT
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程。但是在实际操作中将数据加载到仓库却产生了两种不同做法:ETL和ELT。
1.5.1 ETL
首先从数据源池中提取数据,这些数据源通常是事务性数据库。数据保存在临时暂存数据库中。然后执行转换操作,将数据结构化并转换为适合目标数据仓库系统的形式。然后将结构化数据加载到仓库中,以备分析。
1.5.2 ELT
使用ELT,数据在从源数据池中提取后立即加载。没有临时数据库,这意味着数据会立即加载到单一的集中存储库中。数据在数据仓库系统中进行转换,以便与商业智能工具和分析一起使用。大数据时代的数仓这个特点很明显。
二、入门
2.1 概述
Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
2.2 信息映射
元数据信息包括:表对应着哪个文件(位置信息),表的列对应着文件哪一个字段(顺序信息),文件字段之间的分隔符是什么。
2.3 hive组件
用户接口:包括 CLI、JDBC/ODBC、WebGUI。
元数据存储:通常是存储在关系数据库如 mysql/derby中。
Driver驱动程序:包括语法解析器、计划编译器、优化器、执行器,完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
执行引擎:Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。
2.4 Hive数据模型 (Data Model)
数据模型:用来描述数据、组织数据和对数据进行操作,是对现实世界数据特征的描述。Hive的数据模型类似于RDBMS库表结构,此外还有自己特有模型。
Hive中的数据可以在粒度级别上分为三类:Table 表,Partition分区,Bucket 分桶。
2.4.1 表
Hive有两种类型的表:Managed Table内部表、托管表,External Table外部表。建表时默认是内部表。
2.4.2 Partitions
Partition分区是hive的一种优化手段表。分区是指根据分区列(例如“日期day”)的值将表划分为不同分区。这样可以更快地对指定分区数据进行查询。
2.4.3 Buckets
Bucket分桶表是hive的一种优化手段表。分桶是指根据表中字段(例如“编号ID”)的值,经过hash计算规则将数据文件划分成指定的若干个小文件。
分桶规则:hashfunc(ID) % 桶个数,余数相同的分到同一个文件。
分桶的好处是可以优化join查询和方便抽样查询。
三、hive的安装部署
3.1 Metastore
MetaData是元数据,即描述数据的数据。Metastore是元数据服务,作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。
3.2 MetaStore三种配置方式
3.2.1 内嵌模式
内嵌模式(Embedded Metastore)是metastore默认部署模式。此种模式下,元数据存储在内置的Derby数据库,并且Derby数据库和metastore服务都嵌入在主HiveServer进程中,当启动HiveServer进程时,Derby和metastore都会启动。不需要额外起Metastore服务。但是一次只能支持一个活动用户,适用于测试体验,不适用于生产环境。
3.2.2 本地模式
本地模式(Local Metastore)下,Hive Metastore服务与主HiveServer进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式。缺点是:每启动一次hive服务,都内置启动.一个metastore。
3.2.3 远程模式
远程模式(Remote Metastore)下,Metastore服务在其自己的单独JVM上运行,而不在HiveServer的JVM中运行。在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。
3.3 远程模式安装部署
3.3.1 Mysql的安装
1. 安装Mysql。首先在Hadoop102虚拟机中输入命令:rpm -qa|grep mariadb
来查看Centos7自带mariadb,下面会显示该包的名称,然后输入命令:rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps
删除该包。(也可以再次使用rpm -qa|grep mariadb命令查看是否还存在这个包要不然会和mysql产生冲突)在 /opt/software/ 目录下输入命令:mkdir mysql-5.7.29
创建mysql文件夹,进入到该文件夹下,将mysql的压缩包上传上去,输入命令:tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
解压mysql。在安装之前先执行命令:yum -y install libaio
以及yum install -y perl-Module-Install.noarch
。然后再输入命令安装MySQL:rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm
。
2. 初始化并启动。安装好mysql以后,输入命令:mysqld --initialize
对mysql进行初始化。在启动mysql之前还要输入以下这个命令:chown mysql:mysql /var/lib/mysql -R
要不然启动时候会报错。下面开始启动mysql,输入命令:systemctl start mysqld.service
,没有报错的话就是启动成功了,也可以使用命令:systemctl status mysqld.service
来查看MySQL的启动状态。*
3. 修改密码并授权。下面开始修改mysql的密码。首先输入命令查看mysql自己生成的临时密码:cat /var/log/mysqld.log
,出来一大堆,反正你就找吧,就在前几行,找到 A temporary password is generated for root@localhost: )rqBLC:kM3;j
,那个冒号后面就是临时密码,然后输入命令:mysql -u root -p
,下面输入刚才找到的临时密码:)rqBLC:kM3;j
,成功进入后,输入命令:alter user user() identified by "111111";
将mysql的密码修改成六个一。接下来输入命令:use mysql
进入Mysql库,然后使用命令:grant all privileges on *.* to 'root'@'%' identified by '111111' with grant option;
授权root账户可以在任何主机上远程连接mysql,最后输入命令:flush privileges;
刷新完成后就可以exit退出了。
4. 常用命令及设置开机自启。mysql的启动关闭以及状态查看的命令是:systemctl start/stop/status mysqld
,建议呢将mysql设置为开机自启动服务,输入命令:systemctl enable mysqld
。
3.3.2 hive的安装
1. 环境准备。首先进入到hadoop102虚拟机中打开hadoop的 core-site.xml 文件,添加如下代码,设置好hadoop102后还要输入命令:xsync core-site.xml
,将该配置分发到其它节点上。
<!-- 整合hive --> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
2. 上传解压。将hive安装包上传到虚拟机中,输入命令:tar -zxvf apache-hive-3.1.2-bin.tar.gz
解压压缩包,然后输入命令:mv apache-hive-3.1.2-bin/ hive-3.1.2/
将该文件改名。
3. 解决hadoop、hive之间guava版本差异。进入到hive的lib依赖包目录下,输入命令:rm guava-19.0.jar
删除这个jar包,然后继续在当前目录下输入命令:cp /opt/software/hadoop-3.2.3/share/hadoop/common/lib/guava-27.0-jre.jar ./
将hadoop的包复制过来。
4. 环境配置。进入到 /etc/profile.d 目录下,在 my_env.sh 文件末尾添加如下代码,完成后保存退出后记得输入命令:source /etc/profile
使配置生效。
#HIVE_HOME export HIVE_HOME=/opt/software/hive-3.1.2 export PATH=$PATH:$HIVE_HOME/bin
5. hive的配置。继续在conf目录下输入命令:vi hive-site.xml
,添加如下代码后保存退出。
<configuration> <!-- 存储元数据mysql相关配置 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value> jdbc:mysql://hadoop102:3306/hive?useSSL=false</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>111111</value> </property> <!-- 指定hiveserver2连接的host --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop102</value> </property> <!-- 指定hiveserver2连接的端口号 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> <!-- 远程模式部署metastore 服务地址 --> <property> <name>hive.metastore.uris</name> <value>thrift://hadoop102:9083</value> </property> <!-- Hive默认在HDFS的工作目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>
6. 初始化metadata。进入到hive目录下,输入命令:bin/schematool -initSchema -dbType mysql -verbos
。如果成功的话会在mysql中创建74张表。
7. 启动hive及输出日志过滤。下面就可以开始启动hive了,但是在启动hive之前需要将metastore打开,进入到 /opt/software/hive-3.1.2 目录中,输入命令:nohup bin/hive --service metastore &
,这样可以将其放在后台上运行。打开metastore服务后,输入命令:bin/hive
打开hive,这个时候会发现输出很多的info信息很乱,进入hive的conf目录下,输入命令:vi log4j.properties
,来创建一个类似日志输出过滤这样的东西,添加代码如下,然后重新启动hive就发现输出的日志很清楚了。
log4j.rootLogger=WARN, CA log4j.appender.CA=org.apache.log4j.ConsoleAppender log4j.appender.CA.layout=org.apache.log4j.PatternLayout log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
四、Hive的客户端使用
4.1 Hive Client和Hive Beeline Client
第一代客户端(不推荐使用):$HIVE_HOME/bin/hive, 是一个 shellUtil。用于Hive相关服务的启动,比如metastore服务。
第二代客户端(推荐使用):$HIVE_HOME/bin/beeline,是一个JDBC客户端,和第一代客户端相比,性能加强安全性提高。
4.2 Hive服务和客户端关系
4.3 Hive Client使用
可以直接在启动Hive metastore服务的机器上使用bin/hive客户端操作,此时不需要进行任何配置。如果需要在其他机器上通过bin/hive访问hive metastore服务,只需要在该机器上下载好hive并且在hive-site.xml配置中添加metastore服务地址即可。
4.4 Hive Beeline Client使用
beeline客户端不是直接访问metastore服务的,在hive运行的服务器上,需要先启动metastore服务,然后启动hiveserver2服务。
# 启动命令 nohup /opt/software/hive-3.1.2/bin/hive --service metastore & nohup /opt/software/hive-3.1.2/bin/hive --service hiveserver2 & # 启动beeline客户端 /opt/software/hive-3.1.2/bin/beeline # 连接hive(需要输入用户名密码可以不必输) ! connect jdbc:hive2://hadoop102:10000
五、结构化数据映射表
在hive中创建表跟结构化文件映射,需要注意:
- 创建表时,字段顺序、字段类型要和文件中保持一致;
- 如果类型不一致,hive会尝试转换,但是不保证转换成功。不成功显示null;
- 建表的时候要根据文件内容指定分隔符;
- Hive底层是通过MapReduce执行引擎来处理数据的;
- hive更适合做大数据分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?