GOOD4ME

[PySpark] toPandas()가 너무 느릴 경우 꿀팁 본문

개발.오류.정리/Spark

[PySpark] toPandas()가 너무 느릴 경우 꿀팁

de_youn 2022. 11. 22. 11:44
반응형

Apache Spark

독자 대상📣
    👉 PySpark를 Standalone-client 모드로 사용하시려는 분
    👉 최소한의 메모리를 사용하여 pyspark를 사용하시려는 분
    👉 spark를 통해 hive 테이블 조회 후, 웹으로 데이터를 날리려는 분


출간 이유❓
    👉 PySpark를 통해 Hive 테이블을 조회한 후, toPandas()할 시, 처리속도가 너무 느린 것을 확인


문제 파악🔍

def spark_to_df():
    spark = SparkSession.builder\
                        .appName("spark_data_to_pandas_dataframe")\
                        .config("hive.metastore.uris", "thrift://hive:9083")\
                        .enableHiveSupport()\
                        .getOrCreate()
                        
    spark_df = spark.sql("select * from 20221122_ai_mark_data")
    # 하단의 작업이 굉장히 느린 것을 확인
    pandas_df = spark_df.toPandas()
    
    return pandas_df

문제 해결🎊

A: Spark DataFrame에서 toPandas() 메서드를 실행하면 
   클러스터의 노드에 분산된 모든 raw가 데이터를 맞추기 위해 
   충분한 메모리가 필요한 driver 프로그램으로 수집됩니다.😁
   
   Apache Arrow는 toPandas() 또는 createDataFrame()을 할 때,
   spark와 pandas의 dataframe 간 변환을 최적화하는 데 사용할 수 있는 
   독립적인 In-memory 컬럼 형식입니다.😀
   
   따라서 우리는 PySpark 사용 시, Arrow를 적용시키는 방법을 찾으면 됩니다.
   
   하단의 내용을 참고하여 이 Disgusting한 문제를 해결하십시오❗❗
def spark_to_df():
    spark = SparkSession.builder\
                        .appName("spark_data_to_pandas_dataframe")\
                        .config("hive.metastore.uris", "thrift://hive:9083")\
                        .enableHiveSupport()\
                        .getOrCreate()
                        
    spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true")
    # 버전에 따라 "spark.sql.execution.arrow.enabled" 을 사용해야할 수도 있음.
    
    spark_df = spark.sql("select * from 20221122_ai_mark_data")
    pandas_df = spark_df.toPandas()
    
    return pandas_df

3,293,303 행 9 열 데이터 플로팅 화면

 

반응형
Comments