码迷,mamicode.com
首页 > 其他好文 > 详细

hive的调优经验

时间:2020-09-09 19:07:41      阅读:34      评论:0      收藏:0      [点我收藏+]

标签:apr   读写   pre   idt   引擎   div   模式   使用   静态   

1.hive本身对union这样的命令进行了优化

2.hdfs数据本地化率对hive性能产生影响

    在数据大小一定的情况下,500个128M的文件和2个30G的文件 跑hive任务,性能是有差异的,两者最大的区别在于,后者在读取文件时,需要跨网络传输,而前者为本地读写。数据本地化率问题。

技术图片

 

 

3.不同数据格式对性能的提升

  hive提供text,sequenceFile,RCFile,ORC,Parquest等格式。

  sequenceFile是一个二进制key/value对结构的平面文件,广泛应用于MapReduce中。

  Parquet时一种列式存储格式,兼容多种数据引擎,MapReduce和Spark。

  ORC时对RCFile的一种优化,主流选择之一。

4.分区表和分桶表对性能的提升

 分区表:

总结:分区表的意思,其实想明白了就很简单。就是在系统上建立文件夹,把分类数据放在不同文件夹下面,加快查询速度。

关键点1:partitioned by (dt String,country string); 创建表格时,指明了这是一个分区表。将建立双层目录,第一次目录的名字和第二层目录名字规则

PARTITIONED BY子句中定义列,是表中正式的列,成为分区列。但是数据文件中并没有这些值,仅代表目录。

关键点2: partition (dt=‘2001-01-01‘,country=‘GB‘); 上传数据时,把数据分别上传到不同分区中。也就是分别放在不同的子目录下。

理解分区就是文件夹分而治之,查询的时候可以当作列名来显示查询的范围。

 

 动态分区表: 

关闭严格分区模式
动态分区模式时是严格模式,也就是至少有一个静态分区。
set hive.exec.dynamic.partition.mode=nonstrict    //分区模式,默认nostrict
set hive.exec.dynamic.partition=true            //开启动态分区,默认true
set hive.exec.max.dynamic.partitions=1000        //最大动态分区数,默认1000

 

为什么要使用动态分区呢,我们举个例子,假如中国有50个省,每个省有50个市,每个市都有100个区,那我们都要使用静态分区要使用多久才能搞完。所有我们要使用动态分区。

动态分区默认是没有开启。开启后默认是以严格模式执行的,在这种模式下需要至少一个分区字段是静态的。
这有助于阻止因设计错误导致导致查询差生大量的分区。列如:用户可能错误使用时间戳作为分区表字段。然后导致每秒都对应一个分区!这样我们也可以采用相应的措施:

 

分桶表:

每一个表或者分区,Hive可以进一步组织成桶。也就是说,桶为细粒度的数据范围划分。

分桶规则:对分桶字段值进行哈希,哈希值除以桶的个数求余,余数决定了该条记录在哪个桶中,也就是余数相同的在一个桶中。分桶不会改变原有表和原有分区目录的组织方式。只是更改了数据在文件中的分布。

优点:1、提高join查询效率 2、提高抽样效率

 

可以用 desc formatted [表名] 来查看目录组织方式

 

 

hive的调优经验

标签:apr   读写   pre   idt   引擎   div   模式   使用   静态   

原文地址:https://www.cnblogs.com/erlou96/p/13581743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!