Hive知识归纳

作者: code_solve | 来源:发表于2018-06-03 14:01 被阅读41次

Hive是什么?

概念

  •    从概念上讲:由Facebook开源的一款基于hadoop的用于统计海量结构化数据的一个数据仓库。
  •   从本质上讲:将HQL语句转换成MapReduce程序的一个工具。

产生:

  • 让了方便非java开发人员对hdfs上的数据做 MapReduce 操作

架构

  1. 从客户端编辑 sql 语句提交到服务端,通过解释器,编译器,优化器生成执行计划,然后提交到 Hadoop 集群运行

其中计划执行的最小单元是一个个 operator,每个operator代表一个操作或者一个MR作业

  1. Hive的元数据依赖于关系型数据库,其真实数据是存在于Hadoop之上的

  2. 下图为 Hive 架构简图,其中 Hadoop 展示的是 1.x 版本的,2.x 以后是提交到 yarn上运行。


    image.png

支持的数据类型

  1. 复杂类型
    | array_type
    | map_type
    | struct_type
  2. 简单类型
    |TINYINT
    | SMALLINT
    | INT
    | BIGINT
    | BOOLEAN
    | FLOAT
    | DOUBLE
    | STRING

表的类型

  1. 外部表:删除表时,只会删除元数据信息,而不对真实数据进行修改
  2. 内部表:也叫管理表,删除表时,会对元数据和真实数据一起删除。

HIve分区

  • 意义
  1. 其意义主要在于优化查询,对于分区表,我们一般都要求使用分区字段进行过滤,以加快查询速度
  • 静态分区使用
  1. 建表是指定分区(其中分区在hdfs上表现为文件夹分类管理形式)

create table day_hour_table (id int, content string) partitioned by (dt string, hour string);

  1. 在已有的表上添加分区

ALTER TABLE table_name ADD PARTITION (dt='2018-06-02', hour='18')

  1. 在已有表上删除某分区

ALTER TABLE table_name DROP PARTITION (dt='2018-06-02', hour='18')

  1. 向分区表中添加数据:

LOAD DATA INPATH "/testFile" INTO TABLE table_name PARTITION(dt='2018-06-02', hour='18')

  • 动态分区
  1. 开启支持动态分区

set hive.exec.dynamic.partition=true;
默认:false

set hive.exec.dynamic.partition.mode=nostrict;
默认:strict(至少有一个分区列是静态分区)

  1. 相关参数

set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)

  1. 加载数据

from table_name1
insert overwrite table table_name2 partition(age, sex)
select id, name, age, sex, address distribute by age, sex;

hive 分桶

  • 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
    对于hive中每一个表、分区都可以进一步进行分桶。
    由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。

  • 适用场景:
    数据抽样( sampling )、map-join

  1. 开启支持分桶

set hive.enforce.bucketing=true;
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致。

  1. 创建分桶表

