【问题标题】:Record too large for in-memory buffer. Error when working with Hive's ORC tables via TEZ记录对于内存缓冲区来说太大。通过 TEZ 使用 Hive 的 ORC 表时出错
【发布时间】:2016-05-20 15:43:04
【问题描述】:

我们正在尝试从 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 的简单“选择”适用于任何引擎。

【问题讨论】:

  • 看起来像一个 TEZ 错误 - 在标题和标签中明确说明。
  • 请注意,Samson!

标签: hadoop hive orc tez


【解决方案1】:

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

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

【讨论】:

  • 感谢您的想法!不幸的是,这个设置并不能解决我的问题,但建议增加 Samson 的排序缓冲区实际上会有所帮助:)
【解决方案2】:

提示 #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.是的,我已经为这个查询尝试了 MR,它运行良好。 2. 打算阅读更多手册 :) 但我想知道 - 是否有可能使用 TEZ 在 HDFS 中进行此类数据操作?
  • “在 HDFS 内” 是什么意思?这些 props 设置在 tez-site.xml 中,这是 Hive CLI(或 HiveServer2)的 CLASSPATH 中预期的本地文件。
  • 请注意,hive.tez.* 属性可以在 HQL 脚本中使用 setcommand 动态覆盖;但不是tez.* 属性,它必须tez-site.xml 中定义
  • “在 HDFS 内”我的意思是我正在处理存储在 HDFS 中的数据 :) 顺便说一下,您能否指出手册来解释我可以在脚本中动态重新加载哪些变量以及我可以做什么不是吗?
  • 我也觉得我应该检查一些 ORC 设置,因为我们可以从文本读取并写入 ORC,只需从 ORC 读取,但如果我们无法从 ORC 读取并写入任何存储在单个查询中这样做:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多