簡體   English   中英

Hive Map join:內存不足異常

[英]Hive Map join : out of memory Exception

我試圖用一個大表(10G)和小表(230 MB)執行地圖方面。 使用小i將在連接鍵列后使用所有列來生成輸出記錄

我用過以下設置

set hive.auto.convert.join = true;

set 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。 請協助我需要考慮和調整哪些屬性以使此地圖側加入工作

處理行數:300000哈希表大小:299999內存使用情況:643070664匯率:0.604

在300k行,HT已經使用了60%的堆。 首先要問的問題是:你確定你的表順序是正確的,連接中的小表是否真的是數據中較小的表? 在編寫查詢時,大表應該是JOIN子句中的最后一個。 您在0.9或0.11上使用哪個Hive版本?

如果您使用的是Hive 0.11並且正在正確指定連接,那么首先要嘗試的是增加堆大小。 從上面的數據(300k行〜> 650Mb堆),你可以計算出你需要多少堆。

我遇到了這個問題,只能通過使用set hive.auto.convert.join=false來克服它

set hive.auto.convert.join = false; 它不會給你內存異常。

您應該考慮到這一點,尤其是在使用壓縮存儲表時,表大小可能不會太大,但是當解壓縮時,它可以增長10倍或更多,除此之外,表示哈希表中的數據需要更多空間。 所以你的表可能小於~260MB,這是你為hive.mapjoin.smalltable.filesize設置的值,但它的解壓縮版本的哈希表表示可能沒有,這就是為什么hive試圖在內存中加載表最終導致OutOfMemoryError異常。 根據https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization :“沒有檢查表是否是壓縮表,以及表的潛在大小是多少。”

set hive.auto.convert.join = false;

它不會給你一個內存異常,因為它沒有使用mapside join。 它正在使用普通的mapreduce任務本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM