Hive的计算任务由MapReduce完成,故并行度的调整需要分为Map端和Reduce端。
Map端并行度
Map端的并行度,也就是Map的个数。
是由输入文件的切片数决定的。一般情况下,Map端的并行度无需手动调整。
但是也会有特殊情况
小文件过多
按照Hadoop默认的切片策略,一个小文件会单独启动一个map task负责计算。
若查询的表中存在大量小文件,则会启动大量map task,造成计算资源的浪费。
这种情况下,可以使用Hive提供的CombineHiveInputFormat,多个小文件合并为一个切片,从而控制map task个数。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
map端有复杂的查询逻辑
若SQL语句中有正则替换、json解析等复杂耗时的查询逻辑时,map端的计算会相对慢一些。
若想加快计算速度,在计算资源充足的情况下,可考虑增大map端的并行度,令map task多一些,每个map task计算的数据少一些。
--一个切片的最大值
set mapreduce.input.fileinputformat.split.maxsize=256000000;
Reduce端并行度
Reduce端的并行度,也就是Reduce个数
可由用户自己指定,也可由Hive自行根据该MR Job输入的文件大小进行估算
--指定Reduce端并行度,默认值为-1,表示用户未指定
set mapreduce.job.reduces;
--Reduce端并行度最大值
set hive.exec.reducers.max;
--单个Reduce Task计算的数据量,用于估算Reduce并行度
set hive.exec.reducers.bytes.per.reducer;
若指定参数mapreduce.job.reduces的值为一个非负整数,则Reduce并行度为指定值。
否则,Hive自行估算Reduce并行度