当前位置: 代码迷 >> 综合 >> Spark DataFrame 写入MySQL性能调优
  详细解决方案

Spark DataFrame 写入MySQL性能调优

热度:0   发布时间:2023-12-12 03:42:53.0
  • 最近在做公司运营报表时需要将百万数据一次性写入MySQL简单指定必须参数url,user,password,driver(也为必须参数,如果不指定会报错),dbtable后,发现写入数据时非常的慢,甚至只写入一部分后直接报错,为解决此问题,在网上搜索可以做以下调优

spark jdbc参数介绍:

  • 在spark官网spark sql jdbc部分提供了以下参数:

      url:要连接的JDBC URL。列如:jdbc:mysql://ip:3306dbtable:应该读取的JDBC表。可以使用括号中的子查询代替完整表(使用select 语句代替表,例如,(select * from table_name) as t1,必须给查询结果加上别名)driver:用于连接到此URL的JDBC驱动程序的类名,列如:com.mysql.jdbc.DriverpartitionColumn,lowerBound,upperBound,numPartitions:这些options仅适用于read数据。这些options必须同时被指定。他们描述,如何从多个workers并行读取数据时,分割表。partitionColumn必须是表中的数字列。lowerBound和upperBound仅用于决定分区的大小,而不是用于过滤表中的行。表中的所有行将被分割并返回。fetchsize:仅适用于read数据。JDBC提取大小,用于确定每次获取的行数。这可以帮助JDBC驱动程序调优性能,这些驱动程序默认具有较低的提取大小(例如,Oracle每次提取10行)。batchsize:仅适用于write数据。JDBC批量大小,用于确定每次insert的行数。这可以帮助JDBC驱动程序调优性能。默认为1000。isolationLevel:仅适用于write数据。事务隔离级别,适用于当前连接。它可以是一个NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,或SERIALIZABLE,对应于由JDBC的连接对象定义,缺省值为标准事务隔离级别READ_UNCOMMITTED。truncate:仅适用于write数据。当SaveMode.Overwrite启用时,此选项会truncate在MySQL中的表,而不是删除,再重建其现有的表。这可以更有效,并且防止表元数据(例如,索引)被去除。但是,在某些情况下,例如当新数据具有不同的模式时,它将无法工作。它默认为false。createTableOptions:仅适用于write数据。此选项允许在创建表(例如CREATE TABLE t (name string) ENGINE=InnoDB.)时设置特定的数据库表和分区选项。
    

写入参数优化

url:在url后加上参数rewriteBatchedStatements=true表示MySQL服务开启批次写入,此参数是批次写入的一个比较重要参数,可明显提升性能
batchsize:DataFrame writer批次写入MySQL 的条数,也为提升性能参数
isolationLevel:事务隔离级别,DataFrame写入不需要开启事务,为NONE
truncate:overwrite模式时可用,表时在覆盖原始数据时不会删除表结构而是复用

eg:
.mode(SaveMode.Overwrite).format("jdbc").option("url", "jdbc:mysql://host:端口?rewriteBatchedStatements=true").option("dbtable", "xxx").option("user", "xxx").option("password", "xxx").option("driver", "com.mysql.cj.jdbc.Driver").option("batchsize",10000).option("isolationLevel","NONE").option("truncate","true").save()
  相关解决方案