问题描述
所以-当Tez选择要运行的映射器数量时,它将查看可以并行运行的容器的数量(可用插槽),波动系数,数据的机架位置,FileInputFormat最大拆分大小,Tez最大分组大小,条带可能会分裂,要提取的列的未压缩总数据大小等-它不会查看tez容器的大小。
因此,对映射器数量的计算会导致每个映射器输入狭缝长度字节-可以估算(在运行作业之前)。
但是-如何估算处理该输入拆分所需的总容器大小(内存)?
我了解所需的内存取决于
- 输入拆分长度原始数据(字节)
- 压缩(百分比?)
- 将应用于记录的任何UDF(可能忽略不计)
- 向量化(如果使用)(布尔值)
- 需要时加入地图(布尔值)
- 根据需要排序(布尔值)
- 写入磁盘之前使用的缓冲区(百分比?)
但是-如何根据输入的分割字节来估计容器的大小,或者容器中所需的堆空间?
一种方法是在运行一次后查看映射器任务的已提交堆字节。
但是,是否有任何公式可以根据上述因素或任何其他因素从INPUT_SPLIT_LENGTH_BYTES估计COMMITTED_HEAP_BYTES?
解决方法
我认为每个映射器的输入拆分长度不会直接影响Tez容器的大小。这只是意味着拆分将由一个映射器处理,但这并不意味着整个拆分将立即加载到内存中。因此,分割长度可能比运行映射器的Tez容器大小大得多。
作为一般准则,
将Tez容器大小设置为相同或较小的倍数 (1或2倍)YARN容器大小yarn.scheduler.minimum-allocation-mb 但决不超过yarn.scheduler.maximum-allocation-mb。你想拥有 可以旋转多个容器的净空。
在此doc中查看更多详细信息。