[使用JDBC将数据帧写入Postgresql时的java.lang.StackoverflowError

问题描述 投票:0回答:1

我正在尝试将多个操作的结果写入AWS Aurora PostgreSQL集群。所有计算都执行正确,但是,当我尝试将结果写入数据库时​​,出现下一个错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o12179.jdbc.
: java.lang.StackOverflowError
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:256)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:256)
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:255)

我已经尝试增加群集大小(15台r4.2xlarge机器),将数据的分区数更改为120个分区,将执行程序和驱动程序内存分别更改为4Gb,并且我面临相同的结果。

当前的SparkSession配置是下一个:

spark = pyspark.sql.SparkSession\
                   .builder\
                   .appName("profile")\
                   .config("spark.sql.shuffle.partitions", 120)\
                   .config("spark.executor.memory", "4g").config("spark.driver.memory", "4g")\
                   .getOrCreate()

我不知道是Spark配置问题还是编程问题。

jdbc pyspark stack-overflow
1个回答
0
投票

最后我找到了问题。

问题是从S3迭代读取的内容,创建了一个很大的DAG。我按照以下说明更改了从S3读取CSV文件的方式。

    df = spark.read\
              .format('csv')\
              .option('header', 'true')\
              .option('delimiter', ';')\
              .option('mode', 'DROPMALFORMED')\
              .option('inferSchema', 'true')\
              .load(list_paths)

其中list_paths是到S3对象的路径的预先计算的列表。

© www.soinside.com 2019 - 2024. All rights reserved.