Hive性能调优策略

2023-10-26

利用分区表优化

场景:在业务环境中,以某个字段为筛选条件的需求增加
解决方法:建立以这个字段为分区的分区表,这样进行查询时只需要指定这个分区就不再需要进行全表扫描

利用分桶表优化

场景:需要频繁进行采样
解决方法:分桶表会使用hash算法将写入的数据随机的分入桶中,如果要进行采样的话,直接选择一个桶即可。

补充三种采样的方法 :

-- 分桶抽象
select * from tmp_table tablesample(bucket 3 out of 32);
-- 3是抽取的分桶号,分桶号从0开始,32为总分桶数

-- 随机采样 
select * from tmp_table order by rand() limit 100;
-- rand会随机打乱排序,然后抽取头100条数据 但是使用了order by效率过低
select * from tmp_table distribute by rand() sort by rand() limit 100;
--使用distribute by rand()分桶打乱来提高效率


-- 数据块抽样
select * from tmp_table tablesample(10 percent)  -- 抽10%数据
select * from tmp_table tablesample(5 rows)		 -- 抽取行数
select * from tmp_table tablesample(5 M)		 -- 抽取数据块大小

文件存储格式

在建表的时候,是可以通过stored as来指定表的存储格式,常见的存储格式有:

  • TextFile
    • 默认存储结构,行存储。
    • 一行就是一条数据,以换行符分割,如果不进行压缩,磁盘开销较大,解析成本较高
    • 建议使用可切分的压缩方式压缩
  • SequenceFile
    • HadoopAPI提供的二进制存储文件,使用方便,可分割,可压缩
    • 一般选择block进行压缩
  • RCFile
    • 按行分块,数据块按列存储
    • 比起提高查询速度,更多的是降低存储
  • ORC
    • 按行分块,数据块按列存储
    • RCFile的升级版,在降低存储的情况下,查询性能大幅度提升
    • 数据可压缩
    • 基于列创建索引
  • ParquetFile
    • 列式存储
    • 对于大型查询、指定列查询都是高效的
    • 一般使用snappy压缩
    • 支持impala查询引擎

数据进入数仓后,文件格式尽量选择后两者。

如何选择文件压缩格式

压缩格式 是否可拆分 是否自带 压缩率 速度 是否hadoop自带
gzip 很高 非常快
lzo 比较高 很快 否,要安装
snappy 比较高 很快 否,要安装
bzip2 最高

选择压缩格式主要从三个方面:

  • 压缩比率
  • 压缩解压速度
  • 是否支持切片

列裁剪

场景:查询的表是一个有数十列的大宽表,但是只需要选择一个列的数据
解决方法:开启列裁剪,这样就可以只选择想要的列

# 列裁剪,只选择需要用到的列,默认开启
set hive.optimize.cp = true;

谓词下推

谓词下推会将where谓词逻辑尽可能的提前执行,减少下游所需处理的数据量。

# 谓词下推,默认开启
set hive.optimize.ppd = true;

举个例子:

select a.*,b.* from a join b on a.id=b.id where b.age >20;

-- 谓词下推后
select a.*,c.* from a join(select * from b where age > 20) c on a.id=c.id;

分区裁剪

和列裁剪一样,就是只读取需要的分区。

# 分区裁剪,只选择需要用到的分区,默认开启
set hive.optimize.pruner = true;

合并小文件

在执行MR程序时,一般一个文件都需要一个MapTask来处理,如果文件数过多,那么就会启动大量的MapTask任务,从而浪费大量资源。进行小文件的合并可以减少MapTask任务数量,从而加快执行速度。

# map端输入、合并文件之后按照block大小分割
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

# map端输入、不合并
set hive.input.format = org.apache.hadoop.hive.ql.io.HiveInputFormat;

# 是否合并map端输出,默认为true
set hive.merge.mapfiles=true;

# 是否合并reduce端输出,默认为false
set hive.merge.mapredfiles=true;

# 合并文件的大小,默认为256000000(256M)
set hive.merge.size.per.task = 256000000;

# 每个map最大分割大小  
set mapred.max.split.size = 256000000;

# 一个节点上split最小值  比如节点上所有的小文件大小之和不足256M,那么就合并成一个文件
set mapred.min.split.size.per.node = 1;

# 一个机架上split的最小值  假如机架中有四个节点,每个节点只有一个40M的文件,那么就把机架上的文件合并起来组成一个文件
set mapred.min.split.size.per.rack = 1;

Join优化

  • 优先过滤后在进行join操作,最大限度的减少参与join的数据量
  • 小表join大表,最好启动mapjoin,hive自动启用mapjoin,但是小表不能超过25M,可以设置
  • join表的顺序从小到大

