Mysql SparkSQL连接问题

Mysql SparkSQL连接问题,mysql,apache-spark,apache-spark-sql,Mysql,Apache Spark,Apache Spark Sql,我有一个Spark的工作,就是将CSV文件中的数据加载到MySQL数据库中 一切正常,但最近我注意到Spark在插入阶段打开了许多连接(300多个连接)。对于每个insert语句,感觉就像打开一个新的连接,保持它打开,并在某个时间点执行提交和关闭连接。是否有一种方法可以在每次插入后进行提交,或者在10K批处理后进行一次提交 这将导致不为每个插入打开连接。如果它需要处理1K条记录,这是很好的,但是当您处理数十亿条记录时,它会占用大量资源。如果您对数据帧(默认情况下会导致混乱的数据帧)执行任何操作,

我有一个Spark的工作,就是将CSV文件中的数据加载到MySQL数据库中

一切正常,但最近我注意到Spark在插入阶段打开了许多连接(300多个连接)。对于每个insert语句,感觉就像打开一个新的连接,保持它打开,并在某个时间点执行提交和关闭连接。是否有一种方法可以在每次插入后进行提交,或者在10K批处理后进行一次提交


这将导致不为每个插入打开连接。如果它需要处理1K条记录,这是很好的,但是当您处理数十亿条记录时,它会占用大量资源。

如果您对数据帧(默认情况下会导致混乱的数据帧)执行任何操作,请创建200个分区。导致200个到数据库的连接

spark.sql.shuffle.partitions--配置为联接或聚合洗牌数据时要使用的分区数。-默认值:200

使用以下命令检查数据帧的分区数:

df.rdd.getNumPartitions

在经常使用的列上使用重新划分数据帧:
df.重新分区(分区数、列(“频繁使用列”)

您还可以设置“batchsize”参数来控制每次往返要插入的行数。这有助于提高JDBC驱动程序的性能。默认值为1000

jdbcDF.write
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .option("batchsize", 5000)
  .save()

这会在插入阶段打开许多连接(300多个连接)——这表明您有相当数量的分区。根据上下文,您可以在写入或显式限制资源之前尝试合并/重新分区(例如,通过分配具有有限资源共享的特定队列)。另外,
batchsize
选项
应该可以让您控制每次往返插入的行数。如果这些都不起作用,那么总是有一个较长的路径-写入磁盘并从那里使用
复制
。@user6910411我的代码中没有任何分区