Map和Reduce
启动和初始化map和reduce都会花费资源和时间
map个数,取决于切片数量
1当输入数据量少于参数(128m),只有一个map,不用调整,
若该表字段少,行数多,可以适当调高map数提高效率。
2若map数较多,查看到很多split大小是小于128,有小文件情况,这个时候除了jvm重启,考虑减少map数量参数设置。通过减少map数,减少资源启动优化。
reduce数
reduce,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量
特殊情况
hql导致只有一个reduce
order by
count(distinct )
笛卡尔积
或sql中限制分区count()但没有使用group by
这些情况reduce只有一个需要尽量避免。
hive系统会自动估算reduce
实际操作很少对reduce调整,无法准确调整出性能优化,如出现oom,内存溢出这种情况会适当提高reduce数
合理设置map个数
建议值
128MB~512MB/Task
调大map个数
调小mapred.max.split.size
调小map个数
调大mapred.max.split.size
合理设置reduce个数
reducers = Math.min(maxReducers, totalInputFileSize/bytesPerReducer)
maxReducers由参数hive.exec.reducers.max设置,默认999
bytesPerReducer由参数hive.exec.reducers.bytes.per.reducer 设置,默认1G
小文件合并——输入合并
set hive.input.format = org.apache.hadoop.hive.ql.io.combinehiveinputformat;
set mapred.max.split.size = 536870912; //512MB
set mapred.min.split.size = 134217728; //128MB
hive中在给旧表新增字段的时候,使用cascade和不使用cascade的区别:
增加列不带CASCADE,之前已存在的分区,该字段返回NULL,即使是使用OVERWRITE重新覆盖分区,仍为空。
如果添加列时增加关键字CASCADE,旧分区overwrite覆盖时会有数据
set livy.session.conf.spark.hadoop.hive.exec.dynamic.partition=true;
set livy.session.conf.spark.hadoop.hive.exec.dynamic.partition.mode=nonstrict;