记录对于内存缓冲区来说太大。通过 TEZ 使用 Hive 的 ORC 表时出错



我们尝试从HIVE(1.2.1)中的"ORC"表中读取数据,并使用"TextInputFormat"将该数据放入表中。某些条目在原始数据中太大,并且在操作过程中发生以下错误:

org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.tez.runtime.library.common.sort.impl.ExternalSorter$MapBufferTooSmallException: 记录对于内存缓冲区来说太大。超出缓冲区溢出限制, bufferOverflowRecursion=2, bufferList.size=1, blockSize=1610612736

有什么想法可以解决这个问题吗?

我们使用TEZ引擎执行查询,简单的MR引擎没有错误。

要执行的查询:

insert overwrite table visits_text_test_1m select * from visits where dt='2016-01-19' limit 1000000;

更新:从 ORC 复制到 ORC 存储时出现相同的错误。

Upd 2:从ORC中简单的"选择"适用于任何引擎。

提示#1:在运行查询之前从TEZ切换到MapReduce——速度较慢,但更有弹性。

set hive.execution.engine = mr ;

提示#2:由于异常来自可怕的TEZ外部分拣器野兽,请深入研究TEZ属性,例如tez.runtime.sorter.classtez.runtime.io.sort.mb等。 请注意,找到一组工作属性(甚至不说调整它们以匹配您的hive.tez.container.size)可能需要某种巫毒教牺牲。

参见 HortonWork 的 T配置 Tez 手册。

就像Samson说你可能想要增加容器大小一样,而且我发现有时JOIN确实会导致问题,因为默认情况下,蜂巢将联接转换为MAPJOIN。您可能需要在查询中尝试以下设置,看看是否有帮助:

set hive.auto.convert.join=false;
set hive.auto.convert.join.noconditionaltask=false;

最新更新