我尝试在 Jupyter Notebook 中进行 PySpark 操作,当它因错误消息而停止时,似乎存在(相当低的)工作内存阈值。笔记本电脑有 16GB RAM(运行脚本时其中 50% 是空闲的),所以物理内存应该不是问题。 Spark 在 JVM(64 位)1.8.0_301 上运行。 Jupyter Notebook 在 Python 3.9.5 上运行。
数据框仅包含 360K 行和两个“长”类型的列(即仅约 3.8MB)。如果我将数据帧的大小减少 1.5MB 内存使用量(49,200 行),脚本将正常工作。但在此之上,脚本会使用 df.toPandas() 命令崩溃,并显示以下错误消息(摘录):
Py4JJavaError: An error occurred while calling o234.collectToPython.
: org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 50.0 failed 1 times,most recent failure:
Lost task 0.0 in stage 50.0 (TID 577) (BEXXXXXX.subdomain.domain.com executor driver):
TaskResultLost (result lost from block manager)
这是 PySpark 遇到内存限制时的 well known error message,因此我尝试如下调整设置:
在 %SPARK_HOME%/conf/spark-defaults.conf 文件中:
spark.driver.memory 4g
在 Jupyter 笔记本中:
spark = SparkSession.builder\
.config("spark.driver.memory","4G")\
.config("spark.driver.maxResultSize","4G")\
.appName("MyApp")\
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
spark.sparkContext.setSystemProperty('spark.executor.memory','4G')
我尝试使用 spark.driver.memory、spark.executor.memory 等的值,但阈值似乎保持不变。
Spark 面板(在 http://localhost:4040 上)在 Executors 菜单中说,存储内存为 603 KiB / 2 GiB,输入为 4.1 GiB,随机读取:60.6 MiB,随机写入:111.3 MiB。但这本质上是一样的,如果我将数据帧大小减少到 1.5MB 以下并且脚本运行正常。
你有什么想法,如何以某种方式提高这个 1.5MB 内存限制,它来自哪里?