Hive性能优化之表设计优化1

简介: Hive性能优化之表设计优化1

1 分区表

1.1 Hive查询基本原理

Hive的设计思想是通过元数据将HDFS上的文件映射成表,基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算MapReduce程序对

HDFS中的数据进行读取处理的过程。

例如,当我们在Hive中创建一张表tb_login并关联HDFS上的文件,用于存储所有用户的登录信

息,当我们对这张表查询数据时,Hive中的实现过程如下:

⚫ step1:创建表

--创建数据库
create database tb_part;
--创建表
create table tb_login(
userid string,
logindate string
) row format delimited fields terminated by ' '\t' ';

◼ HDFS中自动在Hive数据仓库的目录下和对应的数据库目录下,创建表的目录

⚫ step2:关联数据

load data local inpath '/export/data/login.log' into table tb_login;

◼ 数据会被自动放入HDFS中对应的表的目录下

◼ 数据在表中可以被正常读取

⚫ step3:查询数据

-- 统计3月24号的登录人数
select
logindate,
count(*) as cnt
from tb_login
where logindate = '2021- - 03- - 24'
group by logindate;

◼ 当执行查询计划时,Hive会使用表的最后一级目录作为底层处理数据的输入

◼ 先根据表名在元数据中进行查询表对应的HDFS目录

◼ 然后将整个HDFS中表的目录作为底层查询的输入,可以通过explain命令查看执行计

划依赖的数据

explain extended
select
logindate,
count ( * ) as cnt
from tb_login
where logindate = '2021- - 03- - 24'
group by logindate;

1.2 普通表结构问题

默认的普通表结构中,表的最后一级目录就是表的目录,而底层的计算会使用表的最后一级目录作为Input进行计算,这种场景下,我们就会遇到一个问题,如果表的数据很多,而我们需要被

处理的数据很少,只是其中一小部分,这样就会导致大量不必要的数据被程序加载,在程序中被过

滤,导致大量不必要的计算资源的浪费。

例如,上面的需求中,只需要对2021-03-24日的数据进行计算,但实际上由于表结构的设计,

在底层执行MapReduce时,将整张表的数据都进行了加载,MapReduce程序中必须对所有数据进

行过滤,将3月24号的数据过滤出来,再进行处理。假设每天有1G的数据增量,一年就是365GB的

数据,按照业务需求,我们每次只需要对其中一天的数据进行处理,也就是处理1GB的数据,程序

会先加载365GB的数据,然后将364GB的数据过滤掉,只保留一天的数据再进行计算,导致了大量

的磁盘和网络的IO的损耗。

1.3 分区表设计思想

针对上面的问题,Hive提供了一种特殊的表结构来解决——分区表结构。分区表结构的设计思

想是:根据查询的需求,将数据按照查询的条件【一般都以时间】进行划分分区存储,将不同分区

的数据单独使用一个HDFS目录来进行存储,当底层实现计算时,根据查询的条件,只读取对应分

区的数据作为输入,减少不必要的数据加载,提高程序的性能。

例如,上面的需求中,我们可以将每天的用户登录数据,按照登陆日期进行分区存储到Hive

表中,每一天一个分区,在HDFS的底层就可以自动实现将每天的数据存储在不同的目录中,当用

户查询某天的数据时,可以直接使用这一天的分区目录进行处理,不需要加载其他数据。

1.4 分区表测试

基于分区表的设计实现将所有用户的登录信息进行分区存储

⚫ 创建分区表:按照登陆日期分区

–创建表

create table tb_login_part(

userid string

)

partitioned by (logindate string)

row format delimited fields terminated by ’ ‘\t’ ';

row format delimited fields terminated by ’ ‘\t’ ';

⚫ 将所有登陆数据写入分区表,分区存储

–开启动态分区

set hive.exec.dynamic.partition.mode=nonstrict;

–按登录日期分区

insert into table tb_login_part partition(logindate)