mapJoin

注意:这个措施,只要能用就用

mapJoin会将小表的数据分发到各个map的内存中,在map进程中进行join操作,从而提高速度。

# 自动将join转换为mapJoin
set hive.auto.convert.join = true;

# 小表大小
set hive.mapjoin.smalltable.filesize = 25000000;

# hive会基于表的size自动将普通join转换为mapjoin
set hive.auto.convert.join.noconditionaltask = true;

#多大的表可以自动触发内层LocalTask,默认大小10M
set hive.auto.convert.join.noconditionaltask.size = 10000000;

Sort-Merge-Bucket(SMB) map Join

也是map join的一种优化方式,前提为参与join的表必须是分桶表与分桶排序表。
具体实现:

  • 针对参与join的这两张表做相同的hash散列
  • 桶中数据要排序
  • 这两张表的分桶个数成倍数
  • 开启smb的开关
# 当用户执行smb map join时,如果不能执行,则禁止查询
set hive.enforce.sortmergrbucktmapjoin = false;

# 当join的表符合smb条件,join是否会自动转换为smb map join
set hive.auto.convert.sortmerge.join = true;

# 当两个分桶表join时,如果join on的是分桶字段,小表的分桶数是大表的倍数时,可以启用mapjoin来提高效率
set hive.optimize.bucketmapjoin = false;
set hive.optimize.bucketmapjoin.sortedmerge = false;

Join导致的数据倾斜

如果确认是因为Join造成的数据倾斜,可以进行如下配置:

# join的键对应的记录条数超过这个值就进行分拆,根据具体修改
set hive.skewjoin.key = 100000;

# 如果是join过程出现倾斜应该设置为true
set hive.optimize.skewjoin = false;

开启后,如果job处理的记录条数超过限制,就会重启一个job处理多余的数据。

# 设置后可以控制第二个job的mapper数量。
set hive.skewjoin.map.tasks = 100000; 

CBO优化

在源码中遇见过这个优化,在hive1.1.0之后这个优化默认开启。
他会选择最优的join算法进行join。

set hive.cho.enable = true;

set hive.compute.query.using.stats = true;

set hive.stas.fetch.column.stats = true;

set hive.stats.fetch.partition.stats = true;

怎样做笛卡尔积

什么叫笛卡尔积:两张表做没有连接条件的连接

hive设置为严格模式时,不允许使用笛卡尔积,这说明hive对笛卡尔积的支持本身是较弱的。

原因是因为找不到Join key,做笛卡尔积时只有一个reduce,造成了很大的压力与延迟。

hive做笛卡尔积的精髓在于复制,小表复制了N倍,大表的数据就被随机分为了N份,就会产生N个reduce,就不会出现数据倾斜。

在这里插入图片描述

group by

https://blog.csdn.net/qq_41106844/article/details/107412769

order by

order by只能是在一个reduce进程中进行,所以如果对一个大数据集进行order by,会导致一个reduce进程中处理的数据相当大,造成查询执行缓慢。

1.如果在操作结果上进行order by,不要在中间的大数据集上进行排序,如果结果数据较少,可以在结果排序

2.如果是取排序后的前N条数据,那么可以使用distribute by和sort by在各个reduce上进行排序后取前N条,然后汇总后再取前N条。这样避免了数据全排序,所以执行效率会有很大提高。

现在有个需求:
求全年级分数最高的三个人

-- 使用order by
select * from student order by mark desc limit 3;

-- 使用distribute by+sort by
set mapreduce.job.reduces = 3;

create table student_orderby_result as 
    select 
        * 
    from 
        student 
    distribute by (
        case 
        when 
            mark>80 
        then 
            0 
        when 
            mark<60 
        then 
            2 
        else 
            1 
        end)
    sort by (mark desc);

第二种方式最主要的问题是如何均匀分桶,也就是如何保证数据的均匀分布。
建议使用采样的方式先估计一下数据的分布。

count distinct优化

当要对某一列去重时,如果数据量很大,count(distinct)就会非常慢,原因也是因为reduce数量少。

第一种解决方式是使用group by优化。

-- 原句
select count(distinct age) from student;

-- group by 优化  单个字段推荐
select count(1) from ( select age from student group by age)tmp;

-- 子句优化
select count(1) from (select distinct id from student) tmp;

in/exists语句

in/exists语句应该全部换成left semi join 语句

vectorization技术

在计算scan/filter/aggregation的时候,vectorization技术以设置批处理的增量大小为1024行,单次增加处理量来提高效率。

set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;

多重模式

