Hive性能优化
项目:基于hive的dmp数据仓库搭建
Hive:apache开源组件,基于hdfs文件系统及mapreduce计算引擎的关系型数据库,弱索引(目前还没怎么有用过),基本不支持实施数据处理,适用于大数据量的存储及离线的大数据量的数据挖掘
优化:
1:调度优化,模型优化
资源开放的情况下,模型日常T+1调度模型图如下(数据流图):
数据模型每层的调度要足够灵活,尽量避免由于资源问题造成的任务pending,比如,dwi曾每天同时有20个任务进行调度,DWR层有10个任务,尽量做到充分利用资源,但是也要避免任务pending,DWI调度资源相对轻松,我们可以把DWR的没有前置依赖的任务拿过去一快跑,尽量灵活,适当可以拆分任务,拿出没有依赖的任务提前跑等。
2:代码优化
简单举个例子:1张90亿行为数据表(包括点击,浏览,投诉等数据)action,最重要把数据剥离出来,落地成不同的表(点击表,浏览表,投诉表)
原始代码:
Insert into table click select * from action where content=”点击”;
Insert into table browse select * from action where content=”浏览”;
优化后代码:
From action
Insert into table click select * where content=”点击”
Insert into table click select * where content=”浏览”;
这样效率上就会有大大提升,因为mapreduce在shuffle时是很慢的,第一种方式,相当于从磁盘读了两遍90亿的数据,第二种只读一次,效率有很到提升。
3:参数优化
(1) 资源分配
Mapredue的最小资源单元为container,container包括memory及vcores,所以直接与mapreduce挂钩的资源在yarn上是container,下面是具体的container及mapreduce资源占用设置:
Container:(配置在hadoop的yarn-site.xml里配置)
配置文件 配置项名称 配置项值
yarn-site.xml yarn.nodemanager.resource.memory-mb = Containers个数* 每个Container内存,机器总内存
yarn-site.xml yarn.scheduler.minimum-allocation-mb = 每个Container内存
yarn-site.xml yarn.scheduler.maximum-allocation-mb = Containers个数* 每个Container内存
mapred-site.xml mapreduce.map.memory.mb = 每个Container内存
mapred-site.xml mapreduce.reduce.memory.mb = 2 * 每个Container内存
mapred-site.xml mapreduce.map.java.opts = 0.8 * 每个Container内存
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * 每个Container内存
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb = 2 * 每个Container内存
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts = 0.8 * 2 * 每个Container内存
yarn监控界面中可以在如下位置看到资源分配(自己服务器是默认值,没做配置):
(2) mapreduce的map切分设置(reduce同理):
每个map内存设置(单位为B):
set mapred.max.split.size=50000000;
set mapred.min.split.size.per.node=50000000;
set mapred.min.split.size.per.rack=50000000;
这样就能控制我们map的切分大小为大约50m
计算Map个数:
blockSize:HDFS的文件块大小
totalSize:输入文件大小
inputFileNum:输入文件的数量
除了以上这些配置外,MapReduce还要遵循一些原则。MapReduce的每一个map处理数据是不能跨越文件的。也就是说minMapNum>=inputFileNum,所以,最终的map个数应该为:
mapNum=max(computeMapNum,inputFileNum)
(3) 控制任务并行:
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
对于没有依赖的任务并行执行,例如union all,有显著优化效果,第二个参数主要控制任务并发数
(4) 数据倾斜参数优化:
1:如果是group by过程出现倾斜 应该设置为true
Set hive.groupby.skewindata=true;
2:group时预先取100000条数据聚合,如果聚合后的条数/100000>0.5,则不再聚合
hive.groupby.mapaggr.checkinterval = 100000 (默认)hive.map.aggr.hash.min.reduction=0.5(默认)
3:如果是join 过程出现倾斜应该设置为true
Set hive.optimize.skewjoin=true;
4:这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
Set hive.skewjoin.key=100000;
5:map join,一般出现数据倾斜都是在reduce端,如果在map端就做了join会很好的避免问题的出现
set hive.auto.convert.join=true;(目前版本这个参数是默认打开的)
set hive.mapjoin.smalltable.filesize=25000000;(如果join时小表大小小于该阀值,会自动进行map join,我们也可以控制这个阀值,达到优化目的)
6:数据倾斜问题原因:数据在join时存在笛卡尔积,空值或重复值过多,所以在数据处理时最好先做好数据过滤,清洗
(5) Jvm重用:
set mapred.job.reuse.jvm.num.tasks=20,避免重复的关闭重启
(6) 本地模式:
set hive.exec.mode.local.auto=true;适合于数据量少的 操作