select * from tb_login;

◼ HDFS中会自动在表的目录下,为每个分区创建一个分区目录

⚫ 查询2021-03-23或者2021-03-24的数据进行统计

select

logindate,

count ( * ) as cnt

from tb_login_part

where logindate = ‘2021- - 03- - 23’ or logindate = ‘2021- - 03- - 24’

group by logindate;

◼ 查询先检索元数据,元数据中记录该表为分区表并且查询过滤条件为分区字段,所以

找到该分区对应的HDFS目录

◼ 加载对应分区的目录作为计算程序的输入

⚫ 查看执行计划

◼ 如果不做分区表

explain extended

select

logindate,

count ( * ) as cnt

from tb_login

where logindate = ‘2021- - 03- - 23’ or logindate = ‘2021- - 03- - 24’

group by logindate;

◼ 如果做了分区表

explain extended

select

logindate,

count ( * ) as cnt

from tb_login_part

where logindate = ‘2021- - 03- - 23’ or logindate = ‘2021- - 03- - 24’

group by logindate;

目录
相关文章
|
5月前
|
SQL 缓存 关系型数据库
ClickHouse(19)ClickHouse集成Hive表引擎详细解析
Hive引擎允许对HDFS Hive表执行 `SELECT` 查询。目前它支持如下输入格式: -文本:只支持简单的标量列类型,除了 `Binary` - ORC:支持简单的标量列类型,除了`char`; 只支持 `array` 这样的复杂类型 - Parquet:支持所有简单标量列类型;只支持 `array` 这样的复杂类型
200 1
|
6月前
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
118 4
Hive 优化总结
|
5月前
|
SQL 资源调度 数据库连接
Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
在Tez上优化Hive查询,包括配置参数调整、理解并行化机制以及容器管理。关键步骤包括YARN调度器配置、安全阀设置、识别性能瓶颈(如mapper/reducer任务和连接操作),理解Tez如何动态调整mapper和reducer数量。例如,`tez.grouping.max-size` 影响mapper数量,`hive.exec.reducers.bytes.per.reducer` 控制reducer数量。调整并发和容器复用参数如`hive.server2.tez.sessions.per.default.queue` 和 `tez.am.container.reuse.enabled`
338 0
|
6月前
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
127 2
|
6月前
|
SQL 分布式计算 资源调度
一文看懂 Hive 优化大全(参数配置、语法优化)
以下是对提供的内容的摘要,总长度为240个字符: 在Hadoop集群中,服务器环境包括3台机器,分别运行不同的服务,如NodeManager、DataNode、NameNode等。集群组件版本包括jdk 1.8、mysql 5.7、hadoop 3.1.3和hive 3.1.2。文章讨论了YARN的配置优化,如`yarn.nodemanager.resource.memory-mb`、`yarn.nodemanager.vmem-check-enabled`和`hive.map.aggr`等参数,以及Map-Side聚合优化、Map Join和Bucket Map Join。
312 0
|
6月前
|
SQL 关系型数据库 MySQL
Hive 表注释乱码解决
Hive元数据在MySQL默认使用`latin1`字符集导致注释乱码。可通过修改MySQL配置文件`/etc/my.cnf`,在`[mysqld]`和末尾添加`character-set-server=utf8`等设置,重启MySQL。然后在Hive数据库中调整表字段、分区字段、索引注释的字符集。注意,这仅对新表生效。测试创建带注释的Hive表,问题解决。
84 0
|
6月前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
6月前
|
SQL HIVE
Hive表删除数据不支持使用Delete From...
Hive表删除数据不支持使用Delete From...
242 0
|
6月前
|
SQL 存储 分布式计算
【Hive】hive内部表和外部表的区别
【4月更文挑战第14天】【Hive】hive内部表和外部表的区别
|
6月前
|
SQL 数据库 HIVE
Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
【4月更文挑战第8天】Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
92 0