【问题标题】:Total allocation exceeds 95.00% (960,285,889 bytes) of heap memory- pyspark error总分配超过堆内存的 95.00%(960,285,889 字节)- pyspark 错误
【发布时间】:2018-11-21 07:53:56
【问题描述】:

我在 python 2.7 中编写了一个脚本,使用 pyspark 将 csv 转换为 parquet 和其他东西。 当我在一个小数据上运行我的脚本时,它运行良好,但是当我在一个更大的数据(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 是为了保存所有表名(在适合 csv 的 DDL 中)。

function ddl_to_schema 只需要一个常规的 ddl 并将其编辑为 parquet 可以使用的 ddl。

【问题讨论】:

  • 给我们看一些代码...
  • 将代码添加到问题中,而不是在 cmets 中
  • @Lorelorelore tnx!
  • 看来您唯一的解决方案是不将整个文件读入内存。
  • @usr2564301 我的意思是也许这是一个标志,我应该增加在那里定义的数字......因为我看到了一个像“set.memory.driver”这样的命令,但我真的不知道tnx 回复!

标签: python csv pyspark heap-memory parquet


【解决方案1】:

您的驱动程序似乎内存不足。

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

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

pyspark --driver-memory 2g

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

pyspark --driver-memory 2g --executor-memory 8g

理论上,如果大小不合适,Spark 动作可以将数据卸载到驱动程序,导致内存不足。我无法确定您的情况,但似乎是写入导致了这种情况。

您可以在这里查看理论(阅读驱动程序,然后检查操作):

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

【讨论】:

  • Tnx 为您提供帮助!我想问我应该在哪里输入命令 pyspark --driver-memory 2g ?在我的python脚本中?在 Linux 终端中?
  • 如果你使用的是 spark 2.x 我相信你可以使用:./bin/spark-submit mypythonfile.py --driver-memory 2g
  • 我这样做了,并确保驱动程序内存现在为 2gb(我将其打印到控制台),但我仍然收到相同数字的相同错误。
  • 您是否也尝试过更改执行程序内存(在 2.4 上默认为 1G)?
  • @Pythonist 更改执行程序内存后您的问题得到解决了吗?如果没有,您能建议您尝试的其他方法吗?
【解决方案2】:

如果您运行本地脚本并且不直接使用spark-submit,您可以这样做:

import os

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多