我在将数据写入postgreSQL数据库的表时遇到问题。我需要从posgreSQL表读取200万行数据(当前数据大小),并对数据进行聚合,然后将20万行聚合数据写入另一个postgreSQL表。过去,我使用pandas实现此目的,但是遇到了内存问题,因此我改为在Python中使用spark。在数据小于当前数据大小之前,我可以使用spark来实现此目的,但现在在将数据写入表的阶段一直存在问题。我只有一台具有以下计算机规格的计算机:image。
所以我的spark配置如下:
spark = SparkSession.builder \
.master('local[*]') \
.appName("aggregation_spark") \
.config('spark.driver.memory','11g')\
.config('spark.exector.memory','11g')\
.config('spark.driver.cores','5')\
.config('spark.executor.cores','7')\
.config('spark.default.parallelism','1')\
.config("spark.sql.broadcastTimeout", "36000")\
.config("spark.network.timeout", "3600")\
.config("spark.executor.heartbeatInterval", "1800")\
.getOrCreate()
# .config('spark.memory.offHeap.enabled', True) \
# .config('spark.memory.offHeap.size', "16g") \
# these two configuration didn't work
数据的读写如下:
df=spark.read.jdbc(url="jdbc:postgresql://localhost:5432/some_databse",table=table_name,properties = {
"user": "some_username",
"password": "some_password"
},numPartitions = 128)
... some codes here ...
#Everything up to here works but writing fails
#batch size 1 to 10000 didn't work
final_df.write\
.option("batchsize",1)\
.jdbc(url="jdbc:postgresql://localhost:5432/some_database" + "?rewriteBatchedStatements=true",
table=tableToWrite,
mode='overwrite',
properties = {
"user": "some_user",
"password": "some_password",
})
在一台机器上使用spark本地模式,在写入数据之前进入阶段非常快,但是将数据写入表始终失败。编写表的阶段总是重试,有时要花费许多小时。我收到的错误消息通常是:
java.lang.OutOfMemoryError: Java heap space
或
java.lang.OutOfMemoryError: GC overhead limit exceeded
我尝试将各种不同的配置参数和不同的批处理大小从1更改为10000,但是该程序在编写阶段一直失败,并得到了此错误之一。所以我不确定这里是什么问题。
请注意,我使用的是本地模式的单机,因此在单节点中只有一个具有一个驱动程序和执行程序的JVM。因此,我认为分区无关紧要。我研究了另一个问题(URL:How to optimize partitioning when migrating data from JDBC source?),但这是群集模式下的YARN,但是这里的问题并未分发,因为我使用的是本地模式。我尝试了本文中建议的所有可能的解决方案,但没有成功,因为该解决方案可能适用于集群模式。