【问题标题】:how to reduce the number of containers in the query如何减少查询中的容器数量
【发布时间】:2019-08-22 03:36:05
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: hive mapreduce ambari apache-tez hive-configuration


    【解决方案1】:

    控制 Mapper 的数量:

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

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

    Mapper 也在数据所在的数据节点上运行,这就是为什么手动控制 mapper 的数量不是一件容易的事,并不总是可以组合输入。

    控制 Reducer 的数量:

    reducer个数根据

    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 在自动确定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,使用矢量化执行,如果你正在编写分区表,则添加 distribute by partitin key 以减少 reducer 上的内存消耗,当然还要编写好的 sql。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多