一、Hive参数类优化
控制MapReduce的map数 ---建议设置
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
但是当文件行数过多,上面合并设置反而会导致并发减小,导致速率变慢,也可以进行合并,合并后再进行设置合并文件的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
set mapreduce.input.fileinputformat.split.minsize=256000000;
set mapreduce.input.fileinputformat.split.maxsize=256000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=256000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=256000000;
以上表示合并小文件,大于文件块大小256M的按照256来分割,把那些小于256M的(包括小文件和分割大文件剩下的)进程合并
控制MapRduce的reduce数 ---建议设置
一种方法:
set mapred.reduce.tasks=10;
另外一种:
set hive.exec.reducers.max=999;
set hive.exec.reducers.bytes.per.reducer=512000000;
建议第二种.
资源类---建议设置
setmapreduce.map.memory.mb=4096;
set mapreduce.reduce.memory.mb=4096;
set mapreduce.map.cpu.vcores=1;
set mapreduce.reduce.cpu.vcores=1;
set yarn.app.mapreduce.am.resource.cpu-vcores=1;
set mapreduce.map.java.opts=-Xms3024m -Xmx024m;
set mapreduce.reduce.java.opts=-Xms024m -Xmx3024m;
set mapreduce.task.io.sort.mb=200; #mr程序进行合并排序操作的时候或者mapper写数据的时候,内存大小
set mapreduce.task.io.sort.factor=500; #mr程序进行合并排序的时候,打开的文件数量
set mapreduce.job.reduce.slowstart.completedmaps=0.60;
set mapreduce.reduce.shuffle.parallelcopies=500; #mr程序reducer copy数据的线程数
set mapreduce.reduce.shuffle.input.buffer.percen=0.7;
mr job 并行执行,JVM重用 ---可选
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8
set mapreduce.job.jvm.numtasks=20;
压缩 ---可选
# 启用结果输出压缩(接口表,结果表不用,中间表考虑使用)
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapred.output.compression.type=BLOCK;
# 启用中间数据压缩
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
数据倾斜---可选,未必能解决所有
set hive.optimize.skewjoin=true;
set hive.skewjoin.key=10000000;
set hive.optimize.skewjoin.compiletime=true; #优化数据倾斜
set hive.groupby.skewindata=true; #进行负载均衡减少数据倾斜
启动本地模式执行MapReduce---可选,一般在测试阶段使用,会增加hs2服务压力
set hive.exec.mode.local.auto=true;
set hive.exec.mode.local.auto.inputbytes.max=128MB; #不启动本地模式的最大输入文件大小
set hive.exec.mode.local.auto.tasks.max=4; #不启用本地模式的task最大个数
set hive.exec.mode.local.auto.input.files.max=4; #不启用本地模式的文件最大个数
启用向量化 ---可选
从单行处理数据改为批量处理方式,具体来说是一次处理1024行而不是原来的每次只处理一行
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;
set hive.vectorized.execution.reduce.groupby.enabled=true;
选择计算引擎
set hive.execution.engine=tez;
set mapreduce.framework.name=yarn-tez;
二、SQL优化类
LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现
select *
from wedw_dw.t_user t1
where t1.user_id in (select user_id from wedw_dw.t_order) ;
变更为
select *
from wedw_dw.t_user t1
left semi join wedw_dw.t_order t2
on t1.user_id = t2.user_id;
采用parquet存储格式
create table test_par_snappy stored as parquet tblproperties ("parquet.compression"="SNAPPY") as
select * from xx;
三、平台优化类
1、批量申请资源
如何控制一个nodemanager里Container的数量呢?
yarn.scheduler.fair.assignmultiple
true
是否允许NodeManager一次分配多个容器
yarn.scheduler.fair.max.assign
如果允许一次分配多个,一次最多可分配多少个,这里按照一个最小分配
yarn.scheduler.minimum-allocation-mb
4gb来计算总共内存120/4=30给20即可