Hive数据库几个优化的地方
两个表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
- MyBatis笔记03 - 几个可以优化的地方
- mybatis几个可以优化的地方
- 链接数据库时,几个可以设置timeout的地方
- 数据库优化的几个阶段
- 【原创】数据库优化的几个阶段
- 数据库的几个问题存储过程触发器函数创建以及sql优化
- 网站优化首页样式布局需要注意的几个地方
- 迁移 Qt4 至 Qt5 的几个主要环节(数据库插件别拷错了地方)
- 03_几个可以优化的地方
- 优化数据库语句的几个简单技巧
- HIVE数据库查询优化
- 数据库优化的几个阶段
- HIVE 优化的几个切入点
- 几个简单的步骤大幅提高Oracle性能--我优化数据库的三板斧
- 几个数据库查询优化小技巧
- zen cart 模板 站内优化需要修改的几个地方
- 优化数据库前一般要注意的几个问题
- Mysql 大数据量高并发的数据库优化
- jdbc连接数据库的优化和防止注入
- mysql limit分页的坑 数据库分页优化