目录
- 小文件处理的参数
- 数据倾斜参数
- 分区表参数
- 并行执行参数
代码块中的参数值都是cdh 5.7的默认值.
查看hive配置的方式为
[root@namenode1 ~]# hive -e "set"| grep hive.merge.mapredfiles
- 1,小文件处理的参数
hive.merge.mapredfiles=false //reduce输出是否合并
hive.merge.mapfiles=true //map输出是否合并
解决办法:
1.修改参数 hive.merge.mapredfiles=true
2.通过mapreduece的办法生成一张新的分区表,此时生成的文件变成了每个分区一个文件
小结:
正确处理hive小文件 是 控制map数的一个重要环节.处理的不好 会大大影响任务的执行效率.
- 2,数据倾斜参数
hive.map.aggr=true //map端是否聚合
hive.map.aggr.hash.force.flush.memory.threshold=0.9
hive.map.aggr.hash.min.reduction=0.5
hive.map.aggr.hash.percentmemory=0.5
hive.groupby.skewindata=false //是否开启倾斜优化
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce个数
set hive.groupby.mapaggr.checkinterval=100000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true
set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true
解决办法:
1.通过修改参数
hive.map.aggr=true // map端聚合,相当于combiner
hive.groupby.skewindata=true //数据倾斜优化,为true时,查询计划生产两个mapreduce,第一个mr随机处理,第二个按照业务主键聚合,
- 3,分区表参数
hive.exec.dynamic.partition=true //是否允许动态分区
hive.exec.dynamic.partition.mode=strict //strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的 .另一个值为 nonstrict
//以下是配置阀值
hive.exec.max.created.files=100000 //一个DML操作可以创建的文件数
hive.exec.max.dynamic.partitions=1000 //一个DML操作可以创建的最大动态分区数
hive.exec.max.dynamic.partitions.pernode=100 //each mapper or reducer可以创建的最大动态分区数
- 4,并行执行参数
hive.exec.parallel=false; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
对于同一个SQL产生的JOB,如果不存在依赖的情况下,将会并行启动JOB。