Hive 0.11:使用30个节点查询3T数据时出现内存问题

时间:2017-04-15 15:19:53

标签: hadoop hive

我有一个Hive 0.11群集,每个群集有30个节点,每个节点有32GB内存。我使用此集群在HDFS上创建一个包含3T数据的托管Hive表。现在我尝试使用以下查询将此数据插入驻留在S3的Hive表中:

INSERT OVERWRITE TABLE s3_table PARTITION (part1, part2)
SELECT * FROM hdfs_table;

起初我得到了“Java堆空间”错误并通过添加以下内容来修复它们:

SET mapred.child.java.opts=-Xmx8G -XX:+UseConcMarkSweepGC;

之后我开始获得“非零状态为137的任务进程退出”,这表明映射器进程被OOM杀手杀死,因为它们共同占用了太多内存。我决定通过设置以下内容来减少映射器进程的数量:

SET mapred.tasktracker.map.tasks.maximum=2
SET mapred.map.tasks=60

但是,由于处理了大量数据并且Hive继续创建了数百个映射器,因此我没有任何效果,直到我设置了以下设置:

SET mapred.max.split.size=100123456789;

这将映射器任务的数量从数百个减少到大约40个。但是,这又开始导致Java堆空间错误。

由于我使用相同的集群创建了表,因此我希望集群足够大以处理表。但是,我尝试过的所有设置组合都会遇到内存限制。

那么,如何保持mapred.max.split.size足够低,不会导致Java堆问题,还能控制工作任务的数量以避免OOM杀手?

0 个答案:

没有答案