1、Hive与HDFS
Hive中的数据库就是底层HDFS中的一个文件夹;
Hive中的表就是库名文件夹下的子文件夹;
Hive中的数据就是表文件夹下的文件;
Hive中的hql会转换为底层的MR来执行;
Hive默认库对应HDFS中的/usr/hive/warehouse;
2、Hive的元数据(默认是Derby,可以修改MySQL作为存储)
用来保存描述库、表、列的数据。默认存储在derby数据库中,可以修改为MySQL。
例如一些重要的表:
DBS:存储Hive数据库的相关信息,包括编号、名称、所有者、存储位置
TBLS:存储Hive数据库中表的相关信息,包括编号、所在数据库的的编号、所有者、表名称、表类型
COLUMN_V2:存储Hive数据库中表的具体列的信息,包括表的编号、列名称、列类型
SDS:存储Hive中表的存储位置,包括表的编号、存储位置
扩展:derby的问题:进入derby时,所处的目录不一致,会导致进入之后的数据不一致;只支持单用户操作
3、内部表(托管表)、外部表
内部表:创建表之后,将数据load到Hive的”仓库目录(warehouse directory)“中进行管理;删除表后,表中的数据即HDFS对应的文件也会被删除。
外部表:创建表时指明关键字external,表明该表是外部表,并且需要指定外部数据的位置(location ‘…’),在load数据时,不会将数据移动到”仓库目录(warehouse directory)“中,由于Hive在创建外部表时,不会检查外部位置是否存在,所以可以在建表之后再进行创建数据。;删除表后,只是将Hive维护的元数据删除,外部HDFS中的数据并不会被删除。
4、分区
Hive中也支持分区,分区的实现可以提高查询的效率,一般分区是按照某些特定字段实现。
原理:就是在表的文件夹下再创建分区对应的文件夹,文件夹的名称就是分区时指定的名称,存入数据时指定分区名即可达到分区存储的目的。查询时按照分区进行查询(where),而不是从整张表中查询,提高效率。
5、分桶
分桶的目的是获取更高效的查询,但最重要的是对数据进行“取样”时更高效。
划分桶时是对指定值进行哈希,并将结果除以桶的个数取余数,此操作会触发MR过程,分桶的结果是将表文件夹下的一个大文件划分成若干个小文件,注意:分桶一般不在原始表上直接进行。
6、Hive UDF(用户自定义函数)的步骤(简要说明)
1)导入Hive相关JAR包;
2)创建类继承UDF(Hive中的);
3)实现方法evaluate();
4)打JAR包,并在Hive中注册该JAR;
5)注册自定义函数。
7、Hive中的数据倾斜
一般来说数据倾斜是数据的key分化严重不均,造成一部分数据很多,一部分数据很少的局面,并且在处理时影响了业务。例如在处理时若数据很多的处理速度和数据很少的处理速度相差不大,则可以认为没有造成数据倾斜。
大致原因有以下几点:group by、join、distinct count(distinct xx);
解决办法:
1)调优参数:set hive.map.aggr=true;set hive.groupby.skewindata=true;
2)map side join;
3)将distinct与count拆分成两个select语句;
4)关闭推测执行。