Fetch
Hive中对某些情况的查询不必使用mapreduce,一些简单的查询,hive可以读取存储目录下的文件,然后输出查询结果到控制台,通过参数声明设置fetch参数,可以控制查询是否走mapreduce
set hive.fetch.task.conversion=none;//走mapreduce程序
set hive.fetch.task.conversion=more;//不走mapreduce
本地模式
大多数的job是需要hadoop提供完整的可扩展性来处理大数据集,不过有时候hive的输入数据非常小,在这种情况下,为查询触发执行任务时消耗的时间比实际的job的执行时间更多,因此可以通过本地模式在单台机器上处理所有的任务,对小数据集,可以明显的缩短执行时间
set hive.exec.model.local.auto=true;//开启本地模式
set hive.exec.model.local.auto=false;//关闭本地模式
聚合
默认情况下,map阶段同一key数据会分发给一个reduce,当一个key数据过大的时候就会发生数据倾斜,并不是所有的聚合操作都需要在reduce阶段完成,很多聚合操作可以现在map段进行部分聚合,最后在reduce阶段得出最终的结果
是否在map阶段进行聚合,默认为true
set hive.map.aggr=true;
在map阶段进行聚合操作的条目的数目
set hive.groupby.mapaggr.checkinterval=10000;
有数据倾斜的时候进行负载均衡
set hive.groupby.skewindata=true;
当开启负载均衡的时候,会开启两个job,第一个job,map的输出结果会随机分布到reduce中,灭个reduce做部分聚合操作,并输出结果,从而达到负载均衡的目的。第二个job再根据预处理的数据结果按照key分布到reduce中,最后完成最终的聚合操作
Count(distinct)
数据量小的时候无所谓,数据量大的时候,由于count distinct造作需要用一个reduce task来完成,这一个reduce task 需要处理的数据量太大,就会导致整个job难以完成,一般count distinct使用group by 再count的方式替换
select count(distinct s_id) from score;
select count(s_id) from score group by s_id;
笛卡尔积
尽量避免笛卡尔积,避免再join的时候不加on条件或者无效的on条件,hive只使用1个reduce来完成笛卡尔积
推测执行
在分布式集群环境下,因为程序Bug(包括Hadoop本身的bug),负载不均衡或者资源分布不均等原因,会造成同一个作业的多个任务之间运行速度不一致,有些任务的运行速度可能明显慢于其他任务(比如一个作业的某个任务进度只有50%,而其他所有任务已经运行完毕),则这些任务会拖慢作业的整体执行进度。为了避免这种情况发生,Hadoop采用了推测执行(Speculative Execution)机制 ,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。
set mapred.map.tasks.speculative.execution=true
set mapred.reduce.tasks.speculative.execution=true
set hive.mapred.reduce.tasks.speculative.execution=true;
当然,如果用户因为数据输入量很大而需要执行长时间的map或reduce task,那么启动推测执行会造成很大的资源浪费。
并行执行
Hive会将一个查询转化为一个或者多个阶段,默认情况下,Hive一次只会执行一个阶段,不过某个特定的job可能包含众多的阶段,而这些阶段可能并非完全相互依赖,也就是说有些阶段可以并行执行,这样可以使得整个job的执行时间缩短,通过设置hive.exec.parallel,就可以开启并发执行,在共享集群中,如果job中并行阶段增多,那么集群利用率就会增加。当然,只有在集群中有空闲资源的时候才会有优势
set hive.exec.parallel=true;
严格模式
Hive提供了一个严格模式,可以防止用户执行那些可能意向不到的不好的影响的查询。
通过设置属性hive.mapred.mode值为默认是非严格模式nonstrict 。开启严格模式需要修改
hive.mapred.mode值为strict,开启严格模式可以禁止3种类型的查询。
1.对于分区表,在where条件中必须含有分区字段作为过滤条件来限制范围,否则不允许执行
2.对于使用order by语句的查询,必须使用limit。因为order by 为了执行排序过程会将所有的结果数据发送同一个reduce中进行处理,强制添加limit语句可以防止reduce执行时间过长
3.限制笛卡尔积的查询 。对关系型数据库非常了解的用户可能期望在执行JOIN查询的时候不
使用ON语句而是使用where语句,这样关系数据库的执行优化器就可以高效地将WHERE语句
转化成那个ON语句。不幸的是,Hive并不会执行这种优化,因此,如果表足够大,那么这个
查询就会出现不可控的情况.
set hive.mapred.mode=strict;
set hive.mapred.mode=nonstrict;
本文主要探讨了Hive的性能调优方法,包括使用Fetch减少MapReduce操作、启用本地模式加速小数据集处理、优化聚合操作以平衡数据倾斜、解决Count(distinct)大数据量问题、避免笛卡尔积、理解推测执行的工作原理以及启用并行执行和严格模式来提高效率。通过这些策略,可以显著提升Hive查询的执行速度和集群资源利用。
1057

被折叠的 条评论
为什么被折叠?



