2017-06-18 199 views
0

我正在使用用python編寫的UDF以更改數字的基數。Pyspark udf高內存使用率

因此,我讀了一個實木複合地板文件,並寫入實木複合地板文件並應用UDF。 這裏是我行運行:

input_df.withColumn("origin_base", convert_2_dest_base(input_df.origin_base)).write.mode('overwrite').parquet(destination_path) 

轉換,使得火花利用大量的內存,我得到這樣的警告:

17/06/18 8時05分39秒WARN TaskSetManager:階段4.0中丟失的任務40.0(TID 183,ip-10-100-5-196.ec2.internal,executor 19):ExecutorLostFailure(執行程序19由其中一個正在運行的任務導致退出)原因:YARN爲超出內存限制。 4.4 GB使用的4.4 GB物理內存。考慮提升spark.yarn.executor.memoryOverhead。

並最終失敗。

UDF是不是正確的方法?它爲什麼消耗這麼多的內存?

+0

很難說沒有共享完全可重複的例子,什麼是正確的方法。 – mtoto

回答

1

對於pyspark,數據在Python中處理並在JVM中緩存/混排。如果您使用內置的Python API,那麼在性能方面與scala不會有太大的區別。見python vs scala performance

enter image description here

當您使用UDF,因爲本地定義的函數並不在本機JVM結構登記,因此無法通過簡單的Java API調用來實現的,它必須是序列化/反序列化到Python工人。然後數據將在Python worker中處理並序列化/反序列化回JVM。

Python工作者現在需要在堆外存儲器中處理序列化的數據,它消耗巨大的堆外存儲器,因此它通常會導致memoryOverhead。

表現明智,serialization是緩慢的,它往往是性能調整的關鍵。

0

udf功能使用serializationdeserialization方法爲columns conversion。這就是使用大量內存的原因。你可以看看spark functions的替代品。