1

我们正在尝试从 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 存储时出现同样的错误。

更新 2:来自 ORC 的简单“选择”适用于任何引擎。

4

2 回答 2

0

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

set hive.execution.engine = mr ;

提示 #2:由于异常来自可怕的 TEZ ExternalSorter野兽,请深入研究 TEZ 属性,例如tez.runtime.sorter.classtez.runtime.io.sort.mb。请注意,找到一组有效的属性(甚至不说调整它们以匹配您的hive.tez.container.size)可能需要某种类型巫毒祭祀。

参照。HortonWork 的新手配置Tez手册。

于 2016-02-10T17:33:10.683 回答
0

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

set hive.auto.convert.join=false;
set hive.auto.convert.join.noconditionaltask=false;
于 2016-02-11T20:16:10.523 回答