9

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

我使用了以下设置

设置 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。请协助我需要考虑和调整哪些属性以使此地图侧加入工作

4

5 回答 5

10

处理行数:300000 哈希表大小:299999 内存使用量:643070664 速率:0.604

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

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

于 2013-09-20T10:19:38.990 回答
3

set hive.auto.convert.join = false; 它不会给你内存异常。

于 2016-11-17T07:16:44.743 回答
2

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

于 2016-04-06T12:36:25.907 回答
1
set hive.auto.convert.join = false;

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

于 2017-03-01T07:34:53.827 回答
1

你应该考虑到这一点,特别是当表被压缩存储时,表大小可能不会太大,但是当它被解压缩时,它可以增长 10 倍或更多,在此之上表示哈希表中的数据会占用更多空间。因此,您的表可能小于 ~260MB,这是您为 hive.mapjoin.smalltable.filesize 设置的值,但它的解压缩版本的哈希表表示可能不会,这就是 hive 尝试将表加载到内存中的原因,最终导致OutOfMemoryError 异常。根据https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization:“没有检查表是否是压缩表以及表的潜在大小可以是多少。”

于 2017-08-09T19:23:18.370 回答