如何减少查询中的容器数量
how to reduce the number of containers in the query
我有一个查询使用了很多容器和很多内存。 (使用了 97% 的内存)。
有没有办法设置查询中使用的容器数量并限制最大内存?
Tez 上的查询是 运行。
提前致谢
控制Mappers的数量:
映射器的数量取决于各种因素,例如数据在节点之间的分布方式、输入格式、执行引擎和配置参数。另见 How initial task parallelism works
MR 使用 CombineInputFormat,而 Tez 使用分组拆分。
特兹:
set tez.grouping.min-size=16777216; -- 16 MB min split
set tez.grouping.max-size=1073741824; -- 1 GB max split
增加这些数字以减少映射器的数量运行。
另外Mappers在数据所在的数据节点上运行,这就是为什么手动控制mappers的数量不是一件容易的事,并不总是可以组合输入。
控制Reducers数量:
根据
确定的reducer个数
mapreduce.job.reduces
- 每个作业的默认减少任务数。通常设置为接近可用主机数的质数。
mapred.job.tracker
为 "local" 时忽略。 Hadoop 默认将此设置为 1,而 Hive 使用 -1 作为其默认值。通过将此 属性 设置为 -1,Hive 将自动计算出 reducer 的数量。
hive.exec.reducers.bytes.per.reducer
- Hive 0.14.0 及更早版本中的默认值为 1 GB。
也hive.exec.reducers.max
- 将使用的减速器的最大数量。如果mapreduce.job.reduces
为负数,Hive在自动判断reducer个数时会以此为最大reducer个数。
只需设置hive.exec.reducers.max=<number>
即可限制reducer数量运行.
如果要增加 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,使用向量化执行,如果你正在编写分区 table 添加 distribute by partitin key
以减少 reducer 上的内存消耗,当然要写好 sql。
我有一个查询使用了很多容器和很多内存。 (使用了 97% 的内存)。 有没有办法设置查询中使用的容器数量并限制最大内存? Tez 上的查询是 运行。
提前致谢
控制Mappers的数量:
映射器的数量取决于各种因素,例如数据在节点之间的分布方式、输入格式、执行引擎和配置参数。另见 How initial task parallelism works
MR 使用 CombineInputFormat,而 Tez 使用分组拆分。
特兹:
set tez.grouping.min-size=16777216; -- 16 MB min split
set tez.grouping.max-size=1073741824; -- 1 GB max split
增加这些数字以减少映射器的数量运行。
另外Mappers在数据所在的数据节点上运行,这就是为什么手动控制mappers的数量不是一件容易的事,并不总是可以组合输入。
控制Reducers数量:
根据
确定的reducer个数mapreduce.job.reduces
- 每个作业的默认减少任务数。通常设置为接近可用主机数的质数。
mapred.job.tracker
为 "local" 时忽略。 Hadoop 默认将此设置为 1,而 Hive 使用 -1 作为其默认值。通过将此 属性 设置为 -1,Hive 将自动计算出 reducer 的数量。
hive.exec.reducers.bytes.per.reducer
- Hive 0.14.0 及更早版本中的默认值为 1 GB。
也hive.exec.reducers.max
- 将使用的减速器的最大数量。如果mapreduce.job.reduces
为负数,Hive在自动判断reducer个数时会以此为最大reducer个数。
只需设置hive.exec.reducers.max=<number>
即可限制reducer数量运行.
如果要增加 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,使用向量化执行,如果你正在编写分区 table 添加 distribute by partitin key
以减少 reducer 上的内存消耗,当然要写好 sql。