Hive调优-压缩,分区分桶,表的优化

有没有掌握hive调优,是判断一个数据工程师是否合格的重要指标

1.数据的压缩与存储格式

MR支持的压缩编码
在这里插入图片描述

性能比较
在这里插入图片描述
①bzip2的压缩率高,但是压缩/解压速度慢
②LZO的压缩率相对低一些,但是压缩/解压速度很快
③注:LZO是供Hadoop压缩数据用的通用压缩编解码器。其设计目标是达到与硬盘读取速度相当的压缩速度,因此速度是优先考虑的因素,而不是压缩率。与Gzip编解码器相比,它的压缩速度是Gzip的5倍,而解压速度是Gzip的2倍。同一个文件用LZO压缩后比用Gzip压缩后大50%但比压缩前小25%~ 50%。这对改善性能非常有利,Map阶段完成时间快4倍。

2.合理利用分区分桶

分区针对的是数据的存储路径;分桶针对的是数据文件。
分区是将表的数据在物理上分成不同的文件夹,以便于在查询时可以精准指定所要读取的分区目录,从来降低读取的数据量。
分桶是将表数据按指定列的hash散列后分在了不同的文件中,将来查询时,hive可以根据分桶结构,快速定位到一行数据所在的分桶文件,从来提高读取效率。

3.Hive参数优化7

// 让可以不走mapreduce任务的,就不走mapreduce任务
hive> set hive.fetch.task.conversion=more;

// 开启任务并行执行
set hive.exec.parallel=true;
// 解释:当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all的时候)

// 同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;

// 设置jvm重用,JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
set mapred.job.reuse.jvm.num.tasks=10;

// 合理设置reduce的数目
// 方法1:调整每个reduce所接受的数据量大小
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
// 方法2:直接设置reduce数量
set mapred.reduce.tasks = 20

// map端聚合,降低传给reduce的数据量
set hive.map.aggr=true

// 开启hive内置的数倾优化机制
set hive.groupby.skewindata=true

4.优化SQL

① 移动where的位置,使得where的执行在map端而不是reduce端
② 不必要的情况下,使用union all+group by 而不是union
③ 不要使用count(distinct)
④ 用in代替join
⑤ 优化子查询,减少子查询里面的group by、count(distinct),max,min等,可以减少job的数量
⑥ join优化。
使用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。

5.数据倾斜

数据倾斜:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
(1)sql本身导致的数据倾斜
① 设置合理的Map数,map数并不是越多越好,一个map任务启动和初始化的时间远远大于逻辑处理的时间,过多的map数就会造成很大的资源浪费。
② 合并小文件:在map执行前合并小文件,减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。
③ 复杂文件增大map数。当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

7.查看SQL的执行计划

学会查看sql的执行计划,优化业务逻辑 ,减少job的数据量。对调优也非常重要!
explain sql

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Hive思路,可以从以下几个方面入手: 1. 数据存储和分区设计:合理的数据存储和分区设计可以提高查询性能。根据业务需求,将数据按照合适的列进行分区,这样可以减少数据扫描量。 2. 数据压缩:使用合适的压缩格式可以减小数据存储空间,并提高查询性能。例如,使用Snappy、LZO等压缩算法来减少磁盘IO和网络传输。 3. 数据倾斜处理:当某些列的值过于集中,导致某些Task处理的数据量远大于其他Task时,会导致任务执行时间不均衡。通过对倾斜键进行处理,如使用随机前缀或者进行拆分处理,可以解决数据倾斜问题。 4. 合理设置Hive参数:根据实际情况Hive的参数配置,以提高查询性能。常见的参数包括:hive.exec.parallel、hive.tez.container.size、hive.vectorized.execution.enabled等。 关于Hive的参数配置,下面是一些常用的参数: 1. hive.exec.parallel:设置并行执行任务的线程数,默认为1。可以根据集群资源情况适当整,以提高任务执行效率。 2. hive.tez.container.size:设置每个Tez任务的容器大小,默认为1024(MB)。可以根据具体的任务需求和集群资源情况进行整,以充分利用集群资源。 3. hive.vectorized.execution.enabled:启用向量化执行,可提高查询性能。默认为false,可以通过设置为true来开启向量化执行。 4. hive.optimize.sort.dynamic.partition:动态分区排序优化,默认为true。对于动态分区,可以开启该参数以提高插入性能和查询性能。 5. hive.stats.autogather:自动收集统计信息,默认为true。开启该参数可以帮助优化查询计划,提高查询性能。 以上是一些常见的Hive思路和参数配置,具体的策略还需要根据实际情况进行整和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值