Hive知识点

Hive

Hive简介:

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能

本质:是将sql转换为mapreduce程序

主要用途:用来做离线数据分析,比直接用MapReduce开发效率更高

元数据存储在:mysql/derby这种关系型数据库

Hive和hadoop和MapReduce的关系:Hive利用HDFS存储数据,利用MapReduce查询分析数据。

Hive的metadata、metastore:

metadata:元数据

metastore(元数据服务):客户端连接metastore服务,metastore再去连接Mysql数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而这些客户端不需要知道Mysql数据库的用户名和密码,只需要连接metastore服务即可。

metastore三种配置方式:

  • 内嵌模式:

    使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastorefuw

  • 本地模式:

    采用外部数据库来存储元数据(mysql)

  • 远程模式:

    远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务,远程模式的metasore服务和hive运行在不同的进程里

HIve的内部表和外部表:

内部表(Internal table):称为被Hive拥有和管理的托管表,Hive拥有该表的结构和文件,当删除内部表时,它会删除数据以及表的元数据

create table student(
    num int,
    name string,
    sex string,
    age int,
    dept string) 
row format delimited 
fields terminated by ',';

外部表(External table):表中的数据不是Hive拥有或者管理的,只管理表元数据的生命周期,要创建一个外部表,需要使用External语法关键字,删除外部表只会删除元数据,而不会删除实际数据,在Hive外部仍然能访问实际数据,而且外部表更为方便的是可以搭配location语法指定数据的路径

create external table student_ext(
    num int,
    name string,
    sex string,
    age int,
    dept string)
row format delimited
fields terminated by ','
location '/stu';

Hive分区表和分通表:

分区表:

创建表语法:

create table table_name (column1 data_type,column2 data_type)partitioned by (partition1 data_type,partiton2 data_type...);

静态分区:分区的字段值是由用户在加载数据的时候手动指定的

静态插入:

load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou');
load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
load data local inpath '/root/hivedata/mage.txt' into table t_all_hero_part partition(role='fashi');
load data local inpath '/root/hivedata/support.txt' into table t_all_hero_part partition(role='fuzhu');
load data local inpath '/root/hivedata/tank.txt' into table t_all_hero_part partition(role='tanke');
load data local inpath '/root/hivedata/warrior.txt' into table t_all_hero_part partition(role='zhanshi');

动态分区:分区的字段值是基于查询结果自动推断出来的

动态插入:

insert into table t_all_hero_part_dynamic partition(role) select tmp.*,tmp.role_main from t_all_hero tmp;

多重分区表:

建表语句的时候Hive支持多个分区字段。

多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区,从HDFS的角度来看就是文件夹下继续划分子文件夹

分桶表:

--分桶表建表语句:
create [external] table [db_name.]table_name [(col_name data_type,...)] clustered by (col_name) into n buckets;

--into n buckets 代表分几桶

分桶的字段必须是表中已经存在的字段

分桶表的好处:

  • 基于分桶表查字段时,减少全表扫描
  • join时可以提高MR程序效率,减少笛卡尔乘积数量
  • 分桶表数据进行抽样

Hive数据压缩:

压缩分析:

首先说明MapReduce哪些过程可以设置压缩:需要分析处理的数据在进入map前可以压缩,然后解压处理,map处理完成后的输出可以压缩,这样可以减少网络i/o(reduce通常和map不在同一个节点上),reduce拷贝压缩的数据后进行解压,处理完成后可以压缩存储在hdfs上,以减少磁盘占用量

优点:

减少存储磁盘空间,降低单节点的磁盘Io

由于压缩后的数据占用的带宽更少,因此可以加快数据在Hadoop集群流动的速度,减少网络传输宽带

缺点:

需要花费额外的时间/cpu做压缩和解压计算

HIve数据存储格式:

列式存储和行式存储:

逻辑表中的数据,最终需要落到磁盘上,以文件的形式存储,有两种常见的存储形式,行存储和列存储

行式存储:

优点:

相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录

这种存储格式比较方便进行insert/update操作

缺点:

如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取,当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能

由于每一行中,列的数据类型不一致,导致不容易获取一个极高的压缩比,也就是空间利用率不高

列式存储:

优点:

查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询;

高效的压缩率,不仅节省存储空间也节省计算内存和CPU

任何列都可以作为索引

缺点:

insert/update很麻烦,不方便

不适合扫描小量数据

Hive支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)

Hive调优:

  • Fetch抓取机制:

    Hive中对某些情况的查询可以不必使用Mapreduce计算,例如:select * from employees;在这种情况下,HIve可以简单地读取employees对应的存储目录下的文件,然后输出查询结果到控制台

    在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce

  • mapreduce本地模式:

    mapreduce程序除了可以提交到yarn执行之外,还可以使用本地模拟环境运行,此时就不是通过分布式执行的程序,但是针对小文件小数据处理特别有效

    用户可以通过设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化

  • join查询优化

    • map join(大小表关联):

      MapJoin顾名思义,就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连
      接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用

    • Bucket-MapJoin(中小表关联):

      两个表join的时候,小表不足以放到内存中,但是又想用map side join这个时候就要用到bucket
      Map join。其方法是两个join表在join key上都做hash bucket,并且把你打算复制的那个(相对)
      小表的bucket数设置为大表的倍数。这样数据就会按照key join,做hash bucket。小表依然复制到
      所有节点,Map join的时候,小表的每一组bucket加载成hashtable,与对应的一个大表bucket做
      局部join,这样每次只需要加载部分hashtable就可以了。

    • SMB Join(大大表关联):

      大表对小表应该使用MapJoin来进行优化,但是如果是大表对大表,如果进行shuffle,那就非
      常可怕,第一个慢不用说,第二个容易出异常,此时就可以使用SMB Join来提高性能。SMB Join
      基于bucket-mapjoin的有序bucket,可实现在map端完成join操作,可以有效地减少或避免shuffle
      的数据量。SMB join的条件和Map join类似但又不同。

    • group by优化–map端聚合:

      默认情况下,当进行group by的时候,Map阶段同一Key数据分发给一个reduce,当一个key数据过大是就倾斜了,但并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果

    • MapReduce引擎并行度调整:

      maptask个数调整

      reducetask个数调整

    • 执行计划-explain

    • 并行执行机制

    • 严格模式

    • 推测执行机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值