如果多条SQL对某种表进行扫描,同时做不同的逻辑,那么就可以使用多重扫描,对表进行一次扫描做不同逻辑。

from student
    select .....
    insert ....
    ...

但是呢,也有些限制:

  • 单个SQL最多有128条语句
  • 对于分区表,一个分区不能出现两次(读写锁)
  • 对于同一张表的不同分区,不能同时有insert overwrite和insert into操作

例子:日志表与用户表做链接

select * from log a left outer join users b on a.user_id = b.user_id;

users表中有600w+记录,肯定不能使用mapjoin进行分发,而join又会遇到数据倾斜的问题。

改进方案

-- **sql3_start** 获取活跃用户的日志信息
select 
    * 
from 
    log a 
left outer join(
    -- **sql2_start** 获取活跃用户的用户信息
    select 
        d.* 
    from 
        -- **sql1_start**获取有活动的用户id信息
        (select distinct user_id from log) c 
        -- **sql1_end**
    join 
        user d 
    on 
        c.user_id =d.user_id    
    ) x 
    -- **sql2_end** 
on 
    a.user_id = x.user_id
;
-- **sql3_end** 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hive性能调优策略 的相关文章

  • Hive Order By、Sort By、Distrbute By、Cluster By区别

    1 Order By 全局排序 只有一个Reducer 2 Sort By 分区内有序 3 Distrbute By 类似MR中Partition 进行分区 结合sort by使用 4 Cluster By 当Distribute by和S
  • Hive性能调优策略

    利用分区表优化 场景 在业务环境中 以某个字段为筛选条件的需求增加 解决方法 建立以这个字段为分区的分区表 这样进行查询时只需要指定这个分区就不再需要进行全表扫描 利用分桶表优化 场景 需要频繁进行采样 解决方法 分桶表会使用hash算法将
  • 【大数据】HiveQL:视图

    HiveQL 视图 视图可以允许保存一个查询 并向对待表一样对这个查询进行操作 这是一个逻辑结构 因为它不像一个表会存储数据 换句话说 Hive 目前暂不支持物化视图 当一个查询引用一个视图时 这个视图所定义的查询语句将和用户的查询语句组合
  • 数仓建模—宽表的设计

    宽表的设计 高内聚低耦合 宽表是数仓里面非常重要的一块 数仓是分层的 这是技术进步和时代变化相结合的产物 数仓的分层式为了更好地管理数仓以及更加高效地进行数据开发 宽表主要出现在dwd 层和报表层 当然有的人说dws 层也有 宽表 从字面意
  • Hive 常用DML操作

    一 加载文件数据到表 1 1 语法 LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION partcol1 val1 partcol2 val2 L
  • 【大数据】HiveQL:索引

    HiveQL 索引 Hive 只有有限的索引功能 Hive 中没有普通关系型数据库中键的概念 但是还是可以对一些字段建立索引来加速某些操作的 一张表的索引数据存储在另外一张表中 这是一个相对比较新的功能 所以目前还没有提供很多的选择 Hiv
  • Hive常用DDL操作

    一 Database 1 1 查看数据列表 show databases 1 2 使用数据库 USE database name 1 3 新建数据库 语法 CREATE DATABASE SCHEMA IF NOT EXISTS datab
  • 【大数据】Hive基础知识

    Hive基础知识 1 Hive 有哪些特点 Hive 最适合于数据仓库应用程序 使用该应用程序进行相关的静态数据分析 不需要快速响应给出结果 而且数据本身不会频繁变化 Hive 不是一个完整的数据库 Hadoop 以及 HDFS 的设计本身
  • 【大数据】Hive中的模式设计

    Hive中的模式设计 Hive 看上去以及实际行为都像一个关系型数据库 并且 Hive 提供的查询语言也确实和之前使用过的 SQL 语言非常地相似 不过 Hive 实现和使用的方式和传统的关系型数据库是非常不同的 通常用户视图移植关系型数据
  • 全网最细之HiveQL语句操作

    HiveQL语句操作 关键字尽量大写 但是本人小写容易记忆 所以本篇为小写 数据库 创建一个数据库 查看数据库 修改数据库信息 删除数据库 普通表 创建表 查看表 修改表名 添加n列 修改表 修改位置 单独修改列名 数据类型 替换列 删除n
  • 数仓建模分层理论

    分层建设理论 简单点儿 直接ODS DM就可以了 将所有数据同步过来 然后直接开发些应用层的报表 当DM层的内容多了以后 想要重用 就会再拆分一个公共层出来 变成3层架构 这个过程有点类似代码重构 就是在实践中不断的进行抽象 总结 数仓的建
  • 【大数据】HiveQL的数据操作

    HiveQL的数据操作 因为 Hive 没有行级别的数据插入 数据更新和删除操作 那么往表中装载数据的唯一途径就是使用一种 大量 的数据装载操作 或者通过其他方式仅仅将文件写入到正确的目录下 1 向管理表中装载数据 LOAD DATA LO
  • HIVE-执行命令的几种方式 和 hive -e 和hive -f的使用

    第一种 在bash中直接通过hive e命令 并用 gt 输出流把执行结果输出到制定文件 hive e select from test hour rate2 where year 2019 gt tmp output 1 txt 第二种
  • Hive(5) Hive的数据类型

    HIve 2 Hive的数据类型 数据类型 基本数据类型 Hive数据类型 对应Java数据类型 长度 byte 举例 tinyint byte 1 10 smallint short 2 20 int int 4 30 bigint lo
  • Hive的联级(cascade)- 修改分区表的字段类型或者增加新字段

    一 问题描述 踩坑 数仓的分区表 由于需求需要 要把int类型的字段改为bigint 我直接执行的以下语句 alter table table name change column 字段 字段 bigint 出现的问题 之后的分区数据可以正
  • 0401hive入门-hadoop-大数据学习.md

    文章目录 1 Hive概述 2 Hive部署 2 1 规划 2 2 安装软件 3 Hive体验 4 Hive客户端 4 1 HiveServer2 服务 4 2 DataGrip 5 问题集 5 1 Could not open clien
  • Hive(7) Hive的DML语句-Hive的数据库和表的修改和删除

    Hive 3 DML语句 DML 数据操作语句 导入数据 直接从文件向表中导入数据 load data load data local inpath lt 文件路径 gt overwrite into table lt 表名 gt part
  • Hive 视图和索引

    一 视图 1 1 简介 Hive 中的视图和 RDBMS 中视图的概念一致 都是一组数据的逻辑表示 本质上就是一条 SELECT 语句的结果集 视图是纯粹的逻辑对象 没有关联的存储 Hive 3 0 0 引入的物化视图除外 当查询引用视图时
  • Hive Sql执行出错 Dag submit failed due to java.io.IOException: All datanodes DatanodeInfoWithStorage

    原因 根本原因是集群中的一个或多个信息块在所有节点中都已损坏 因此映射无法获取数据 命令 hdfs fsck list corruptfileblocks 可用于识别集群中损坏的块 当数据节点中打开的文件数量较少时 也会出现此问题 解决方案
  • hive-字符串查找函数 instr和locate

    找不到都是返回0 字符串查找函数 instr 语法 instr string str string substr 返回值 int 说明 返回字符串 substr 在 str 中首次出现的位置 举例 hive gt select instr

