总分配超过堆内存的95.00%(960,285,889字节)-pyspark错误

时间:2018-11-21 07:53:56

标签: python csv pyspark heap parquet

我在python 2.7中编写了一个脚本,该脚本使用pyspark将csv转换为镶木地板和其他东西。 当我在较小的数据上运行脚本时,效果很好,但是在较大的数据(250GB)上运行脚本时,我迷上了以下错误-总分配超过了堆内存的95.00%(960,285,889字节)。 我怎么解决这个问题?发生这种情况的原因是什么? tnx!

部分代码: 导入的库:     import pyspark as ps from pyspark.sql.types import StructType, StructField, IntegerType, DoubleType, StringType, TimestampType,LongType,FloatType from collections import OrderedDict from sys import argv

使用pyspark:

 schema_table_name="schema_"+str(get_table_name())
 print (schema_table_name)
 schema_file= OrderedDict()

schema_list=[]
ddl_to_schema(data)
for i in schema_file:
schema_list.append(StructField(i,schema_file[i]()))

schema=StructType(schema_list)
print schema

spark = ps.sql.SparkSession.builder.getOrCreate()
df = spark.read.option("delimiter", 
",").format("csv").schema(schema).option("header", "false").load(argv[2])
df.write.parquet(argv[3])

# df.limit(1500).write.jdbc(url = url, table = get_table_name(), mode = 
  "append", properties = properties)
# df = spark.read.jdbc(url = url, table = get_table_name(), properties = 
  properties)
pq = spark.read.parquet(argv[3])
pq.show()

仅为了阐明schema_table_name就是要保存所有表名(在DDL中适合csv的表名)。

功能ddl_to_schema只需获取常规ddl,然后将其编辑为可用于拼花地板的ddl。

2 个答案:

答案 0 :(得分:0)

驱动程序似乎内存不足。

默认情况下,驱动程序内存设置为1GB。由于您的程序使用了95%的程序,因此应用程序内存不足。

您可以尝试更改它,直到满足以下需求的“最佳位置”为止,我将其设置为2GB:

pyspark-驱动程序内存2克

您也可以使用执行程序的内存,尽管这似乎不是问题所在(执行程序的默认值为4GB)。

pyspark-驱动程序内存2g-执行程序内存8g

理论上,火花大小可以将数据卸载到驱动程序,如果大小不正确,则会导致内存不足。对于您的情况,我无法确定,但似乎是造成此情况的原因。

您可以在此处了解相关理论(阅读有关驱动程序的信息,然后检查操作):

https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#actions

答案 1 :(得分:0)

如果您运行本地脚本并且未直接使用spark-submit,则可以执行以下操作:

import os

os.environ["PYSPARK_SUBMIT_ARGS"] = "--driver-memory 2g"