我正在尝试使用一个大表(10G)和一个小表(230 MB)来执行地图端。对于较小的情况,在连接关键列后,我将使用所有列来生成输出记录
我使用了以下设置
设置 hive.auto.convert.join=true;
设置 hive.mapjoin.smalltable.filesize=262144000;
Logs :
**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。
请协助我需要考虑和调整哪些属性才能使此地图侧连接工作
处理行数:300000 哈希表大小:299999 内存使用量:643070664 速率:0.604
在 300k 行时,HT 已经使用了堆的 60%。要问的第一个问题:您确定表顺序正确吗?连接中的小表真的是数据中较小的表吗?编写查询时,大表应该是 JOIN 子句中的最后一个。您使用的是 0.9 还是 0.11 哪个 Hive 版本?
如果您使用的是 Hive 0.11 并且正确指定了连接,那么首先要尝试的是增加堆大小。从上面的数据(300k 行 ~> 650Mb 堆)你可以算出你需要多少堆。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)