如何减少查询中的容器数量

问题描述 投票:1回答:1

我有一个查询使用了很多容器和大量内存。 (使用的内存的97%)。有没有办法设置查询中使用的容器数量并限制最大内存?查询正在Tez上运行。

提前致谢

hive mapreduce ambari apache-tez
1个回答
2
投票

控制Mappers的数量:

映射器的数量取决于各种因素,例如数据如何在节点之间分配,输入格式,执行引擎和配置参数。另见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

增加这些数字以减少映射器的运行次数。

Mappers也在数据所在的数据节点上运行,这就是为什么手动控制映射器的数量并不是一件容易的事,也不总是能够组合输入。

控制减速器的数量:

根据确定的减速器数量

mapreduce.job.reduces
  • 每个作业的默认减少任务数。通常设置为接近可用主机数的素数。当mapred.job.tracker是“本地”时忽略。 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将在自动确定减速器数量时将其用作减速器的最大数量。

只需设置hive.exec.reducers.max=<number>即可限制运行的减速器数量。

如果要增加reducer并行度,请增加hive.exec.reducers.max并减少hive.exec.reducers.bytes.per.reducer。

Memory settings

set tez.am.resource.memory.mb=8192;
set tez.am.java.opts=-Xmx6144m;
set tez.reduce.memory.mb=6144;
set hive.tez.container.size=9216;
set hive.tez.java.opts=-Xmx6144m;

默认设置意味着实际的Tez任务将使用映射器的内存设置:

hive.tez.container.size = mapreduce.map.memory.mb
hive.tez.java.opts = mapreduce.map.java.opts

阅读本文了解更多详情:Demystify Apache Tez Memory Tuning - Step by Step

我建议先优化查询。如果可能的话,使用map-joins,使用矢量化执行,如果你正在编写分区表来增加distribute by partitin key以减少reducers上的内存消耗并且当然写出好的sql。

© www.soinside.com 2019 - 2024. All rights reserved.