我有一个Spark作业,它将CSV文件中的数据加载到MySQL数据库中。
一切正常,但最近我注意到Spark在插入阶段打开了许多连接(超过300个连接)。感觉就像是为每个插入语句打开一个新连接,使其保持打开状态,并在某个时间点进行提交和关闭连接。有没有一种方法可以在每次插入之后或在处理10K批处理后进行提交,并且一次提交?
这将是不为每个插入打开连接。如果需要处理1K记录是很好的选择,但是当您处理数十亿条记录时,它会占用大量资源。
答案 0 :(得分:1)
如果对数据帧进行任何操作(默认情况下会导致shuffl,spark),则创建200个分区。导致200个数据库连接。
spark.sql.shuffle.partitions-配置在对联接或聚集的数据进行混排时要使用的分区数。 -默认值:200
使用以下方法检查数据帧的分区数量:
df.rdd.getNumPartitions
在常用列上使用重新划分数据框:
df.repartition(NUMBER_OF_PARTIOTONS, col("Frequent_used_column"))
您还可以设置'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()