CREATE TABLE tb_name( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

  1. 加载数据:

insert into table tb_name select id, name, age from source_tb_name;

  1. 抽样

select id, name, age from tb_name tablesample(bucket 2 out of 2 on age);
共抽取2(4/2)个bucket的数据,抽取第2、第4(2+2)个bucket的数据

Beeline 和 HIveServer2

  • beeline 要与 HIveServer2 配合使用
  • 服务端启动 HIveServer2
  • 客户端可以通过beeline -u jdbc:hive2://hostname:10000/db_name -n username 进行hive的连接
  • 这里HiveServer2的另外一个功能,就是提供给开发者一个jdbc的开发接口

Hive 函数

  • UDTF:一进多出函数,对于某个数据经过函数会产生多条记录,eg: explode
  • UDF:一进一出函数,对于一个数据经过函数处理,还是一条数据 eg: to_date
  • UDAF:多进一出函数,多条数据经过函数处理会聚合成一条数据 eg: count
  • 这块内容其实挺多的,还包括DDL,DML等,但是官网都有详细的文档,这里再赘述也就没什么意义了,

Hive 索引

  • 目的:优化查询以及检索性能
  1. 创建索引:

create index t1_index on table tb_name1(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild
in table t1_index_table;
as:指定索引器;
in table:指定索引表,若不指定默认生成在default__psn2_t1_index__表中

  1. 查询索引
    show index on tb_name1;

  2. 重建索引(建立索引之后必须重建索引才能生效)
    ALTER INDEX t1_index ON tb_name1 REBUILD;

  3. 删除索引
    DROP INDEX IF EXISTS t1_index ON tb_name1;

5.使用的时候根据索引条件查询能加快查询速度,但是由于索引表也是需要维护的,会带来额外开销。

数据倾斜

  • 什么时数据倾斜?什么导致的数据倾斜?
  1. 一般来说,在分布式计算系统中,我们期望的每个节点完成任务的时间是一致的,但是实际生产环境中,因为种种原因会导致某些节点处理的数据较大,导致完成任务时间与其他节点相差很大,导致整个任务完成时间过长,这就是我们常说的数据倾斜

  2. 一般来说,导致数据倾斜的原因都是因为数据分布的不均匀导致的,而 Hive 因为底层是通过 MR 实现的,所以数据倾斜一般都是发生在 Reduce 端,而 Reduce 端处理的数据是由我们的 Partition 决定的,这就为我们寻找数据倾斜的原因提供了一个最基本的思路。

3.默认的我们 partition 都是通过 key 来决定的,所以一般导致数据倾斜的原因都是 key 的分布不均匀,同时也采用了一些可能会导致数据倾斜的操作,比如 group by , join 等。

  • 数据倾斜解决方案
  1. Hive自带的数据倾斜解决方案,主要是针对 group by ;

a. 设置参数 :set hive.map.aggr=true ,开启 map 端的聚合功能,也就是 MR 程序中写的 combiner

  1. hive.groupby.mapaggr.checkinterval:
    map端group by执行聚合时处理的多少行数据(默认:100000),
  2. hive.map.aggr.hash.min.reduction:
    进行聚合的最小比例(预先对100000条数据做聚合,若 (聚合之后的数据量)/100000 的值大于该配置设 置值0.5,则不会聚合)
  3. hive.map.aggr.hash.percentmemory:
    map端聚合使用的内存的最大值
  4. hive.map.aggr.hash.force.flush.memory.threshold:
    map端做聚合操作是hash表的最大可用内容,大于该值则会触发flush

b. 设置 set hive.groupby.skewindata=true ,开启Group By 产生数据倾斜优化

该处理方式是将一次group 操作进行了两次处理,首先会对map端输入的数据进行随机分发给reduce端,因为是随机的,所以数据会均匀分发给reduce 进行 group ,然后对第一次group处理的数据再进行一次正常的 group操作,因为有了第一次的处理,第二次处理的数据将会大大减少,从而使得数据倾斜问题不再明显。严格来说,这并没有解决数据倾斜问题,但是却大大减少了数据倾斜带来的影响

  • Join产生的数据倾斜
    a. Map端进行join:适合小表 join 大表的情况
  1. 通过修改以下配置启用自动的mapjoin:
    set hive.auto.convert.join = true;
    (该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map join)
  2. hive.mapjoin.smalltable.filesize;
    (大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行)
  3. hive.ignore.mapjoin.hint;
    (默认值:true;是否忽略mapjoin hint 即HQL 语句中的 mapjoin 标记)
  4. hive.auto.convert.join.noconditionaltask;
    (默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin)
  5. hive.auto.convert.join.noconditionaltask.size;
    (将多个mapjoin转化为一个mapjoin时,其表的最大值)

b. 对于两张都是大表的情况,我们可以想办法将一个大表转化为小表,然后采用 a 方案;另外我们也可以使用分桶的思想,将导致数据倾斜的 key 过滤出来额外处理。其中 https://blog.csdn.net/s646575997/article/details/51510661 这上面有些案例可以参考,

相关文章

  • Hive知识归纳

    Hive是什么? 概念 从概念上讲:由Facebook开源的一款基于hadoop的用于统计海量结构化数据的一个数...

  • Hive必知必会

    这是Hive知识点的一个大纲,后续会不断地更新完善,做到对Hive相关知识点有一个比较全面的总结归纳,争取2020...

  • Hive架构及搭建方式

    Hive架构及搭建方式 [TOC] 前言 本文档基于hive 3.1.2编写 hive的基础知识 基本架构 整个h...

  • Hive的基本知识总结

    1. Hive 的基本知识总结:

  • UIControl 知识归纳

    UIControl是UIView的子类,当然也是UIResponder的子类。UIControl是诸如UIButt...

  • UIWindow知识归纳

    UIView的功能 负责渲染区域的内容,并且响应该区域内发生的触摸事件 UIWindow 在iOS App中,UI...

  • redis知识归纳

    一、linux redis搭建环境 分为docker安装和官网下载手动安装,docker就不描述了 1. 下载 官...

  • 如何建构知识体系?

    一、学会归纳知识体系有多重要 归纳知识体系是我们学习中非常重要的一个环节。 别人的始终是别人的,自己归纳出来的知识...

  • 面试题汇总:Hive

    1.《大数据Hive 面试以及知识点》 2.《Hive学习之路 (十一)Hive的5个面试题》 3.《大数据工程师...

  • Hadoop(二十七)HIVE的高级应用之推荐系统

    一.HIVE的基础知识 Hive复合数据类型:map– 创建map:map、str_to_map– 取key、va...

网友评论

    本文标题:Hive知识归纳

    本文链接:https://www.haomeiwen.com/subject/hzqrsftx.html