HIVE 很长的字段给 OOM 堆

HIVE very long field gives OOM Heap

我们在 HIVE table 中存储长度从小(几 kB)到很长(<400MB)不等的字符串字段。现在我们在将数据从一个 table 复制到另一个(没有任何条件或连接)时面临 OOM 问题,这与我们在生产中 运行ning 不完全相同,但它是最简单的发生此问题的用例。所以 HQL 基本上就是:

INSERT INTO new_table
SELECT * FROM old_table;

容器和 Java 堆设置为 16GB,我们尝试了不同的文件格式(RCFile、ORC)、压缩和不压缩、不同的引擎(MR、TEZ)等,但没有任何帮助,我们总是 运行 进入 OOM。

我们不确定那里到底发生了什么。我们预计 Java 进程将只占用单条记录最大长度的几倍内存,即 ~400M,但不是整个 16GB 堆。

你能给我们一些我们应该尝试或关注的事情吗?

使用的版本:HDP 2.4.2

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

  1. 尝试使用 TEXTFILE 而不是 ORC。写入 ORC 文件需要更多内存。

  2. 尝试增加并行度,添加更多映射器。使用 Tez 的这些参数并尝试增加映射器的数量:

--最小和最大拆分大小:

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