hive 数仓开发任务优化

Hive性能优化

项目:基于hive的dmp数据仓库搭建
Hive:apache开源组件,基于hdfs文件系统及mapreduce计算引擎的关系型数据库,弱索引(目前还没怎么有用过),基本不支持实施数据处理,适用于大数据量的存储及离线的大数据量的数据挖掘
优化:
1:调度优化,模型优化
资源开放的情况下,模型日常T+1调度模型图如下(数据流图):

hive 数仓开发任务优化_第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:输入文件的数量

  1. 默认map个数
    如果不进行任何设置,默认的map个数是和blockSize相关的,defaultNum=totalSize/blockSize
  2. 期望个数
    可以通过参数mapred.map.tasks来设置期望的map个数,但这个只有在大于默认map个数的时候才生效,goalNum=mapred.map.tasks
  3. 设置处理的文件大小
    可以通过mapred.min.split.size设置每个task处理的文件大小,但是这个大小只有在大于blockSize的时候才会生效
    splitSize=max(mapred.min.split.size,blockSize)
    splitNum=totalSize/splitSize
  4. 计算的map个数
    computeMapNum=min(splitNum,max(defaultNum,goalNum))

除了以上这些配置外,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;适合于数据量少的 操作

你可能感兴趣的:(hive)