Getting OutofMemoryError - GC overhead limit надвишава в pyspark

по средата на проекта получавам следната грешка след извикване на функция в моята spark sql заявка изключение снимка

Написах функция за дефиниране на потребителя, която ще вземе два низа и ще ги свърже след конкатенацията, тя ще вземе най-десния подниз с дължина 5 зависи от общата дължина на низа (алтернативен метод на дясно (низ, цяло число) на sql сървър)

  from pyspark.sql.types import*


def concatstring(xstring, ystring):
            newvalstring = xstring+ystring
            print newvalstring
            if(len(newvalstring)==6):
                stringvalue=newvalstring[1:6]
                return stringvalue
            if(len(newvalstring)==7):
                stringvalue1=newvalstring[2:7]
                return stringvalue1
            else:
                return '99999'


spark.udf.register ('rightconcat', lambda x,y:concatstring(x,y), StringType())

работи добре индивидуално. сега, когато го предам в моята spark sql заявка като колона, това изключение възникна, заявката е

въведете описание на изображението тук

писменото запитване е

spark.sql("select d.BldgID,d.LeaseID,d.SuiteID,coalesce(BLDG.BLDGNAME,('select EmptyDefault from EmptyDefault')) as LeaseBldgName,coalesce(l.OCCPNAME,('select EmptyDefault from EmptyDefault'))as LeaseOccupantName, coalesce(l.DBA, ('select EmptyDefault from EmptyDefault')) as LeaseDBA, coalesce(l.CONTNAME, ('select EmptyDefault from EmptyDefault')) as LeaseContact,coalesce(l.PHONENO1, '')as LeasePhone1,coalesce(l.PHONENO2, '')as LeasePhone2,coalesce(l.NAME, '') as LeaseName,coalesce(l.ADDRESS, '') as LeaseAddress1,coalesce(l.ADDRESS2,'') as LeaseAddress2,coalesce(l.CITY, '')as LeaseCity, coalesce(l.STATE, ('select EmptyDefault from EmptyDefault'))as LeaseState,coalesce(l.ZIPCODE, '')as LeaseZip, coalesce(l.ATTENT, '') as LeaseAttention,coalesce(l.TTYPID, ('select EmptyDefault from EmptyDefault'))as LeaseTenantType,coalesce(TTYP.TTYPNAME, ('select EmptyDefault from EmptyDefault'))as LeaseTenantTypeName,l.OCCPSTAT as LeaseCurrentOccupancyStatus,l.EXECDATE as LeaseExecDate, l.RENTSTRT as LeaseRentStartDate,l.OCCUPNCY as LeaseOccupancyDate,l.BEGINDATE as LeaseBeginDate,l.EXPIR as LeaseExpiryDate,l.VACATE as LeaseVacateDate,coalesce(l.STORECAT, (select EmptyDefault from EmptyDefault)) as LeaseStoreCategory ,rightconcat('00000',cast(coalesce(SCAT.SORTSEQ,99999) as string)) as LeaseStoreCategorySortID from Dim_CMLease_primer d join LEAS l on l.BLDGID=d.BldgID and l.LEASID=d.LeaseID left outer join SUIT on SUIT.BLDGID=l.BLDGID and SUIT.SUITID=l.SUITID left outer join BLDG on BLDG.BLDGID= l.BLDGID left outer join SCAT on SCAT.STORCAT=l.STORECAT left outer join TTYP on TTYP.TTYPID = l.TTYPID").show()

качих състоянието на заявката и след нея тук. как мога да разреша този проблем. Моля, упътете ме


person Kalyan    schedule 06.12.2016    source източник
comment
Уверете се, че вашият spark.memory.fraction=0.6 . Ако е по-високо от това, се сблъсквате с грешки при събиране на отпадъци, вижте stackoverflow.com/a/47283211/179014   -  person asmaier    schedule 14.11.2017


Отговори (1)


Най-простото нещо, което да опитате, е да увеличите паметта на изпълнителя на spark: spark.executor.memory=6g
Уверете се, че използвате цялата налична памет. Можете да проверите това в потребителския интерфейс.

АКТУАЛИЗАЦИЯ 1

--conf spark.executor.extrajavaoptions="Option" можете да подадете -Xmx1024m като опция.

Какви са текущите ви spark.driver.memory и spark.executor.memory?
Увеличаването им трябва да разреши проблема.

