您的位置:首页 > 数据库

Hive数据库几个优化的地方

2020-07-14 06:13 204 查看

两个表join查询场景

可以把小表放入内存,然后再对比较大的表格进行map操作,此时join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。

Hive中的设置命令:
set hive.auto.convert.join=true;
Set hive.mapjoin.smalltable.filesize = 25M

Join语句的优化

优化前:select m.cid,u.id form order m join customer u on m.cid=u.id where m.dt=’20160801’;
优化后:select m.cid,u.id from (select cid from order where dt=’20160801’)m join customer u on m.cid = u.id
表连接查询 Join语句先做笛卡尔积,然后从笛卡尔积中找出两表匹配的记录,再从上次符合条件的记录中筛选;
子查询作为结果集表查询,先从单表查询出符合条件的记录,再次与另一表做笛卡尔积,最后从笛卡尔积中筛选出符合条件的记录。
经过验证:子查询语句的执行效率,比两表直接join查询,效率高

Group by 语句优化

Group by语句相当于MapReduce中的Patition操作,Group by 有多少个分组,就有多少个分区,每一个分区对应一个ReduceTask。由于每组的数据不等,ReduceTask处理效率不同容易产生数据倾斜。可以采用小表缓存、分而治之的思想处理数据倾斜的问题。针对单表,不采用小表缓存。对于分而治之是这样的,例如统计文件中每个单词出现的次数:

  • 文件切片中的每个单词,拼接一个等长度的随机数
    按照org.apache.hadoop.mapreduce.lib.partition.HashPartitioner中提到的获取分区的算法,这样分配到每个分区的单词个数大致相等。
  • 每个分区中,每个单词去掉随机数后,完成一次汇总。例如:一个分区中每个单词出现的次数: china 5,American 3,english 4
  • 再经过一次MapReduce操作,就能统计出整个文件中每个单词出现的次数

Count distinct 优化

优化前:select count(distinct id )from tablename
去重操作发生在Reduce端。聚合函数存在的情况下,强制使用一个ReduceTask处理数据,虽然通过set mapred.reduce.tasks可以设置ReduceTask的数量,但由于聚合函数的存在,数量设置不起作用。

优化后:select count(*) from (select distinct id from tablename)tmp;
去重阶段,可以增大ReduceTask并发数,并行处理Map输出;
汇总阶段,只负责汇总,单一的ReduceTask,不会成为任务瓶颈。

调整MapTask任务数

Hive中通过命令:
set mapred.max.split.size=134217728单位字节(128MB)。
来设置文件切片大小,从而调整MapTask任务数。

JVM重利用

  • 客户端程序提交一个Job任务给JobTracker,JobTracker校验任务信息通过,分配一个JobId给客户端程序;
  • 客户端提交jar可执行程序给HDFS;
  • JobTracker将任务分解为MapTask 和 ReduceTask。等待TaskTracker的心跳
  • JobTracker接收到心跳信息,按照数据本地化策略,将MapTask分配到对应的TaskTracker节点上,ReduceTask分配到空闲节点上
  • TaskTracker根据NameNode的元数据,从DataNode上下载jar包,启动JVM进程去执行MapTask,执行结束,关闭JVM进程。再启动一个新的JVM进程去执行新的MapTask。
    这个地方,在hive中可以通过命令:set mapred.job.reuse.jvm.num.tasks=20
    设置TaskTracker处理了20个任务后,关闭JVM进程

启用严格模式

set hive.mapred.mode=strict 设置严格模式,改成unstrict则为非严格模式
严格模式下,分区表要使用分区字段来限制;order by 语句要用limit来限制;

关闭推测执行机制

推测执行机制:假设有大小不一的任务在处理,小任务能很快的处理完。大任务也称慢任务,执行时间比较长。此时可以把这个单任务重新分配给一个节点来执行,哪个节点执行完成,就采用哪个节点的处理结果,同时kill调相同任务的进程。
关闭推测执行机制:存在数据倾斜的任务,建议关闭推测执行机制,因为再开一个节点处理,也不能解决慢任务的问题;

Hive中关闭推测执行的命令:
set mapreduce.map.speculative=false
set mapreduce.reduce.speculative=false
set hive.mapred.reduce.tasks.speculative.execution=false

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: