元数据--探查
1、元数据功能
保存了Hive中所有关键性的数据
- 存储了所有数据库、表、所有字段、分隔符等信息
- 存储了所有表与HDFS文件的映射的信息
2、元数据存储
存储位置
第一种:默认的存储位置:Hive自带的Derby数据库
- 存在问题:由于derby数据库以文件的形式存在,不能启动多个实例,真正在工作中不用derby来存储元数据
第二种:企业中实际的开发环境,都是将Hive元数据存储在关系型数据库中:常用MySQL
3、实现:将Hive元数据存储在MySQL
- step1:安装MySQL
- step2:修改Hive的配置,使用MySQL来存储元数据
- 先构建一个Hive的配置文件:hive-site.xml
tips:
Hive本身没有提供这个文件
Apache版本中提供了一个hive-default.xml
CDH版本什么都没有提供
将提供的hive-site.xml上传到hive的配置文件目录下
- 修改hive-site.xml文件,配置使用Mysql来存储元数据
参考官方,进行修改
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration
指定存储元数据的Mysql的地址 tips:value中的node-03为测试虚拟机
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node-03:3306/hivemetadata?createDatabaseIfNotExist=true</value>
</property>
指定连接Mysql的驱动
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
Mysql的用户名和密码 tips:value中的账号密码自己修改
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
- step3:将mysql的连接驱动包,放入Hive的lib目录
tips:我的路径为/export/servers/hive-1.1.0-cdh5.14.0/lib/
- step4:启动Hive
cd /export/servers/hive-1.1.0-cdh5.14.0/
bin/hive
- step5:测试
- 创建数据库
create database db_lianjia;
use db_lianjia;
- 创建表
create table tb_lianjia(
xiaoqu string,
huxing string,
area double,
region string,
floor string,
chaoxiang string,
tprice double,
sprice double,
nianfen string
) row format delimited fields terminated by ',';
- 关联数据
load data local inpath '/export/datas/2nd_house_price.csv' into table tb_lianjia;
- 测试查询
select xiaoqu,region,tprice,sprice from tb_lianjia limit 10;
select count(*) from tb_lianjia;
- 查看Mysql中是否创建了元数据的数据库
- 查看元数据
DBS:存储了Hive中所有的数据库
TBLS:存储了Hive中所有表的信息
SDS:记录了Hive中的表与HDFS文件的映射关系
4、HDFS与Hive之间的关联
Hive元数据映射了HDFS数据与Hive表之间的关系
- 存储关系:
- Hive作为数据仓库会对应HDFS中一个目录,这个目录是Hive数据仓库的目录
- 用于存储Hive中所有的数据库、表、数据
属性
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
查看配置的在hdfs上的仓库路径
- Hive中所有的数据库都对应HDFS数据仓库目录下的一个目录
- 所有表的目录都在对应的数据库目录下
- 表中数据文件都在对应的表的目录下
配置的仓库目录: /user/hive/warehouse
的作用:
- 作为Hive数仓的目录
下面放的是数据库的目录
- 也作为default数据库的目录
下面放的是default数据库中表的目录
如何区分这个目录下的目录是数据库还是表的目录呢?
- 如果是目录以.db结尾,说明这是一个数据库的目录
5、问题:如果我手动用HDFS命令,将一份数据放入表的目录中,表中能不能读到?
情况一:普通表
可以读到
- 因为在Hive的元数据中:数据的处理就是读取表的最后一级目录
- 普通表的最后一级目录就是表的目录,只要表的目录中有数据,就会在Hive中读取到
select * from table
select * from hdfs://node:8020/user/hive/warehouse/db/table
情况二:分区表
不能
由于这个分区目录是你自己建的,Hive中没有这个分区对应的元数据
select * from table
select * from 元数据中这张表对应的所有分区的目录
解决
- 第一种方案:修复表结构:根据HDFS中分区的情况,来反过来修复元数据
msck repair table tb_emp_part2;
- 第二种方案:手动构建这个元数据
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location']
alter table tb_emp_part2 add partition 'dept=40' location '/user/hive/warehouse/db_emp.db/tb_emp_part2/dept=40';
6、总结:
元数据的功能以及存储
- 功能:存储Hive 中关键性数据
- 存储了Hive中所有数据库、表的信息
DBS、TBLS
- 存储了Hive中表与HDFS的映射关系
SDS
- 存储了Hive中所有数据库、表的信息
存储方式
- 方式一:默认的方式,存储在Hive自带的Derby数据库【工作中是不用的】
- 方式二:远程连接Mysql实现元数据存储,工作中选用的方式
Hive与HDFS之间的存储关系
- Hive会在HDFS创建一个数据仓库的目录(配置文件中指定):
/user/hive/warehouse
- Hive中所有的数据库、表都会默认存储在这个目录下,同时也作为Hive中默认的数据库default数据库的目录
- 在Hive中创建一个数据库,就会自动在HDFS上创建一个对应的数据库目录
- 在Hive中创建一张表,就会自动在HDFS对应的数据库目录下创建对应的表的目录
- 在Hive中数据如果加载到表中,数据文件就会存储在表的目录下
- 关联的是一个HDFS文件:Hive会将这个文件移动到表的目录下(管理表)
- 关联的是一个本地文件:Hive 会将这个本地文件拷贝一份存储在HDFS表的目录下
- 结构:数据仓库/数据库目录/表的目录/数据文件
即 HiveWareHouse/Database/Table/Data