2016-09-06 3 views
0

Я не уверен, что здесь происходит и почему.Ошибка Spark Java Heap

У меня есть кадр данных, который загружается как панды и искровой кадр данных.

Рамка данных является редким значением, главным образом, нулями. Его размеры составляют 56K X 9K. Так что не большой

Я также поставил следующие команды в моем файле искрового/CONF/искрового defaults.conf

spark.driver.memory    8g 
spark.executor.memory   2g 
spark.driver.maxResultSize  2g 
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value 

spark.jars.packages com.databricks:spark-csv_2.11:1.4.0 

Так что если вы видите, я уже выделил 8 Гб для водителя и 2G для исполнителя. Я использую Spark, установленный локально на моем Macbook Pro.

Когда я

recommender_ct.show() 

, чтобы увидеть первые 5 строк это то, что я получаю:

кадр
--------------------------------------------------------------------------- 
Py4JJavaError        Traceback (most recent call last) 
<ipython-input-7-8c71bfcdfd03> in <module>() 
----> 1 recommender_ct.show() 

/Users/i854319/spark/python/pyspark/sql/dataframe.pyc in show(self, n, truncate) 
    255   +---+-----+ 
    256   """ 
--> 257   print(self._jdf.showString(n, truncate)) 
    258 
    259  def __repr__(self): 

/Users/i854319/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py in __call__(self, *args) 
    811   answer = self.gateway_client.send_command(command) 
    812   return_value = get_return_value(
--> 813    answer, self.gateway_client, self.target_id, self.name) 
    814 
    815   for temp_arg in temp_args: 

/Users/i854319/spark/python/pyspark/sql/utils.pyc in deco(*a, **kw) 
    43  def deco(*a, **kw): 
    44   try: 
---> 45    return f(*a, **kw) 
    46   except py4j.protocol.Py4JJavaError as e: 
    47    s = e.java_exception.toString() 

/Users/i854319/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name) 
    306     raise Py4JJavaError(
    307      "An error occurred while calling {0}{1}{2}.\n". 
--> 308      format(target_id, ".", name), value) 
    309    else: 
    310     raise Py4JError(

Py4JJavaError: An error occurred while calling o40.showString. 
: java.lang.OutOfMemoryError: Java heap space 

Эти данные были созданы с использованием кросс-вкладки кадра данных Спарк, как показано ниже:

recommender_ct=recommender_sdf.crosstab('TRANS','ITEM') 

Исходная рамка данных над рекомендацией_descript отлично работает, когда для этого используется .show().

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

# Creating a new pandas dataframe for cross-tab 
recommender_pct=pd.crosstab(recommender_pdf['TRANS'], recommender_pdf['ITEM']) 

recommender_pct.head() 

Это работает немедленно.

Это означает, что файл легко загружается в память и может использоваться pandas, но тот же фрейм данных в искровом режиме, когда используется .show() или .head(), бросает ошибку кучи java. И это занимает много времени, прежде чем выбросить ошибку.

Я не понимаю, почему это происходит. Разве Spark не должен быть быстрее, чем панды, и не должен иметь этой проблемы памяти, когда тот же фрейм данных можно легко получить и распечатать с помощью панд.

EDIT:

Ok. Рамка кросс-вкладками искрой данных выглядит следующим образом, когда я получать первые несколько строк и столбцов из соответствующих панд кадра данных

TRANS Bob Iger: How Do Companies Foster Innovation and Sustain Relevance “I Will What I Want” - Misty Copeland "On the Lot" with Disney Producers "Your Brain is Good at Inclusion...Except When it's Not" with Dr. Steve Robbins (please do not use) WDW_ER-Leaders of Minors 1. EAS Project Lifecycle Process Flow 10 Life Lessons from Star Wars 10 Simple Steps to Exceptional Daily Productivity 10 Steps to Effective Listening 
0 353 0 0 0 0 0 0 0 0 0 
1 354 0 0 0 0 0 0 0 0 0 
2 355 0 0 0 0 0 0 0 0 0 
3 356 0 0 0 0 0 0 0 0 0 
4 357 0 0 0 0 0 0 0 0 0 

Имена столбцов в основном длинные текстовые строки. И значения столбца равны 0 или 1

+0

Какова ваша операция? Может быть, пример кода? определенные операции действий могут накапливать данные и производить ошибку OOM. – kosa

+1

Вышеупомянутая ошибка связана с тем, что вы делаете .show() в кадре данных искры. В основном я знаю .show() будет извлекать данные от исполнителей к драйверам, но если один и тот же фрейм данных может быть загружен в память pandas и может даже показать результаты, то я не уверен, почему это проблема с искру – Baktaawar

+0

«это занять много времени, прежде чем выбросить ошибку.»-> Каковы преобразования, которые вы применяете? Кажется, что трансформации здесь являются виновниками, а не действием. Есть ли какая-либо функция рекурсии, которую вы передаете для преобразований? – kosa

ответ

0

Как я решил эту же проблему в Java: Разделите запросы, которые необходимо выполнить в 2 (или более) частях. Выполните первую половину, сохраните результаты в HDFS (как паркет). Создайте второй SqlContext, прочитайте результаты с первой половины из HDFS и затем выполните вторую половину запросов.

+0

Зачем вам это нужно, потому что я думал, что весь смысл pyspark - это автоматически обрабатывать любые разделы, чтобы вы могли анализировать больше, чем массивы данных ram, без разбора всего на куски вручную. – user798719

 Смежные вопросы

  • Нет связанных вопросов^_^