首页 > 解决方案 > 相对于输入分割长度的 Tez 容器大小估计

问题描述

所以 - 当 Tez 选择要运行的映射器数量时,它会查看可以并行运行的容器数量(可用插槽)、波形因子、数据的机架位置、FileInputFormat 最大拆分大小、Tez 最大分组大小、可以进入拆分,要获取的列的未压缩总数据大小等 - 它不查看 tez 容器大小。

因此,映射器数量的计算导致每个映射器输入狭缝长度字节 - 可以估计(在运行作业之前)。

但是 - 如何估计处理输入拆分所需的总容器大小(内存)?

我了解所需的内存将取决于

  1. 输入分割长度原始(字节)
  2. 压缩(百分比?)
  3. 将应用于记录的任何 UDF(可能可以忽略不计)
  4. 使用时的矢量化(布尔值)
  5. 如果需要,映射连接(布尔值)
  6. 根据需要排序(布尔值)
  7. 写入磁盘之前使用的缓冲区(百分比?)

但是 - 如何根据输入拆分字节估计容器大小或更确切地说容器内所需的堆空间?

一种方法是在一次运行后查看映射器任务的已提交堆字节。

但是是否有任何公式可以根据上述因素或任何其他因素从 INPUT_SPLIT_LENGTH_BYTES 估计 COMMITTED_HEAP_BYTES ?

标签: hadoophivehadoop-yarngoogle-cloud-dataprocapache-tez

解决方案


我认为每个映射器的输入分割长度不会直接影响 Tez 容器的大小。这只是意味着拆分将由一个映射器处理,但这并不意味着整个拆分将立即加载到内存中。所以分割长度可能比运行映射器的 Tez 容器大小大得多。

作为一般准则,

将 Tez 容器大小设置为与 YARN 容器大小 yarn.scheduler.minimum-allocation-mb 相同或小倍数(1 或 2 倍),但永远不要超过 yarn.scheduler.maximum-allocation-mb。您希望为多个容器旋转留出空间。

在此文档中查看更多详细信息。


推荐阅读