数据仓库 Hive
-
数据仓库
-
是什么?
集成化的数据分析平台
-
如何由来?
为了分析数据 分析的结果支持企业的决策
-
特点
本身不生产数据 也不消费数据 数据分析的平台
-
4个特性
-
面向主题性
主题是一个抽象概念 数据综合体 跟你分析的需求相关
-
集成性
确定分析的主题之后 寻找跟主题相关的各个数据源数据 经过抽取转化加载(ETL)最终把数据变成格式统一干净规整的数据 填充数据仓库的主题下面
-
非易失性
数仓是数据分析的平台 不是数据创造的平台 分析数据的规律 而不是修改创造数据的规律 数仓的数据都是已经产生的历史数据 已经是客观的事实
-
时变性
数仓的数据随着时间成周期性变化 分析的频率相关 一年一分析 一季度一分析 一天一分析
-
OLTP和OLAP区别
oltp t事务 联机事务处理 面向事务面向业务 也就是我们所说的关系型数据库(RDBMS):mysql oracle ;注意不是非关系型数据库(noSQL):redis mongodb olap a分析 联机分析处理 面向分析 也就是我们所说的数据仓库 Apache Hive 、Apache Impala
-
Q:数据仓库是大型数据库?Apache hive是用来取代mysql?
数仓绝不是为了取代数据库而出现 为了分析而出现 数据库必须要有 数仓根据公司是否需要开展分析而决定是否设定。
-
数据仓库的分层架构
因为数仓本身不生产数据不消费数据按照数据的流入流出进行分层
- ODS:临时存储层 一般不用于直接开展数据分析 该层的数据来自于各个不同数据源 之间可能会存在着差异
- DW:数据仓库层 也称之为细节层 其数据来自于ods层经过ETL而来。当中的数据呈现着主题的特性 格式一般都是统一规则干净清晰的
- DA数据应用层 最终消费使用数据 其数据来自于DW
-
为什么要数据仓库分层?好处是?
- 解耦合 分布执行 降低出问题的风险
- 用空间换时间 用多步换取最终使用的数据的高效性。
-
-
Apache Hive
-
如何理解hive是基于hadoop的数仓?
- 数据存储的能力 ---->Hadoop HDFS
- 数据分析的能力----->Hadoop MapReduce
把一份结构化的数据映射成为一张表 提供了用户编写sql hive转换成为mr处理数据的能力。
-
hive的安装部署
-
metadata metastore
- metadata 元数据 解释性数据 hive元数据指描述表和文件的之间映射关系的数据
- metastore 元数据服务 提供了一个统一的服务接口 便于各个客户端通过metastore访问元数据
-
metastore的三种部署模式
-
内嵌模式
- 特点: 使用内置的derby来存储元数据 元数据metastore不需要配置和启动
- 使用简单:bin/hive 启动使用
- 缺点:元数据无法共享 跟启动路径相关
-
本地模式
-
特点:使用第三方数据库如mysql俩存储元数据 metastore服务不需要单独配置启动
每启动一个hive的服务 都会内置一个metastore服务
-
配置:
根据 hive.metastore.uris 的值是否为空来判断是否为本地模式
-
大前提:必须安装好mysql 确保mysql正常启动运行 并且具备访问的权限
第一步:安装mysql依赖 yum install mysql mysql-server mysql-devel 第二步:初始化mysql 设置root的密码 权限 /etc/init.d/mysqld start --首次启动mysql mysql --进入mysql命令行 mysql>; USE mysql; --切换mysql数据库 mysql>; UPDATE user SET Password=PASSWORD('hadoop') WHERE user='root'; mysql>; FLUSH PRIVILEGES; --设置mysql root密码 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; --授予root用户权限 mysql>; FLUSH PRIVILEGES; --刷新权限 第三步: service mysqld start|stop 单次启动关闭mysql chkconfig mysqld on 设置为开机自启动
-
hive的本地模式具体配置
第一个配置文件: hive-env.sh export HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0 第二个配置文件: vim hive-site.xml <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node-1: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>hadoop</value> </property> </configuration> 第三步:把mysql jdbc驱动包放入hive安装包lib文件夹下
-
弊端:
- 每个客户端都需要知道mysql的密码
- 每启动一个hive服务 都会内置一个metastore服务 浪费资源
-
-
远程模式(推荐)
-
特点:使用第三方mysql来存储元数据 需要单独配置启动metastore服务。
-
配置:在本地模式的基础上添加一个参数
hive.metastore.uris <property> <name>hive.metastore.uris</name> <value>thrift://node-1:9083</value> </property>
-
启动:必须首先手动单独启动metastore服务 再使用hive客户端进行连接
bin/hive --service metastore
-
使用:
可以在任何一台机器上 使用bin/hive进行连接 只需要指定metastore地址就可以了。
-
-
-
hive的第一代客户端和第二代客户端
-
第一代 bin/hive 反对 过时 不赞成使用 还可以偷偷使用
-
第二代 bin/beeline 需要配合hiveserve2服务使用 不直接使用metastore
-
配置:hive-site.xml
<property> <name>hive.server2.thrift.bind.host</name> <value>node-1</value> </property>
-
启动顺序
先启动hadoop 然后启动mysql
启动metastore服务 最后启动hiveserver2服务。
最后使用beeline客户端进行连接。
-
前台启动
/export/servers/hive/bin/hive --service metastore /export/servers/hive/bin/hive --service hiveserver2
-
后台启动
nohup command & 把命令挂起后台执行 nohup /export/servers/hive/bin/hive --service metastore & nohup /export/servers/hive/bin/hive --service hiveserver2 &
-
-
-
-
-
如何把hdfs上的一个结构化数据文件 映射成为hive的一张表?
-
文件的路径好像有规律 难道要把结构化数据放置在这个路径下? 不一定 外部表指定文件路径
数据库.表 ------->/user/hive/warehouse/数据库名.db/表名
-
建表的字段顺序和类型一定要和文件一致。一定
create table t_3(id int,name int,age string) row format delimited fields terminated by ",";
如果类型不一致 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 ",";
-
Hive DDl
-
数据类型
- 要求:字段的类型和顺序要和结构化文件保持一致 hive会尝试转换 不保证转换成功 如果成功就显示 如果失败就显示null
- hive除了支持sql类型 还支持java类型 大小写不敏感
- hive除了支持基本类型 还支持复合类型(map array) 针对复合类型要跟分隔符指定有关
-
hive读取数据映射的机制
- 首先调用Inputformat进行读取数据,默认TextInputFormat(一行一行读)
- 然后调用SerDe类进行数据切割,默认LazySimpleSerDe根据指定分隔符进行数据切割
-
分隔符的指定
-
语法格式
ROW FORMAT DELIMITED|SERDE ROW FORMAT:表明开始指定分隔符 如果不写 使用默认的分隔符来切割 DELIMITED:使用内置默认的类来进行数据切割 默认LazySimpleSerDe SERDE:表示使用其他的类来进行数据的切割
[FIELDS TERMINATED BY char] 指定字段之间的分隔符 [COLLECTION ITEMS TERMINATED BY char] 指定集合元素之间分隔符 [MAP KEYS TERMINATED BY char] 指定map kv之间的分隔符 [LINES TERMINATED BY char] | 指定换行符\r\n
-
默认分割符
- 不可见分隔符
- 代码层面 \001
- vim编辑器 Ctrl+v 然后 Ctrl+a
- 如果建表的时候没有指定分隔符 此时数据文件中恰好也是默认分隔符 不指定也可以映射成功
-
-
hive内部表、外部表
-
内部表:表对应的结构化数据文件位置 都位于hive指定默认的路径下
hdfs://node-1:8020/user/hive/warehouse/数据库名.db/表名
-
外部表:表对应的结构化数据文件位置 可以位于hdfs任意路径 需要location指定清楚
-
语法:
内部表 create table student(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 ',' location '/stu';
-
区别
- 内部表在删除drop表的时候 hive中表的信息连同hdfs的数据一起被删除
- 外部表在删除drop表的时候 只删除hive中定义表的信息 hdfs文件不会被删除
-
-
分区表
-
概念的引入
在涉及查询操作的时候 如果表对应的文件有多个 需要进行全表扫描 性能不高 如何优化?
-
分区表的创建
create table t_user_p (id int, name string,country string) row format delimited fields terminated by "," partitioned by (country string); --错误 --语法树上面的语句 是有顺序的 按照语法树的顺序编写 create table t_user_p (id int, name string,country string) partitioned by (country string) row format delimited fields terminated by ","; --报错 --分区的字段不能是表中已经存在的字段 create table t_user_p (id int, name string,country string) partitioned by (guojia string) row format delimited fields terminated by ",";
-
分区表的数据加载
--猜想加载数据的方式 hadoop fs -put china.txt /user/hive/warehouse/itcast.db/t_user_p --没有结果 错误 -- 使用load 命令进行数据加载 加载的时候指定分区的信息 load data local inpath '/root/hivedata/china.txt' into table t_user_p partition(guojia='zhongguo'); load data local inpath '/root/hivedata/usa.txt' into table t_user_p partition(guojia='meiguo');
-
分区表的使用
--不使用分区查询 select * from t_user_p where country = "china"; --全表的扫描 --使用分区查询 select * from t_user_p where guojia = "zhongguo"; --查询指定的分区 减少全表的扫描
-
分区表的注意事项
-
分区表是一种优化表 不是必须创建的表 优化了查询时候全表扫描的数据量
-
分区的字段不能是表中已经存在的字段。分区字段是一个虚拟的字段 最终也会显示查询结果上
如果和表中的字段重复 就会产生歧义。
-
分区的字段是一个虚拟的字段 其值不位于文件中 来自于加载数据的指定
-
分区表最终显示格式就是在表的文件夹下面以子文件夹的形式存在
-
企业中,常见的分区字段
地域:国家 省 市 时间:年 月 日
-
-
-
分桶表(分簇表)
-
语法格式
语法:clustered by xxx into N buckets 从字面理解:根据xxx分成几个桶 通俗解释:把数据文件根据某个字段分为几个部分。 cluster:群 从 簇 bucket :桶 根据谁分? clustered by xxx xxx就是分的字段 分成几个部分? N buckets N就表示分成几个部分 如何分? 如果xxx字段是字符串类型 xxx.hashcode % N 余数为几就去哪个部分 如果xxx字段是数值类型 xxx % N 余数为几就去哪个部分
-
分桶表的创建
create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string) clustered by(Sno) into 4 buckets row format delimited fields terminated by ',';
-
分桶表的数据加载
--猜想方式1 直接put hadoop fs -put students.txt /user/hive/warehouse/itcast.db/stu_buck --错误 文件没分开 --猜想方式2 load load data local inpath '/root/hivedata/students.txt' into table stu_buck cluster(Sno); --报错 语法根本就不支持 --真正导入分桶表数据的方式 间接导入 set hive.enforce.bucketing = true; --开启分桶的功能 set mapreduce.job.reduces=4; --指定分桶的个数 和建表的时候保持一致 --1、创建一个临时的普通表 create table student(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ','; --2、把结构化的数据文件加载到临时普通表中 hadoop fs -put students.txt /user/hive/warehouse/itcast.db/student --3、通过分桶查询把数据插入分桶表中 insert+select insert overwrite table stu_buck select * from student cluster by(Sno);
-
分桶表的使用
直接和正常表使用一样 只不过底层文件被分开了
-
分桶表的总结
- 最大的意义:优化join查询的时候笛卡尔积的数量 优化表
- 分桶表是一种优化的表 建表的时候可选
- 分桶的字段必须是表中已经存在的字段
- 分桶的功能默认没有开启的 需要手动设置开启
- 分桶的最终形式来看 就是原来完整的文件被按照规则分成了若干个部分
-