1.fetch(hive可以避免MapRedice)对于hive可以简单地读取employee对应的储存目录下的文件,然后输出查询结果到控制台,修改hive.fetch.task.conversion的参数为more即可
2.本地模式 设置数据出入量,设置local mr的最大输入文件个数,当输入文件滆湖小于这个值时采用local mr的方式,默认为4
3.表的优化
1.小表join大表
将key相对分散,并且数据量小的表join的左边,这个可以有效减少内存溢出错误发生的几率,在进一步可以使用group让小的维度表(1000条以下的记录条数)先进内存,在map端完成reduce
mapjoin(map端执行join)
启动方式一:(自动判断)
set.hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize 默认值是25mb
小表小于25mb自动启动mapjoin
启动方式二:(手动)
select /*+mapjoin(A)*/ f.a,f.b from A t join B f on (f.a=t.a)
mapjoin支持不等值条件
reduce join不支持在ON条件中不等值判断
2.多个表关联时,最好分拆成小段,避免大sql(无法控制中间job)
3.大表join大表
(1)过滤掉为空key的值
(2)空key转换,对应的数据不是异常数据是,必须要包含join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,是的数据随机地分到不同的reduce上.
第四种:group的调优
(1)是否在Map端进行聚合,默认为True
set hive.map.aggr = true;
(2)在Map端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval = 100000;
(3)有数据倾斜的时候进行负载均衡(默认是false)
set hive.groupby.skewindata = true;
(4)开启Mapjoin功能
set hive.auto.convert.join=true;默认为true
group By在默认情况下,map阶段同一key数据分发给一个reduce,当一个key数据过大时,就倾斜了.
1)开启Map端聚合参数设置
(1)是否在map端进行聚合,默认为true
(2)在map端进行聚合操作的条目数目
(3)有数据倾斜的时候,进行负载均衡
第五种.count distinct尽量转换成count group by来完成
hive.group.skewindata=true; 如果是group by过程出现倾斜,应该设置为true
set hive.groupby.mapaggr.checkinterval=100000; 这个是group的键对应的记录条数超过这个值则会进行优化
第六种..避免笛卡尔积 join后面的on条件不能无效或者不带on条件
第其种..使用分,列裁剪,不要使用select * 如果查询的是分区表,要加上分区条件
第八种..动态分区的调整
就是以第一个表的分区规则,来对应第二个表的分区规格,将第一个表的所有分区,全部拷贝到第二个表中,第二个表在加载数据的时候,不需要指定分区了,直接用第一个表的分区即可.
(1)开启动态分区功能
(2)设置为非严格模式
(3)在所有执行mr的节点上,最大一共可以创建多少个动态分区
(4)在每个执行mr的节点上,最大可以创建多少个动态分区
(5)整个mr job中,最大可以创建多少个hdfs文件
(6)当有空分区生成是,是否抛出异常,一般不需要设置
第九种..设置hive输入数据的小文件的合并,设置map的个数以及reduce个数
第十种..开启hive任务的并发执行 设置hive.exec.parallel值为true,就可以开启并发执行
第十一种..设置hive的严格模式
1)对于分区表,除非where语句汇总含有分区字段过滤条件来限制范围,否则不允许执行
2)对于使用了order by语句的查询,要求必须使用limit语句
3)限制笛卡尔积的查询
第十二种.设置jvm的重用
jvm重用可以使得jvm实例在同一个job中重新使用N次
mapred.job.reuse.jvm.num.tasks=10;
第十三种调优:关闭推测执行
第十四种调优:压缩和文件存储格式,压缩使用snappy 文件存储格式使用ORC
hive调优方式
版权声明:本文为Naerdoy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。