我们正在尝试从 HIVE (1.2.1) 中的“ORC”表中读取数据,并将该数据放入带有“TextInputFormat”的表中。原始数据中的某些条目太大,在运行过程中出现以下错误:
org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.tez.runtime.library.common.sort.impl.ExternalSorter$MapBufferTooSmallException: Record too large for in-memory buffer. Exceeded buffer overflow limit, 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 存储时出现同样的错误。
更新 2:来自 ORC 的简单“选择”适用于任何引擎。
最佳答案
提示 #1:只需在运行查询之前从 TEZ 切换到 MapReduce - 速度较慢但更有弹性。
设置 hive.execution.engine = mr ;
提示 #2:由于异常来自可怕的 TEZ ExternalSorter 野兽,请深入研究 TEZ 属性,例如 tez.runtime.sorter.class
、 tez.runtime.io.sort.mb
等。请注意,找到一组工作属性(甚至不说调整它们以匹配您的 hive.tez.container.size
)将可能需要某种巫毒祭祀。
比照。 HortonWork 的 Configuring Tez初学者手册。
关于hadoop - 记录对于内存缓冲区来说太大。通过 TEZ 使用 Hive 的 ORC 表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35312662/