对于内存缓冲区记录太大。通过TEZ

时间:2016-02-10 10:29:40

标签: hadoop hive orc tez

我们正试图从“ORC”中读取数据。 HIVE中的表格(1.2.1)并将该数据与“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;

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

更新2:简单'选择'来自ORC的任何引擎都能很好地工作。

2 个答案:

答案 0 :(得分: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的Configuring Tez初学者手册。

答案 1 :(得分:0)

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

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