2013-09-20 5 views
6

Я пытаюсь выполнить карту с одной большой таблицей (10G) и маленькой таблицей (230 МБ). При небольшом я буду использовать все столбцы для получения выходных записей, после присоединения ключевых столбцовHive Map join: out of memory Exception

Я использовал ниже настройки

установить hive.auto.convert.join = истину;

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** 

, но до сих пор я столкнулся исключением ООГО, размер кучи установлен в моем кластере составляет 1 Гб. Пожалуйста помогите, какие свойства мне нужно рассмотреть и настроить, чтобы сделать эту сторону карты присоединиться работа

ответ

7

Обработка строк: 300000 Hashtable Размер: 299999 Использование памяти: 643070664 скорость: 0,604

при 300К строк в HT уже использует 60% вашей кучи. Первый вопрос, который нужно задать: вы уверены, что получили правильный порядок в таблице, является ли маленькая таблица в объединении действительно меньшей таблицей в ваших данных? При написании запроса большая таблица должна быть последней в предложении JOIN. Какая версия Hive у вас на 0,9 или 0,11?

Если вы находитесь на Hive 0.11, и вы правильно указываете соединение, первое, что нужно попробовать, - увеличить размер кучи. Из приведенных выше данных (300k row ~> 650Mb Heap) вы можете выяснить, сколько кучи вам нужно.

+0

Спасибо Remus за ответ <\br> Я не могу понять одну вещь, маленький стол размером 230 мб и содержит около 900 тыс. Записей. Почему он занимает 650 мб/300 тыс. Строк. – hjamali52

+1

В представлении таблицы хэш-таблицы Java имеются значительные накладные расходы. См. ['JavaDataModel.java'] (http://svn.apache.org/repos/asf/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java) –

+1

Значение по умолчанию для hive.mapjoin.followby.gby.localtask.max.memory.usage - 0,55 (для группы по, 0.90 для non-group by) Похоже, как только он достигнет 60,4% в вашем случае, работа провалится. https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties – Garfield

2

я столкнулся с этой проблемой, и только был в состоянии получить над ним с помощью множество hive.auto.convert.join = ложь

2

set hive.auto.convert.join = false; не даст и исключения памяти.

0
set hive.auto.convert.join = false; 

Это не даст вам исключения для памяти, поскольку оно не использует соединение mapside. Он использует обычную задачу перемножения.

0

Вы должны учитывать это, особенно когда таблицы хранятся с сжатием, размер таблицы может быть не слишком большой, но когда он распадается, он может увеличиться в 10 раз или более, поверх того, что представляет данные в хеш-таблице, принимает еще больше места. Таким образом, ваша таблица может быть меньше, чем ~ 260 МБ, что является значением, которое вы задали для hive.mapjoin.smalltable.filesize, но представление хэш-таблицы для распакованной версии может не быть, и именно поэтому куст пытается загрузить таблицу в память, что в конечном итоге вызывает исключение OutOfMemoryError. В соответствии с https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization: «Нет проверки, чтобы убедиться, что таблица является сжатой или нет и каков возможный размер таблицы».