#1、数据仓库基础知识
数仓是什么 数据分析的平台 面向分析
数仓由何而来
数仓核心特性
数仓和数据库区别
解决一个核心的误区:数仓绝不是大型数据库。~~~ 凉凉
OLTP T 事务
OLAP A 分析
数仓的分层架构
#2、当下大数据领域最著名的数仓软件 Apache Hive
Hive是什么 数仓
基于Hadoop的数仓 如何理解和Hadoop关系
核心功能:
1、将结构化文件映射成为一张表(Table)
2、基于表提供了SQL分析能力 (Hive SQL HQL,类SQL)
本质:用户HQL--->Hive转换MR--->数据分析
Hive架构组件
Hive搭建安装
不是分布式软件 分布式能力基于Hadoop实现
metastore metadata
远程模式部署安装
客户端使用 IDEA中使用
#3、 HQL--DDL--Create Table
DDL 数据定义语言 表结构信息
建表语句及其重要 占比99.9999%
检测数仓。英文叫做Data WareHouse,简称DW。
是一个集成化的数据分析平台,面向分析,开展分析。分析结果给企业提供决策支撑。
数仓本身不生产数据
其数据来自于各种数据源
RDBMS关系型数据库--->业务数据
log file----->日志文件数据
爬虫数据
其他数据
数仓本身也不消费数据
其分析的结果给外部各种数据应用(Data application)来使用。
Data visualization(DV)数据可视化
Data Report 数据报表
Data Mining(DM) 数据挖掘
Ad-Hoc 即席查询:
即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。
面向主题性
分析主题 主题是一个抽象概念 分析数据的综合体
一个分析的主题可以对应多个数据源
集成性
数仓本身不产生数据 其分析的主题数据来自于各个不同的数据源 需要集成到数仓主题下面。
因为主题的数据来自于不同的数据源 可能会存在差异 数据源之间不同的结构
集成到主题下面的要保证数据格式是干净规整统一的结构化数据。
需要持续的动作 :ETL(抽取 Extra, 转化 Transfer, 装载 Load)
非易失性(不可更新性)
数仓上面的数据几乎没有修改操作,都是分析的操作。
数仓是分析数据规律的平台 不是创造数据规律的平台。
指的数据之间的规律不能修改。
当下发现有些时间也是需要修改的 数据校正。数据缓慢变化。
#当下所学的侧重于离线数据 分析的数据都是历史数据 过去的数据 t+1 t+7
#后面还会接触实时数仓 kafka+flink
时变性
数仓中主题数据站在时间的维度会明显成批次变化。
一天一分析 一周一分析 批次分析Batch
batch(天 月 离线)---> batch(秒 spark Streaming 微批处理)--->Stream(毫秒 flink storm)
本质就是OLTP、OLAP系统之间的区别。
OLTP:On-Line Transaction Processing 联机事务处理。
OLTP系统注重的是数据安全、完整、响应效率。通常指的就是RDBMS关系型数据库。
#面向事务 支持事务
#RDBMS: MySQL ORACLE
#注意 不是NoSQL数据库 没有事务支持: Redis HBase
OLAP:On-Line Analytical Processing 联机分析处理。 中文发音:欧莱普
OLAP系统注重的数据分析。主要指的是数据仓库、数据集市(小型数仓)、面向分析数据库、面向分析的软件
#面向分析 支持分析
#数据仓库:Apache Hive 、Apache impala、Apache Kylin
结论
数据仓库绝不是大型数据库,即使外表与语法跟数据库很类似。
数据仓库也没有要取代数据库的职责,主要用于数据分析领域 而不是事务领域。
根据数仓数据的流入流出
最基本、最经典的3层架构 企业实际中根据需求构建其他层
具体:
ODS 源数据层 操作型数据存储层
把各个数据源数据拉取过来存储 解耦 临时存储 数据之间一般差异较大 不用于直接分析
DW 数仓层 核心
其数据来自于ODS经过层层的ETL变成各种模型的数据 数据干净规则 统一
基于各种模型开展各种分析
企业中根据业务复杂度 继续在DW中继续划分子层。 存储大量的中间结果。
DA 数据应用层
最终消费数仓的数据的。
数据报表 数据挖掘
解耦合
空间换时间 提高最终应用层使用数据的效率
Hive 是基于Hadoop 的一个数据仓库工具,来自于Facebook开源贡献出来。是面向分析的工具。
为什么数是基于Hadoop?
#一款合格的数仓软件应该具备什么?
1、具备存储数据的能力?
2、具备数据分析的能力?
hive作为数仓软件,当然也具备上述功能,只不过基于Hadoop实现的。
1、数据存储--->Hadoop HDFS
2、数据分析、计算--->Hadoop MapReduce
#基于上述原因,说Hive是基于Hadoop的。
在此过程中,Hive做了什么?其最大的魅力在哪里?
将结构化的数据文件 映射 为一张数据库表
#什么叫做映射
映射指的就是一种对应关系。y=2x+1
结构化文件 <---映射---> 表
并提供类 SQL 查询功能 让用户编写SQL实现数据分析。
Hive SQL--->MapReduce--->数据分析
用户接口
提供一种方式给用户写HQL。
包括CLI、JDBC、WebUI
Hive Driver驱动服务
hive的核心
完成从接受HQL到编译成为MR程序的过程。
sql解释 编译 校验 优化 制定计划
元数据存储
元数据指的是描述性数据 记录数据的数据。
在hive中,元数据指的是表和结构化文件之间的各种映射关系。基于这种关系才能正确的操作文件。
元数据通常保存在RDBMS中。
Hadoop组件
执行引擎
默认使用MapReduce来处理的,现在还支持其他引擎,比如Tez、Spark.
存储组件
HDFS、HBase
结论:Hive本身不是分布式的软件,只需要单机部署即可,但是具备分布式的能力。
分布式存储和分布式计算的能力是依托Hadoop实现的。
Hive专职与sql转MR的过程。
从外表、形式模型、语法各层面上看 ,hive和数据库(Mysql)很类似。
底层应用场景是完全不一样的。
hive属于olap系统 是面向分析的侧重于数据分析(select)
数据库属于oltp系统 是面向事务的 侧重于数据时间交互(CRUD)
Hive绝不是大型数据库 也不是为了要取代MySQL这样的数据库。
前置知识:元数据相关的
metadata 元数据
指的是元数据,hive中指的是表和文件之间的映射关系。
元数据存储在rdbms中,主要有两种
1、使用Hive内置的Apache derby(内存轻量级RDBSM low)
2、使用外置第三方的 MySQL
metastore 元数据服务
访问Hive元数据的服务 某种程度上保证了metadata的安全。
Hive的3种部署模式和上述的两个概念有关。
metadata存储在哪里?
metastore服务是否需要单独配置,单独启动?还是集成在Hive驱动中一起启动。
区别:
1、metadata存储在哪里?
2、metastore服务是否需要单独配置,单独启动?还是集成在Hive驱动中一起启动。
内嵌模式
1、使用内置Derby存储元数据
2、metastore集成在Hive中 不需要单独配置 不需要单独启动
适合体验场景。
本地模式
1、使用MySQL来存储元数据。
2、metastore集成在Hive中 不需要单独配置 不需要单独启动
适合测试场景。
远程模式
#1、使用MySQL来存储元数据。
#2、metastore单独配置 单独启动 全局唯一。
hive.metastore.uris
thrift://node1:9083
适合生产环境。
本课程中使用远程模式部署安装,真实使用环境。
服务器基础环境
依赖Hadoop、MySQL。保证服务启动且可用。
HDFS安全模式等待结束。
MySQL的权限。
step1:修改Hadoop配置core-site.xml 设置hive代理用户。 3台机器都需要修改,重启生效。
hadoop.proxyuser.root.hosts
*
hadoop.proxyuser.root.groups
*
step2:上传Hive安装包 解压 重命名(只需要在node1安装即可)
step3:修改hive的配置文件
hive-env.sh
export HADOOP_HOME=/export/server/hadoop-2.7.5
export HIVE_CONF_DIR=/export/server/hive/conf
export HIVE_AUX_JARS_PATH=/export/server/hive/lib
hive-site.xml
javax.jdo.option.ConnectionURL
jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&useSSL=false
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
hadoop
hive.server2.thrift.bind.host
node1
hive.metastore.uris
thrift://node1:9083
hive.metastore.event.db.notification.api.auth
false
hive.metastore.schema.verification
false
step4:添加mysql驱动和hive-jdbc-2.1.0-standalone.jar 到hive中
mysql驱动
mysql-connector-java-5.1.32.jar
jdbc-standalong.jar
cp /export/server/hive/jdbc/hive-jdbc-2.1.0-standalone.jar /export/server/hive/lib/
step5:手动初始化metastore
cd /export/server/hive/
bin/schematool -dbType mysql -initSchema
step6:启动metastore服务
前台启动
/export/server/hive/bin/hive --service metastore
#关闭方式ctrl+c 结束metastore服务
后台挂起启动
nohup /export/server/hive/bin/hive --service metastore &
#nohup命令,在默认情况下(非重定向时),会输出一个名叫nohup.out 的文件到当前目录下
#关闭使用jps查看进程 Runjar 配合kill -9
Hive发展至今,存在着两代版本的命令行客户端。
第一代是属于shell客户端 bin/hive
第二代是属于jdbc客户端 bin/beeline
命令:bin/hive
需要访问:metastore服务
配置
hive.metastore.uris
thrift://node1:9083
演示:为了模拟企业环境 scphive安装包到node3机器上。
hive 服务(node1) <------------ hive客户端
命令:bin/beeline
需要访问:hiveserver2服务(需要访问的是metastore服务)
客户端不需要任何配置 在服务器需要添加参数
hive.server2.thrift.bind.host
node1
启动服务
nohup /export/server/hive/bin/hive --service metastore &
nohup /export/server/hive/bin/hive --service hiveserver2 &
beeline可以连接
/export/server/hive/bin/beeline
beeline> ! connect jdbc:hive2://node1:10000 #JDBC地址
Connecting to jdbc:hive2://node1:10000
Enter username for jdbc:hive2://node1:10000: root #用户名 需要具备在HDFS操作权限
Enter password for jdbc:hive2://node1:10000: #密码 可以为空
Driver: Hive JDBC (version 2.1.0)
21/06/01 16:44:36 [main]: WARN jdbc.HiveConnection: Request to set autoCommit to false; Hive does not support autoCommit=false.
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node1:10000>
Hive体验
目的:如何才能在Hive中创建一张表并且成功映射一份结构化的数据文件。
猜想1:表字段顺序、个数、类型要和文件一致吗? 必须一致。
如果不一致,Hive会尝试进行类型转换,但是不保证转换成功,如果成功显示内容,不成功显示null.
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 ',';
create table t_3(id string,name int,age int) row format delimited fields terminated by ','; --类型和文件不一样
猜想2:文件位置放置在HDFS哪里? 放在对应的目录下? 一定要放在这里吗? 不一定
#在hive中创建的表 默认在HDFS有与之对应的目录
/user/hive/warehouse/数据库名.db/表名
猜想3:必须要指定文件的分隔符? 不一定。
为什么 要追求建表的时候映射成功文件?
因为映射成功才有表 ,表才有数据,有数据才可以写sql进行分析。
没有表,表没有数据,分析个锤子。
功能:忽略表已经存在的异常。
0: jdbc:hive2://node1:10000> create table t_2(id int,name string,age int) row format delimited fields terminated by ',';
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. AlreadyExistsException(message:Table t_2 already exists) (state=08S01,code=1)
0: jdbc:hive2://node1:10000> creaeadaa table t_2(id int,name string,age int) row format delimited fields terminated by ',';
Error: Error while compiling statement: FAILED: ParseException line 1:0 cannot recognize input near 'creaeadaa' 'table' 't_2' (state=42000,code=40000)
--Error while processing statement 执行期间的错误 执行逻辑问题 sql本身没问题
--Error while compiling statement 编译期间的错误 SQL语法问题 关键字 功能是否支持 语法顺序
除了支持SQL类似之外,还支持Java数据类型。
Hive中大小写不敏感。
Hive除了支持基本数据类型之外,还支持复杂(复合)数据类型。比如:Array数组、Map映射。
针对复合数据类型,在建表的时候必须配合分隔符指定语法才可以正确解析。
Hive的数据类型转换
默认隐式转换 虽然可以自动转换一些类型 但是最好自己根据数据确定准确的类型。避免转换失败。
用户显示转换 cast(类型 as 新类型)
背景:Hive究竟如何读写HDFS上面的文件。
HDFS files --> InputFileFormat --> --> Deserializer --> Row object
Row object --> Serializer --> --> OutputFileFormat --> HDFS files
#读文件流程 映射文件流程
1、通过InputFormat类读取文件 默认实现TextInputFormat
一行一行的读取数据
2、然后通过SerDe类进行反序列化 默认实现LazySimpleSerDe
在反序列化的时候 需要指定分隔符切割数据 对应上表的字段
#写文件流程
Row object --> Serializer --> --> OutputFileFormat --> HDFS files
语法
row format delimited | serde serde_name
--row format 表明开始指定分隔符
--delimited 使用默认SerDe类进行序列化(LazySimpleSerDe)
--serde serde_name 指定使用其他的SerDe类进行序列化 比如JsonSerDe
delimited 子语法
[fields terminated by char] --指定字段之间的分隔符
[collection items terminated by char] --指定集合元素之间的分隔符
[map keys terminated by char] --指定map类型数据key value之间的分隔符
[lines terminated by char] --指定换行符
栗子
--Array类型数据分别使用String和Array来建表 如何?
--以Array映射文件
create table t_array(name string,work_locations array) row format
delimited fields terminated by '\t' collection items terminated by ',';
+---------------+----------------------------------------------+--+
| t_array.name | t_array.work_locations |
+---------------+----------------------------------------------+--+
| zhangsan | ["beijing","shanghai","tianjin","hangzhou"] |
| wangwu | ["shanghai","chengdu","wuhan","haerbin"] |
+---------------+----------------------------------------------+--+
--以string映射文件
create table t_string(name string,work_locations string) row format
delimited fields terminated by '\t';
+----------------+------------------------------------+--+
| t_string.name | t_string.work_locations |
+----------------+------------------------------------+--+
| zhangsan | beijing,shanghai,tianjin,hangzhou |
| wangwu | shanghai,chengdu,wuhan,haerbin |
+----------------+------------------------------------+--+
--需求:查询每个用户的第二个工作城市
select split(work_locations,",")[1] from t_string;
select work_locations[1] from t_array;
在建表的时候,如果不写row format语法,此时采用默认分隔符对数据字段进行切割
如果此时文件中的分隔符也是默认分隔符 就可以实现不指定分隔符也可以建表成功。
默认分隔符是不可见分隔符,代码\001
在vim编辑器中如何输入:连续输入ctrl+v ,ctrl+a
在企业中,如何涉及到数据清洗处理,有意识使用\001进行数据分割 便于入库分析。
public String toString() {
return upFlow+"\001"+downFlow+"\001"+sumFlow;
}
区别:
1、建表的时候是否有external关键字,如果有就是外部表,如果没有就是内部表。
2、在drop删除表的时候
删除内部表,hive表的信息(元数据)和HDFS上映射的文件都被删除
因为内部表,hdfs上文件也被hive控制,所以也叫做受控表 manage table.
删除外部表,只删除hive的表信息。
栗子
--内部表
create table student_inner(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',';
--建外部表
create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',';
选择使用外部表,在某种程度上,保证了HDFS上数据安全。
功能:指定Hive表映射的文件在HDFS上存储的路径
默认路径:/user/hive/warehouse/数据库名.db/表名
可以使用location指定在hdfs任意路径
--在HDFS的/stu目录下 有一个结构化的数据文件 建表映射它
create external table student_location(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',' location '/stu';
建议使用同一的目录来管理hdfs数据。有规律便于管理。