2016-09-06 8 views
0

여기에 왜 그런 일이 일어나고 있는지 확실하지 않습니다.Spark Java Heap 오류

나는 팬더와 스파크 데이터 프레임으로로드되는 데이터 프레임을 가지고 있습니다.

데이터 프레임은 거의 0을 의미합니다. 크기는 56K X 9K입니다.

그래서 크지 나는 또한 당신이 이미 집행을위한 드라이버 및 2G를위한 8 기가 바이트 할당 한 볼 경우

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 

그래서 내 스파크/conf의/불꽃은 defaults.conf 파일에 다음 명령을했습니다. 내 Macbook Pro에 로컬로 설치된 Spark를 사용하고 있습니다.

나는

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') 

.show()를 사용하면 recommender_sdf 위의 스파크 데이터 프레임이 잘 작동합니다.

팬더 데이터 프레임에는 동일한 크로스 탭 방식이 사용되며 아래의 경우 매우 잘 작동합니다.

이것은 즉시 작동합니다.

파일이 메모리에 쉽게로드되고 팬더에서 사용할 수 있지만 .show() 또는 .head()를 사용하면 스파크에서 동일한 데이터 프레임이 Java 힙 오류를 던지고 있음을 보여줍니다. 그리고 그것은 오류를 던지기 전에 많은 시간을 할애하고 있습니다.

왜 이런 일이 발생하는지 이해가되지 않습니다. Spark는 pandas보다 빠르지 않으며, 동일한 데이터 프레임에 pandas를 사용하여 쉽게 액세스하고 인쇄 할 수있을 때이 메모리 문제가 없어야합니다.

편집 :

확인. I 열 이름은 기본적으로 긴 텍스트 문자열 대응 팬더 데이터 프레임

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()는 실행 프로그램에서 드라이버로 데이터를 가져올 것이지만 동일한 데이터 프레임을 팬더가 메모리에로드 할 수 있고 그 결과를 표시 할 수 있다면 왜 스파크로 인해 문제가되는지 확실하지 않습니다 – Baktaawar

+0

" 오류를 던지기 전에 많은 시간을 들여야합니다."-> 적용 할 변환은 무엇입니까? 변환은 작업이 아닌 여기에 범인입니다. 변환을 위해 전달하는 재귀 함수가 있습니까? – kosa

답변

0

Java에서 같은 문제가 어떻게 해결 되었습니까? 실행해야하는 쿼리를 2 개 (또는 그 이상)로 나눕니다. 전반을 실행하고 결과를 HDFS에 저장합니다 (쪽 마루로). 두 번째 SqlContext를 만들고 HDFS에서 첫 번째 절반의 결과를 읽은 다음 두 번째 절반을 실행합니다.

+0

pyspark의 모든 부분이 자동으로 파티션 분할을 처리하는 것이므로 모든 작업을 수동으로 청크로 분석하지 않고도 램 데이터 세트보다 큰 데이터를 분석 할 수 있다고 생각했기 때문에이 작업을 수행해야하는 이유는 무엇입니까? – user798719