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
尝试使用 TEXTFILE 而不是 ORC。写入 ORC 文件需要更多内存。
尝试增加并行度,添加更多映射器。使用 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
我们在 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
尝试使用 TEXTFILE 而不是 ORC。写入 ORC 文件需要更多内存。
尝试增加并行度,添加更多映射器。使用 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