You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Arman Yazdani (Jira)" <ji...@apache.org> on 2023/11/27 16:49:00 UTC
[jira] [Created] (SPARK-46125) Memory leak when using createDataFrame with persist
Arman Yazdani created SPARK-46125:
-------------------------------------
Summary: Memory leak when using createDataFrame with persist
Key: SPARK-46125
URL: https://issues.apache.org/jira/browse/SPARK-46125
Project: Spark
Issue Type: Bug
Components: Input/Output, PySpark
Affects Versions: 3.5.0
Reporter: Arman Yazdani
When I create a dataset from pandas data frame and persisting it (DISK_ONLY), some "byte[]" objects (total size of imported data frame) will still remain in the driver's heap memory.
This is the sample code for reproducing it:
{code:python}
import pandas as pd
import gc
from pyspark.sql import SparkSession
from pyspark.storagelevel import StorageLevel
spark = SparkSession.builder \
.config("spark.driver.memory", "4g") \
.config("spark.executor.memory", "4g") \
.config("spark.sql.execution.arrow.pyspark.enabled", "true") \
.getOrCreate()
pdf = pd.read_pickle('tmp/input.pickle')
df = spark.createDataFrame(pdf)
df = df.persist(storageLevel=StorageLevel.DISK_ONLY)
df.count()
del pdf
del df
gc.collect()
spark.sparkContext._jvm.System.gc(){code}
After running this code, I will perform a manual GC in VisualVM, but the driver memory usage will remain at 550 MBs (at start it was about 50 MBs).
Then I tested with adding {{"df = df.unpersist()"}} after the {{"df.count()"}} line and everything was OK (Memory usage after performing manual GC was about 50 MBs).
Also, I tried with reading from parquet file (without adding unpersist line) with this code:
{code:python}
import gc
from pyspark.sql import SparkSession
from pyspark.storagelevel import StorageLevel
spark = SparkSession.builder \
.config("spark.driver.memory", "4g") \
.config("spark.executor.memory", "4g") \
.config("spark.sql.execution.arrow.pyspark.enabled", "true") \
.getOrCreate()
df = spark.read.parquet('tmp/input.parquet')
df = df.persist(storageLevel=StorageLevel.DISK_ONLY)
df.count()
del df
gc.collect()
spark.sparkContext._jvm.System.gc(){code}
Again everything was fine and memory usage was about 50 MBs after performing manual GC.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org