在pypark本地模式下将数据写入SQL数据库表(内存问题)

时间:2019-03-21 07:39:12

标签: python postgresql apache-spark pyspark out-of-memory

我在将数据写入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,但是这里的问题并未分发,因为我使用的是本地模式。我尝试了本文中建议的所有可能的解决方案,但没有成功,因为该解决方案可能适用于集群模式。

0 个答案:

没有答案