ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python UDF 성능 개선 작업
    개발 2019. 8. 11. 14:27

    최근 pyspark 에서 제공되는 udf 를 사용해서 대용량 데이터를 처리하는 문제에 대해서 해결해야할 이슈가 생겼다. 

     

    문제는 너무 느리다는것... 

     

    테스트 데이터는 17000 row 중에 컬럼의 값을 가져와서 udf 에 정의되어 있는 연산을 수행한후 리턴해주는 간단한 로직... 

     

    case 1. 

    code

    puUdf = udf(lambda x:0 if x is None else long(len(x.split(','))), LongType())

    puDf = adDf.withColumn('eqClass', puUdf(adDf[orgOrcIndex]))

    puDf = puDf.groupBy('eqClass').agg(sum('eqClass').alias('cnt')).orderBy('eqClass')

    수행 시간
    195.8초

     

    로컬환경에서 돌린것임으로 수행시간의 차이는 있을수 있지만... 

     

    udf 를 사용하지 않고 수행하게 되면 다음과 같이 성능이 개선되는것을 볼 수 있었다. 

     

    code

    puDf = adDf.groupBy('eq_cnt').agg(sum('eq_cnt').alias('eqClass')).orderBy('eq_cnt')

    수행시간

    46.6초

     

    대략 1/4 정도로 줄어드는 결과를 볼 수 있었다. 

     

    관련 자료를 조사해 보니 

     

    대부분의 결과는 udf 는 spark나 python에서 제공되는 함수에 비해서 느리다고 한다. 

     

    이유는 stackoverflow의 누군가가 엄청나게 잘!! 정리해주었다....

    (https://stackoverflow.com/questions/38296609/spark-functions-vs-udf-performance)

     

    udf가 느린 이유는 복잡한 연산을 위해 설계된 것이 아니라 

     

    데이터 변형이일어날시 또는 jvm과 interpreter와 데이터 교류시 발생되는 비용을 보장 할수 없다고한다.

     

    spark sql에서 자바의 api를 호출하여 데이터를 이동시킬때 직렬화에 대한 코스트를 추가하느라 발생되는 이유인것 같다.

     

    하지만 pandas의 udf 는 다르다는 결과도.....

    (https://databricks.com/blog/2017/10/30/introducing-vectorized-udfs-for-pyspark.html)

     

    지금 환경에서는 pandas를 쓰지 않으니.... 당분간 udf를 사용하는것을 고려해봐야겠다. 

     

     

    '개발' 카테고리의 다른 글

    Spark 성능 튜닝 ( inferSchema )  (0) 2020.04.20
    iBATIS, Hibernate, and JPA: Which is right for you?  (0) 2019.08.08
Designed by Tistory.