随机推荐

  • 华为OD机试真题- 荒岛逃生游戏-2023年OD统一考试(B卷)

    题目描述 一个荒岛上有若干人 岛上只有一条路通往岛屿两端的港口 大家需要逃往两端的港口才可逃生 假定每个人移动的速度一样 且只可选择向左或 向右逃生 若两个人相遇 则进行决斗 战斗力强的能够活下来 并损失掉与对方相同的战斗力 若战斗力相同
  • 【自学51单片机】5 --- 定时器介绍、数码管静态显示、逻辑运算符和逻辑电路符号

    文章目录 1 逻辑运算和逻辑电路 1 1 C语言逻辑运算符 1 2 逻辑电路符号 2 定时器学习 重点非难点 2 1 时钟周期和机器周期的介绍 2 2 定时器的介绍 2 2 1 定时器寄存器介绍 2 2 2 定时器模式工作电路逻辑图 2 3
  • github可以做文件服务器吗,局域网搭建git服务端并使用Github Desktop作为客户端

    在使用了github的客户端软件Github Desktop之后 感受到了git的便捷 研究了一下与svn的区别之后 结合目前的团队情况 决定下个项目开始使用git 整理一下 这里服务端为centos 6 5 客户端为mac 一 服务端安装
  • Mysql 架构图

    Mysql 架构图 第一层 对客户端的连接处理 安全认证 授权等 每个客户端连接都会在服务端拥有一个线程 每个连接发起的查询都会在对应的单独线程中执行 第二层 MySQL的核心服务功能层 包括查询解析 分析 查询缓存 内置函数 存储过程 触
  • 电脑怎样执行编程语言的?

    链接 https www zhihu com question 29227521 answer 154819061 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 这个问题真的是很大 让我们自顶向下的解释 在
  • 2023华为OD机试真题【最大利润/贪心算法】

    题目描述 商人经营一家店铺 有number 种商品 由于仓库限制每件商品的最大持有数量是 item index 每种商品的价格是 price item index day 通过对商品的买进和卖出获取利润 请给出商人在 days 天内能获取的
  • 在Windows10下使用GPU安装TensorFlow

    1 安装Python和pip 在Windows环境安装Python 3 x版本 通常安装包中集成了pip工具 安装会非常简单方便 具体见 https www python org downloads windows 按以上网站的信息 获取到
  • tomcat端口号被占用

    这里有两种方法 第一个是通过命令窗口终止 第二个是使用任务管理器 1 端口被占用 可以用cmd window R 第一步 输入netstat ano 找到被占用的端口号 netstat ano 也可以输入netstat aon findst
  • matlab和stata,Stata和Matlab联合处理金融数据

    Stata是统计学专业软件 可以很方便的对数据处理 但几乎只能按照整行整列进行 而且每次只能加载一个矩阵 dta文件 如果要用到多个矩阵数据进行操作或进行复杂的循环控制 就力不从心了 而Matlab工业界广泛使用的数据分析处理工具 对矩阵支
  • 8、OpenCV调整图像对比度和亮度

    OpenCV调整图像对比度和亮度 一 学习目标 二 原理理解 三 对比度 亮度调整 四 完整代码示例 一 学习目标 理解图像对比度和亮度调整的原理 对比三种不同亮度和对比度调整方法 二 原理理解 1 对比度 对比度指的是一幅图像中明暗区域最
  • docker启动命令,docker重启命令,docker关闭命令

    一 docker服务的命令 启动 systemctl start docker 守护进程重启 systemctl daemon reload 重启docker服务 systemctl restart docker service docke
  • VS2019智能感知、代码折叠超慢问题解决实例

    CUDA Nsight VS 插件引起的智能感知问题解决 今天使用VS2019的时候 发现智能感知 代码折叠都莫名的慢 也不是一点都不会来 就是超慢 感觉要10秒以上才会显示 点个点需要等上好久才会出来 怎么重置都没用 换新用户也没用 想想
  • eclipse打开new新建没有java project

    自己通过上网学习安装了eclipse 在安装和使用过程中遇到的问题及解决办法会进行记录 希望可以帮助跟我遇到相同问题的你们哦 这些解决办法 也是我百度找到的 分享给大家 我的eclipse之前已经装过了 昨天在学习接口测试要用到eclips
  • ELK通过logstash采集java日志(多图演示)

    ELK 不是一款软件 而是 Elasticsearch Logstash 和 Kibana 三种软件产品的首字母缩写 这三者都是开源软件 通常配合使用 而且又先后归于 Elastic co 公司名下 所以被简称为 ELK Stack 根据
  • 大牛总结超详细的RabbitMQ入门,看这篇文章就够了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 ack机制回顾 三 ack机制实现原理 delivery tag 四 RabbitMQ如何感知仓储服务实例宕机 五 仓储服务处理失败时的消息重
  • VS异常:文件乱码:文件加载,使用Unicode(UTF-8)编码加载文件xxx时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。

    参考 https blog csdn net bugang4663 article details 110408633 今天在使用vs打开一个项目的时候发现部分文件突然乱码了 上午打开的时候还没发现 点击部分cs文件的时候出现下面异常提醒
  • SD卡两种操作模式在项目中应用的比较

    1 SDIO接口传输速度比SPI接口传输速度快 2 STM32的SDIO口还真的不好用 特别是4BIT的方式 我都纠结了好久了 用1BIT的方式倒是可以 速度大概可以到读2M字节每秒 STM32F205 SDIO DMA 因为项目要最低5M
  • linux入门系列11--Centos7网络服务管理

    通过前面文章的学习已经掌握了Linux系统配置管理的知识 本文讲解Centos7网络配置知识 Linux要对外提供服务 需要保证网络通信正常 因此需要正确配置网络参数 本文将讲解如何使用Network Manager配置网络参数 管理网络会
  • 短视频dy(某音)高版本最新最全4种抓包方案,第1种让你秒破QUIC协议,破解抓包难题,看我这一篇就够了!

    一 前言 一般大多数网站 APP最常用的是http https协议 而某两款最火的短视频dy 某音 ks 某手 最新版使用的是quic协议 见附录1 导致fiddler和charles无法直接抓到包 某音app 13 5版本以下可以直接抓到
  • Hive性能调优策略

    利用分区表优化 场景 在业务环境中 以某个字段为筛选条件的需求增加 解决方法 建立以这个字段为分区的分区表 这样进行查询时只需要指定这个分区就不再需要进行全表扫描 利用分桶表优化 场景 需要频繁进行采样 解决方法 分桶表会使用hash算法将