我们正在存储字符串字段,其在HIVE表中的长度从小(几KB)到很长(<400MB)不等。现在,当我们将数据从一个表复制到另一个表(没有任何条件或连接)时,我们面临着OOM的问题,这与我们在生产中运行的不完全相同,但它是发生此问题的最简单的用例。所以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
答案 0 :(得分:0)
尝试使用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