我总是对在hive中为特定任务创建多少映射器和减少而感到困惑。 例如,如果块大小= 128mb并且有365个文件,则每个文件映射到一年中的日期(文件大小=每个1 MB)。有基于日期列的分区。在这种情况下,在加载数据期间将运行多少个映射器和缩减器?
答案 0 :(得分:2)
<强>映射器:强>
映射器的数量取决于各种因素,例如数据如何在节点之间分配,输入格式,执行引擎和配置参数。另见:https://cwiki.apache.org/confluence/display/TEZ/How+initial+task+parallelism+works
MR使用CombineInputFormat,而Tez使用分组分割。
TEZ:
set tez.grouping.min-size=16777216; -- 16 MB min split
set tez.grouping.max-size=1073741824; -- 1 GB max split
的MapReduce:
set mapreduce.input.fileinputformat.split.minsize=16777216; -- 16 MB
set mapreduce.input.fileinputformat.split.minsize=1073741824; -- 1 GB
Mappers也在数据所在的数据节点上运行,这就是为什么手动控制映射器数量并不是一件容易的事情,并不总是可以组合输入。
<强>减速:强> 控制减速器的数量要容易得多。 根据
确定的减速器数量 mapreduce.job.reduces
- 每个作业的默认减少任务数。通常设置为接近可用主机数的素数。当mapred.job.tracker是&#34; local&#34;时忽略。 Hadoop默认将此值设置为1,而Hive使用-1作为其默认值。通过将此属性设置为-1,Hive将自动确定减少器的数量。
hive.exec.reducers.bytes.per.reducer
- Hive 0.14.0及更早版本的默认值为1 GB。
另外hive.exec.reducers.max
- 将使用的最大减速器数。如果mapreduce.job.reduces
为负数,Hive会在自动确定减速器数量时将其用作减速器的最大数量。
因此,如果您想增加Reducer并行度,请增加hive.exec.reducers.max
并减少hive.exec.reducers.bytes.per.reducer