我们在配置单元表中存储长度从小(几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
1条答案
按热度按时间zmeyuzjn1#
尝试使用文本文件而不是orc。写orc文件需要更多的内存。
尝试增加并行度,添加更多Map器。为tez使用这些参数并尝试增加Map器的数量:
--最小和最大拆分大小:
请看这里:https://community.hortonworks.com/articles/14309/demystify-tez-tuning-step-by-step.html