2016-12-27 12 views
2

Я транслировался переменным в свече (Скале), но из-за размером данных, он дает выход как этотзная размер транслируемого переменного в искре

WARN TaskSetManager: Lost task 2.0 in stage 0.0 (TID 2, 10.240.0.33): java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149) 

При запуске на меньшей базе данных, она работает хорошо. Я хочу знать размер этой широковещательной переменной (в mb/gb). Есть ли способ найти это?

ответ

1

Это связано с тем, что в драйвере заканчивается память. По умолчанию это 1g, это можно увеличить, используя --driver-memory 4g. По умолчанию Spark будет транслировать кадр данных, когда он равен <10m, хотя я выяснил, что трансляция больших фреймов данных также не является проблемой. Это может значительно ускорить соединение, но когда размер фрейма становится слишком большим, он может даже замедлить операцию соединения из-за накладных расходов на передачу всех данных различным исполнителям.

Какой у вас источник данных? Когда таблица считывается в Spark, под вкладкой sql и затем открывается диаграмма dag запроса, который вы выполняете, должна указывать некоторые метаданные о количестве строк и размера. В противном случае вы также можете проверить фактический размер на hdfs, используя hdfs dfs -du /path/to/table/.

Надеюсь, это поможет.

+0

Мы получали ту же ошибку даже после изменения размера памяти драйвера, но каким-то образом изменив память исполнителей, он сработал. Благодарю. –

1

Предполагая, что вы пытаетесь транслировать OBJ, вы можете найти его размер следующим образом:

import org.apache.spark.util.SizeEstimator 

val objSize = SizeEstimator.estimate(obj) 

Обратите внимание, что это оценка, которая означает, что это не 100% правильно