我正在尝试将多个操作的结果写入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配置问题还是编程问题。
最后我找到了问题。
问题是从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对象的路径的预先计算的列表。