#数据仓库基础核心知识
1、数据仓库是什么 为何而来?
为了分析数据而来 数据分析的平台
2、数据仓库的特性
3、数据仓库和数据库的区别
OLTP系统
OLAP系统
注意:这里要解决一个核心的误区:数仓绝不是大型数据库。 这么理解就凉凉
4、数据仓库的分层架构
根据数据流入流出特点 进行分层
5、ETL、ELT区别
#大数据最著名的数仓软件--Apache Hive
1、Hive是什么?
基于Hadoop的数仓 如何理解和Hadoop关系?
核心功能:
a、将结构化文件映射成为一张表(Table)
b、基于表提供了SQL分析能力 (Hive SQL HQL,类SQL)
本质:用户HQL--->Hive转换MR--->数据分析
2、Hive的架构组件
3、Hive的安装部署
metadata metastore区别
三种部署模式
课程使用远程模式部署安装
两代客户端使用
IDEA、PyCharm集成操作Hive
4、Hive的初体验
Hive的魅力是什么
数据仓库,中文简称数仓。英文叫做Data WareHouse,简称DW。
数据仓库是==面向分析的集成化数据平台,分析的结果给企业提供决策支持==;
数据仓库本身不生产数据;
其分析的数据来自于企业各种数据源。
企业中常见的数据源:
RDBMS关系型数据库--->业务数据
log file----->日志文件数据
爬虫数据
其他数据
数据仓库本身也不消费数据;
其分析的结果给外部各种数据应用(Data application)来使用。
Data visualization(DV)数据可视化
Data Report 数据报表
Data Mining(DM) 数据挖掘
Ad-Hoc 即席查询
即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。
企业中一般先有数据库,然后有数据仓库,可以没有数据仓库,但是不能没有数据库。
数据仓库不是大型的数据库,只是一个数据分析的平台。
面向主题性(Subject-Oriented)
主题(subject)是一个抽象的概念 数据综合体。一个分析的主题可以对应多个数据源。
在数仓中开展分析,首先确定分析的主题,然后基于主题寻找、采集跟主题相关的数据。
集成性(Integrated)
数仓不是生成数据的平台 其数据来自于各个不同的数据源
当我们确定主题之后 就需要把和主题相关的数据从各个数据源集成过来。
因为同一个主题的数据可能来自不同的数据源 它们之间会存在着差异(异构数据):字段同名不同意、单位不统一、编码不统一;
因此在集成的过程中需要进行ETL(Extract抽取 Transform转换 load加载)
不可更新性(Non-Volatile)
数仓上面的数据几乎没有修改操作,都是分析的操作。
数仓是分析数据规律的平台 不是创造数据规律的平台。
注意:改指的数据之间的规律不能修改。
当下发现有些时间也是需要修改的 数据校正。数据缓慢变化。
#当下所学的侧重于离线数据 分析的数据都是历史数据 过去的数据 t+1 t+7
#后面还会接触实时数仓 kafka+flink
时变性(Time-Variant)
数仓是一个持续维护建设的东西。
站在时间的角度,数仓的数据成批次变化更新。一天一分析(T+1) 一周一分析(T+7)
上述所讲的更多偏向于离线数仓,当下还有比较火的实时数仓。
本质的区别就是OLTP 和OLAP系统的区别
OLTP(On-Line Transaction Processing)
Transaction 事务 面向事务支持事务
OLTP系统注重的是数据安全、完整、响应效率。通常指的就是RDBMS关系型数据库。
#面向事务 支持事务
#RDBMS: MySQL ORACLE
#注意 不是NoSQL数据库 没有事务支持: Redis HBase
OLAP(On-Line Analytical Processing) 中文发音:欧莱普
Analytical 分析 面向分析支持分析
主要指的是数据仓库、数据集市(小型数据仓库):Apache Hive、Apache Impala
注意:在某些场合下,说ORACLE也是OLAP系统,如何理解?
如果把RDBMS只用作数据分析工作,就是OLAP系统。
数据仓库不是大型的数据库,也没有要取代数据库的目标,只是一个数据分析的平台。
数仓本身不生产数据也不消费数据,按照数据流入流出的特点,对平台进行分层
最基础最核心的3层架构,企业实际应用中,可以结合需要添加不同分层。
核心3层架构
ODS 操作型数据层、源数据层、临时存储层
其数据来自于各个不同的数据源 临时存储 和数据源解耦合 之间有差异 一般不直接用于分析
DW 数据仓库
其数据来自于ODS经过层层的ETL变成各种模型的数据 数据干净规则 统一
基于各种模型开展各种分析
企业中根据业务复杂度 继续在DW中继续划分子层。 存储大量的中间结果。其数据来自于ODS经过层层ETL得出 企业中可以根据需求在DW中继续分层。
DA 数据应用层
最终消费DW数据的各种应用。
分层好处
Hive是Facebook开源出来,后来贡献给力Apache .宗旨是:提高分析数据的能力降低分析数据的开发成本。
Hive是基于 Hadoop 的一个==数据仓库==工具,用于分析数据的。
为什么说Hive是基于Hadoop的呢?
#作为一款数据仓库软件,应该要具备哪些能力?
具备存储数据的能力
具备分析数据的能力
Hive作为数仓软件,当然具备上述两种能力?
#Hive使用Hadoop HDFS作为数据存储系统
#Hive使用Hadoop MapReduce来分析数据
基于此说Hive是基于Hadoop的数仓软件。
在此过程中,Hive做了什么?其最大的魅力在哪里?
可以将结构化的数据文件==映射为一张数据库表,并提供类 SQL 查询==功能。
结构化数据:具有schema约束的数据 便于程序解读解析
映射 y=2X+1 当x=1 y=3 映射表示的就是一种对应关系。
映射成为表之后 提供了类SQl查询分析功能。 SQL叫做声明式编程,程序员不用关系过程,利于数据分析。
客户端用户接口
所谓的客户端指的是给用户一种方式编写Hive SQL
目前常见的客户端:CLI(命令行接口 shell)、Web UI、JDBC|ODBC
Hive Driver驱动程序
hive的核心
完成从接受HQL到编译成为MR程序的过程。
sql解释 编译 校验 优化 制定计划
metadata
元数据存储。 描述性数据。
对于hive来说,元数据指的是表和文件之间的映射关系。
Hadoop
HDFS 存储文件
MapReduce 计算数据
YARN 程序运行的资源分配
Q:Hive是分布式的软件吗?
Hive不是分布式软件。只需要在一台机器上部署Hive服务即可;
Hive的分布式处理能力是借于Hadoop完成的。HDFS分布式存储 MapReduce分布式计算。
#Metadata 元数据
对于hive来说,元数据主要指的是表和文件之间的映射关系。
元数据也是数据,存储在哪里呢?Hive当下支持两种地方存储元数据。
1、存储在Hive内置的RDBSM中,Apache Derby(内存级别轻量级关系型数据库)
2、存储在外界第三方的RDBMS中,比如:MySQL。 企业中常用的方式。
#metastore 元数据访问服务
专门用于操作访问metadata的一种服务,对外暴露服务地址给各个不同的客户端使用访问Hive的元数据。
并且某种程度上保证了metadata的安全。
如何区别,关键在于两个问题?
具体来说
内嵌模式
1、元数据存储在内置的derby
2、不需要单独配置metastore 也不需要单独启动metastore服务
安装包解压即可使用。
适合测试体验。实际生产中没人用。适合单机单人使用。
本地模式
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。
2、不需要单独配置metastore 也不需要单独启动metastore服务
远程模式
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。
2、metastore服务单独配置 单独手动启动 全局唯一。
这样的话各个客户端只能通过这一个metastore服务访问Hive.
企业生产环境中使用的模式,支持多客户端远程并发操作访问Hive.
也是我们课程中使用的模式。
对比
metadata存储在哪 | metastore服务如何 | |
---|---|---|
内嵌模式 | Derby | 不需要配置启动 |
本地模式 | MySQL | 不需要配置启动 |
远程模式 | MySQL | 单独配置、单独启动 |
启动hive之前,需要保证Hadoop启动且服务正常可用。想一下,什么叫做可用?
1、等待安全模式结束启动Hive
2、在Hadoop中设置用户代理,注意3台机器都需要修改,重启生效
vim etc/hadoop/core-site.xml
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
主要考虑的就是MySQL Hive版本的兼容性 和jdbc驱动版本
在Centos7环境下如何安装MySQL
#apache-hive-3.1.2-bin.tar.gz
上传、解压
tar zxvf apache-hive-3.1.2-bin.tar.gz
cd /export/server/apache-hive-3.1.2-bin/
rm -rf lib/guava-19.0.jar
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh
vim hive-env.sh
export HADOOP_HOME=/export/server/hadoop-3.3.0
export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib
2、hive-site.xml
vim hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8value>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hadoopvalue>
property>
<property>
<name>hive.server2.thrift.bind.hostname>
<value>node1value>
property>
<property>
<name>hive.metastore.urisname>
<value>thrift://node1:9083value>
property>
<property>
<name>hive.metastore.event.db.notification.api.authname>
<value>falsevalue>
property>
configuration>
3、上传Mysql jdbc驱动到Hive安装包的Lib目录下
mysql-connector-java-5.1.32.jar
4、手动执行命令初始化Hive的元数据
cd /export/server/apache-hive-3.1.2-bin/
bin/schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
5、在hdfs创建hive存储目录
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
前台启动
#前台启动
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
#前台启动开启debug日志
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
#前台启动关闭方式 ctrl+c结束进程
后台挂起启动
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
#后台挂起启动 结束进程
使用jps查看进程 使用kill -9 杀死进程
#nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下
Hive的第一代客户端
bin/hive
直接访问metastore服务
配置
<configuration>
<property>
<name>hive.metastore.urisname>
<value>thrift://node1:9083value>
property>
configuration>
弊端:
第一代客户端属于shell脚本客户端 性能友好安全方面存在不足 Hive已经不推荐使用
官方建议使用第二代客户端beeline
Hive的第二代客户端
bin/beeline
无法访问metastore服务,只能够访问Hiveserver2服务。
使用
# 拷贝node1上 hive安装包到beeline客户端机器上(node3)
scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/
#1、在安装hive的服务器上 首先启动metastore服务 再启动hiveserver2服务
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
#2、在任意机器(如node3)上使用beeline客户端访问
[root@node3 ~]# /export/server/apache-hive-3.1.2-bin/bin/beeline
beeline> ! connect jdbc:hive2://node1:10000 #jdbc访问HS2服务
Connecting to jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root #用户名 要求具备HDFS读写权限
Enter password for jdbc:hive2://node1:10000: #密码可以没有
体验目标:在hive中如何才能够将一份结构化的数据文件 映射成为一张表 然后使用SQL分析?
--结构化文件
1,allen,18
2,james,24
3,anna,45
--在hive中建表
create table t_1(id int,name string,age int);
猜想1:只要在hive中创建表,那么在HDFS就会有一个文件夹与之对应。
难道把结构化文件放置在这个目录下,才能映射成功吗? 不一定
/user/hive/warehouse/itcast.db/t_1
hadoop fs -put 1.txt /user/hive/warehouse/itcast.db/t_1
猜想2:难道要指定分隔符? 不一定
create table t_1(id int,name string,age int);
create table t_2(id int,name string,age int) row format delimited fields terminated by ','; --指定分隔符为逗号
猜想3:建表的时候字段类型要不要和文件中数据保持一致? 一定要保持一致
如果不一致,hive会尝试进行转换,但是不保证成功,如果不成功显示null。
create table t_3(id int,name int,age string) row format delimited fields terminated by ',';
+---------+-----------+----------+--+
| t_3.id | t_3.name | t_3.age |
+---------+-----------+----------+--+
| 1 | NULL | 18 |
| 2 | NULL | 24 |
| 3 | NULL | 45 |
+---------+-----------+----------+--+
当我们映射成功之后,会如何?
就可以基于表写Hive SQL 开展数据分析,心里美滋滋。再也不用写MapReduce。
0: jdbc:hive2://node1:10000> select * from t_2 where age >18;
+---------+-----------+----------+--+
| t_2.id | t_2.name | t_2.age |
+---------+-----------+----------+--+
| 2 | james | 24 |
| 3 | anna | 45 |
+---------+-----------+----------+--+
2 rows selected (0.722 seconds)
0: jdbc:hive2://node1:10000>
0: jdbc:hive2://node1:10000> select count(*) from t_2 where age >18;
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
+-----+--+
| c0 |
+-----+--+
| 2 |
+-----+--+
1 row selected (67.76 seconds)