hive优化和数据倾斜解决方案 您所在的位置:网站首页 hive不走mapreduce hive优化和数据倾斜解决方案

hive优化和数据倾斜解决方案

2023-12-01 19:08| 来源: 网络整理| 查看: 265

Hive优化 一、常见的Hive的优化方式有哪些二、表的优化三、如何防止数据倾斜3.1、产生数据倾斜的原因3.2、数据倾斜通用的处理方法3.3、产生数据倾斜的场景和解决方案3.3.1 group by 产生数据倾斜3.3.2 select语句中包含 count(distinct)时3.3.3 大表+小表3.3.4 大表+大表3.3.5 空值产生数据倾斜3.3.6 不同数据类型关联产生数据倾斜3.3.7 开启负载均衡

一、常见的Hive的优化方式有哪些 开启执行计划 ➢explain select …Fetch模式 ➢默认是开启的,开启后在全局查找、字段查找、limit查找等都不走MapReduce set hive.fetch.task.conversion=more; 默认为more本地模式 ➢数据量小的时候通过本地模式在单台机器上处理所有的任务 //开启本地mr set hive.exec.mode.local.auto=true; //设置 local mr 的最大输入数据量,当输入数据量小于这个值时采用 local mr 的方式 //默认为 134217728,即 128M set hive.exec.mode.local.auto.inputbytes.max=50000000; //设置 local mr 的最大输入文件个数,当输入文件个数小于这个值时采用 local mr 的方式,默认为4 set hive.exec.mode.local.auto.input.files.max=8; 并行执行 ➢当某个job包含众多的阶段且这些阶段不是完全互相依赖的,就可以并行执行,以缩短整个job的执行时间 set hive.exec.parallel=true;//打开任务并行执行,默认为false关闭 set hive.exec.parallel.thread.number=16;//设置最大并行度,默认为8 严格模式 ➢默认是严格模式,是为了防止用户执行会产生意外影响的查询。严格模式可以限制以下几点 不允许扫描所有分区,防止全表扫描消耗过大的资源orderby必须使用limit语句,orderby会将数据分发到同一个Reducer里,强制使用limit可以防止Reducer额外执行很长一段时间限制笛卡尔积查询。因为Hive不会把where语句转化为on语句 JVM重用 ➢默认配置是使用派生的JVM来执行任务,这种方式下JVM的启动过程会造成很大的开销,尤其是task很多的情况。JVM实例的使用次数可以在hadoop的mapred-site.xml文件中进行配置,通常在10-20之间。 set mapred.job.reuse.jvm.num.tasks;默认为1推测执行 ➢负载不均衡或资源分布不均等原因,任务之间的运行速度不一致。对于明显慢的task,采用推测执行(speculative Execution)机制,推测出拖后腿的任务并启动一个备份任务,和原始任务共同处理同一份数据,最终选用先成功运行完成的计算结果作为最终结果文件压缩 ➢针对IO密集型的job,采取文件压缩的方式增加吞吐量和性能,减少载入内存的数据量;计算密集型的job不适合,因为压缩和解压会消耗CPU的使用 ➢常见的文件存储格式有:TextFile、Sequence Files、RCFile、ORCFile、Parquet 在这里插入图片描述合并小文件 小文件的产生有三个地方,map输入,map输出,reduce输出,小文件过多也会影响hive的分析效率:

设置map输入的小文件合并

set mapred.max.split.size=256000000; //一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并) set mapred.min.split.size.per.node=100000000; //一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并) set mapred.min.split.size.per.rack=100000000; //执行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

设置map输出和reduce输出进行合并的相关参数:

//设置map端输出进行合并,默认为true set hive.merge.mapfiles = true //设置reduce端输出进行合并,默认为false set hive.merge.mapredfiles = true //设置合并文件的大小 set hive.merge.size.per.task = 256*1000*1000 //当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。 set hive.merge.smallfiles.avgsize=16000000 表的优化 二、表的优化

数据倾斜在后面,此处不包含

大表+大表 ➢空key过滤或空key转换

Count(Distinct)去重统计 ➢数据量大时,一个Count(Distinct)对应的ReduceTask需要处理的数据量太大,导致job很难完成。因此需要采用先Groupby再count的方式替代

避免笛卡尔积 ➢Hive只能使用1个Reducer完成笛卡尔积,会导致计算性能变低

行列过滤 ➢在select中只拿需要的列,尽量不用select *;先子查询,将查询后的表再关联主表,提高效率,如果直接join再用where子句过滤,则会先全表关联再过滤,效率较低

动态分区调整 ➢不同分区在不同文件夹内,在很多情况下可以避免全表扫描,提高查询效率

谓语下推 ➢像where等句,提前处理,减少下游语句的负载量

select * from ( select id,name from test where dt>=20200201 and dt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有