python - 总分配超过堆内存的 95.00%(960,285,889 字节)- pyspark 错误
问题描述
我在 python 2.7 中编写了一个脚本,使用 pyspark 将 csv 转换为 parquet 和其他东西。当我在一个小数据上运行我的脚本时,它运行良好,但是当我在一个更大的数据(250GB)上运行时,我迷上了以下错误——总分配超过了堆内存的 95.00%(960,285,889 字节)。我怎么解决这个问题?它发生的原因是什么?天呐!
部分代码:导入的库:
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 中)。
函数 ddl_to_schema 只需要一个常规的 ddl 并将其编辑为 parquet 可以使用的 ddl。
解决方案
您的驱动程序似乎内存不足。
默认情况下,驱动程序内存设置为 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
推荐阅读
- python - 基于作为子集的列值匹配 DataFrame
- python - 当迭代字符串python时,最后返回None
- javascript - 如何解密 kotlin 中的文本,在 nodejs 中加密?
- jwt - 如何识别来自不同租户nestjs多租户jwt的jwt令牌
- sql - cosmos DB中如何实现JOIN IN、GROUP BY等复杂SQL语句
- php - 试图获取非对象的属性“full_time”
- ios - 为什么 didSelectRowAt 函数会突出显示多行?
- c# - 在 C# 中屏蔽基于名称的长度
- google-bigquery - 如何在 Bigquery 的一个 select 语句中使用两个 group by 语句?
- docker - 我不能在 bitnami/spark docker 容器上使用 --package 选项