Hive Map join:内存不足异常

时间:2013-09-20 09:58:55

标签: hive mapreduce

我正在尝试使用一个大表(10G)和小表(230 MB)执行地图方面。使用小i我将使用所有列来生成输出记录,在加入关键列

之后

我使用了以下设置

设置hive.auto.convert.join = true;

设置hive.mapjoin.smalltable.filesize = 262144000;

日志:

**2013-09-20 02:43:50     Starting to launch local task to process map join;      maximum       memory = 1065484288

2013-09-20 02:44:05     Processing rows:        200000  Hashtable size: 199999  Memory usage:   430269904       rate:0.404

2013-09-20 02:44:14     Processing rows:        300000  Hashtable size: 299999  Memory usage:   643070664       rate:0.604

Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
        at java.util.jar.Manifest$FastInputStream.<init>(Manifest.java:313)
        at java.util.jar.Manifest$FastInputStream.<init>(Manifest.java:308)
        at java.util.jar.Manifest.read(Manifest.java:176)
        at java.util.jar.Manifest.<init>(Manifest.java:50)
        at java.util.jar.JarFile.getManifestFromReference(JarFile.java:168)
        at java.util.jar.JarFile.getManifest(JarFile.java:149)
        at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:696)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:228)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at org.apache.hadoop.util.RunJar$1.run(RunJar.java:126)
Execution failed with exit status: 3
Obtaining error information
Task failed!
Task ID:
  Stage-7
Logs:
FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.MapredLocalTask
ATTEMPT: Execute BackupTask: org.apache.hadoop.hive.ql.exec.MapRedTask**

但我仍面临OOM异常,我的群集中设置的堆大小为1 GB。 请协助我需要考虑和调整哪些属性以使此地图边加入工作

5 个答案:

答案 0 :(得分:8)

  

处理行数:300000哈希表大小:299999内存使用情况:643070664汇率:0.604

在300k行中,HT已经使用了60%的堆。首先要问的问题是:你确定你的表顺序是正确的,连接中的小表是否真的是数据中较小的表?在编写查询时,大表应该是JOIN子句中的最后一个。您在0.9或0.11上使用哪个Hive版本?

如果您使用的是Hive 0.11并且正在正确指定连接,那么首先要尝试的是增加堆大小。从上面的数据(300k行〜> 650Mb堆),你可以计算出你需要多少堆。

答案 1 :(得分:2)

我遇到了这个问题,只能通过使用来克服它 set hive.auto.convert.join = false

答案 2 :(得分:2)

set hive.auto.convert.join = false; 它不会给你记忆例外。

答案 3 :(得分:1)

你应该考虑到这一点,特别是当表存储有压缩时,表大小可能不会太大但是当解压缩时它可以增长10倍或更多,除此之外表示哈希表中的数据甚至需要更多的空间。所以你的表可能小于~260MB,这是你为hive.mapjoin.smalltable.filesize设置的值,但它的解压缩版本的哈希表表示可能没有,这就是为什么hive试图在内存中加载表最终导致OutOfMemoryError异常。 根据{{​​3}}: “没有检查表格是否是压缩表格,表格的大小可能是多少。”

答案 4 :(得分:0)

set hive.auto.convert.join = false;

它不会给你一个内存异常,因为它没有使用mapside join。它正在使用普通的mapreduce任务本身。