概述
前言:这是个老生常谈的话题,也是几乎面试必问的问题,以下是个人整理的心得,各位看官可以借鉴参考一下
主要从三个方面来说
1.参数调优
2.sql调优
3.资源调优
1.参数调优
本地模式:当数据量较小的时候,启动分布式处理数据会比较慢,启动时间较长,不如本地模式快,用下面的参数来调整
SET hive.exec.mode.local.auto=true; -- 默认 false
SET hive.exec.mode.local.auto.inputbytes.max=50000000; --输入文件的大小小于 hive.exec.mode.local.auto.inputbytes.max 配置的大小
SET hive.exec.mode.local.auto.input.files.max=5; -- 默认 4
map任务的数量小于 hive.exec.mode.local.auto.input.files.max 配置的大小
jvm重用:MR查询过程中过多的小文件又会造成启动过多的Mapper Task, 每个Mapper都是一个后台线程,会占用JVM的空间
SET mapreduce.job.jvm.numtasks=5;
严格模式
hive.mapred.mode=nostrict
查询分区表时不限定分区列的语句;
两表join产生了笛卡尔积的语句;
用order by来排序,但没有指定limit的语句
并行执行:Hive的查询会转为stage,这些stage并不是相互依赖的,可以并行执行这些stage,使用下面的参数
SET hive.exec.parallel=true; -- 默认false
SET hive.exec.parallel.thread.number=16; -- 默认8
合并小文件
在map执行前面,先合并小文件来减少map数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在任务结束后,合并小文件
# 在 map-only 任务结束时合并小文件,默认true
SET hive.merge.mapfiles = true;
# 在 map-reduce 任务结束时合并小文件,默认false
SET hive.merge.mapredfiles = true;
# 合并文件的大小,默认256M
SET hive.merge.size.per.task = 268435456;
# 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
SET hive.merge.smallfiles.avgsize = 16777216;
2.SQL调优
1 count(distinct col)慎用 使用group By
distinct会将b列所有的数据保存到内存中,形成一个类似hash的结构,速度是十分的块;但是在大数据背景下,因为b列所有的值都会形成以key值,极有可能发生OOM
2.sort by 代替order
By
3. mapjoin优化
/*mapjoin(a) */ a是小表,常规的设置阈值为25m为小表,跟大表做关联,发生数据倾斜,可以这么操作
4.列裁剪(避免使用select *)
5.
谓词下推(where之前过滤条件)
6. union all 太多,也是对表拆分,比如五个表union all,可以先两两结合落表,在进行关联
7. 空值单独过滤处理(因为一个空值也是key,对应的value太多了)一个表内有许多空值时会导致MapReduce过程中,空成为一个key值,对应的会有大量的value值, 而一个key的value会一起到达reduce造成内存不足
资源调优
资金允许的情况下,扩容扩存;
可以选用更好的引擎,比如spark ,impala;
在表存储的时候,选择更好的存储方案,比如parquent,seq,orc;
如果数据存储在小于块大小的小文件中,则可以使用SEQUENCE文件格式。如果要以减少存储空间并提高性能的优化方式存储数据,则可以使用ORC文件格式,而当列中嵌套的数据过多时,Parquet格式会很有用。因此,需要根据拥有的数据确定输入文件格式。
最后
以上就是沉默黑猫为你收集整理的hive优化到底应该怎么优化(面试必备)的全部内容,希望文章能够帮你解决hive优化到底应该怎么优化(面试必备)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复