2017-07-03 99 views
0

我们正在存储字符串字段,其长度从小(几kB)到很长(< 400MB)在HIVE表中变化。现在,当将数据从一个表复制到另一个表时(没有任何条件或联接)时,我们正面临着OOM问题,这不完全是我们在生产中运行的,但它是出现此问题的最简单用例。所以HQL基本上是:HIVE很长的字段给出了OOM堆

INSERT INTO new_table 
SELECT * FROM old_table; 

容器和Java堆设置为16GB,我们曾尝试不同的文件格式(RCFile,ORC),有和没有压缩,不同的发动机(MR,TEZ)等,但没有任何帮助,我们总是碰到OOM。

我们不确定那里发生了什么。我们期待Java进程只需要几倍单记录最大长度的内存,这是大约400M,但不是整个16GB堆。

你能给我们一些我们应该尝试或关注的东西吗?使用

版本:2.4.2 HDP

示例日志使用的RAM TEZ + ORC + 8G时:https://pastebin.com/uza84t6F

+0

请附上错误日志和蜂巢参数。 – leftjoin

+0

编辑,附上TEZ + ORC + 8G RAM的样本日志 – Martin

回答

0
  1. 尝试使用TEXTFILE而不是ORC。编写一个ORC文件需要更多的内存。

  2. 尝试增加并行性,添加更多映射器。这些参数TEZ播放和尝试增加映射器的数量:

--min和最大分大小:

set tez.grouping.min-size=16777216; 
set tez.grouping.max-size=1073741824; 

在这里看到:https://community.hortonworks.com/articles/14309/demystify-tez-tuning-step-by-step.html

+0

谢谢。我已经将底层存储文件的格式改为序列文件,并开始像魅力一样工作。似乎ORC和RCFile不是针对像非常长的字符串字段这样的特定用例而构建的。 – Martin

+0

构建柱状文件需要更多内存用于数据处理的特殊缓冲区。 – leftjoin