Имайте предвид, че според документацията на искра:

Обърнете внимание, че е незаконно да задавате свойства на Spark или настройки за размер на купчина с тази опция. Свойствата на Spark трябва да бъдат зададени с помощта на обект SparkConf или файла spark-defaults.conf, използван със скрипта за изпращане на spark. Настройките за размера на купчината могат да бъдат зададени с spark.executor.memory.

АКТУАЛИЗАЦИЯ 2

Тъй като GC overhead грешката е проблем със събирането на боклука, бих препоръчал също да прочетете този страхотен отговор

person Jarek    schedule 06.12.2016
comment
Благодаря ви за отговора. току-що го изпробвах. но нищо не се променя ubuntu@tvnubtest:~/spark-2.0.0-bin-hadoop2.7$ bin/pyspark --conf executor.extraClassPath=$SPARK_HOME/lib/sqljdbc4.jar --driver-class-path $SPARK_HOME/lib /sqljdbc4.jar --jars $SPARK_HOME/lib/sqljdbc4.jar --executor-memory 6g - person Kalyan; 06.12.2016
comment
Опитайте да разрешите на вашата JVM повече Java heap пространство чрез: java -Xmx1024m com.yourName.yourClass - person Jarek; 06.12.2016
comment
Ако вашите обекти консумират твърде много памет, това ще позволи на JVM да работи гладко - person Jarek; 06.12.2016
comment
мога ли да напиша по-горе конфигурационен код като предаване на параметър в spark, който съм публикувал в предишна нишка за коментари, или имам ли нужда от допълнителна поддръжка за това. аз съм начинаещ в spark, така че съм леко объркан. съжалявам, че задавам глупав въпрос - person Kalyan; 07.12.2016
comment
Въпреки това бих се съсредоточил върху 3 параметъра: spark.driver.memory=45g spark.executor.memory=6g spark.dirver.maxResultSize=8g Това е само пример за моята конфигурация, която разреши подобен проблем. Играйте с вашата конфигурация, но преди това проверете колко свободна памет имате в потребителския интерфейс. - person Jarek; 07.12.2016
comment
благодаря за отговора, увеличих физическата памет в 16G. проблемът обаче се реши временно. но отново получавам Overhead. Предполагам, че вашият java-Xmx1024m код ще е необходим сега. Използвам pyspark и зареждам съществуващата таблица с помощта на jdbc драйвер в Linux компютър. бихте ли казали към кой клас трябва да се съсредоточа, имам предвид com.yourname,yourclass, тъй като не създадох никакъв клас. извинявай че те безпокоя много :( - person Kalyan; 13.12.2016
comment
--conf spark.executor.extrajavaoptions="Option" можете да подадете -Xmx1024m като опция. Имайте предвид, че според документацията на spark: ›Имайте предвид, че е незаконно да задавате свойства на Spark или настройки за размер на купчина с ›тази опция. Свойствата на Spark трябва да бъдат зададени с помощта на SparkConf обект или ›файла spark-defaults.conf, използван със скрипта за изпращане на spark. Настройките за размер на купчината › могат да бъдат зададени с spark.executor.memory. Какви са вашите текущи spark.driver.memory и spark.executor.memory? - person Jarek; 13.12.2016
comment
съжалявам, не мога да редактирам горния коментар --conf spark.executor.extrajavaoptions="Option" можете да подадете -Xmx1024m като опция. Каква е вашата текуща spark.driver.memory и spark.executor.memory? Имайте предвид, че според документацията на spark: ›Имайте предвид, че е незаконно да задавате свойства на Spark или настройки за размер на купчина с тази опция. Свойствата на Spark трябва да бъдат зададени с помощта на обект SparkConf или файла spark-defaults.conf, използван със скрипта за изпращане на spark. Настройките за размера на купчината могат да бъдат зададени с spark.executor.memory. - person Jarek; 13.12.2016
comment
добре, направих някои корекции тук. Увеличих паметта на компютъра до 32G и зададох паметта на драйвера на 24G и паметта на изпълнителя на 8G точно сега. Предполагам, че работи за сега. не получавам изключение. и в момента се опитвам да увелича размера на Java Heapsize, за да избегна проблеми в бъдеще. Много ви благодаря за подробностите, отговорете на Jarek засега. но може да те събори, ако отново получа странно изключение :P шегувам се - person Kalyan; 14.12.2016