Scala 在DataRicks上使用df.bulkCopyToSqlDB时,1000万条记录的sql大容量插入永远不会完成
我正在读取1GB的CSV文件(记录数:1000万,列数:13),并试图将其转储到SQL server中。以下为下文的详细信息:Scala 在DataRicks上使用df.bulkCopyToSqlDB时,1000万条记录的sql大容量插入永远不会完成,scala,apache-spark,apache-spark-sql,bulkinsert,azure-databricks,Scala,Apache Spark,Apache Spark Sql,Bulkinsert,Azure Databricks,我正在读取1GB的CSV文件(记录数:1000万,列数:13),并试图将其转储到SQL server中。以下为下文的详细信息: CSV文件位置:azure blob存储 代码:Spark+Scala 集群:数据块 尺寸: 用于读取文件并将其转储的代码: val df=spark.read.format(fileparser_-config(“fileFormat”).as[String]).option(header),fileparser_-config(“IsFirstRowHeader
- CSV文件位置:azure blob存储
- 代码:Spark+Scala
- 集群:数据块 尺寸:
- 用于读取文件并将其转储的代码: val df=spark.read.format(fileparser_-config(“fileFormat”).as[String]).option(header),fileparser_-config(“IsFirstRowHeader”).toString.load(fileparser_-config(“FileName”).as[String])。带列(“\u-ID”,单调递增\u-ID) val bulkCopyConfig=Config(映射( “url”->connconconfig(“数据源”)。作为[字符串], “databaseName”->connconConfig(“dbName”).as[String], “用户”->connConfig(“用户名”).as[String], “password”->connconconfig(“password”).as[String], “dbTable”->表名, “bulkCopyBatchSize”->“500000”, “bulkCopyTableLock”->“true”, “bulkCopyTimeout”->“600”)) println(s“${LocalDateTime.now()}*************sql大容量插入开始*************”) df.bulkCopyToSqlDB(bulkCopyConfig) println(s“${LocalDateTime.now()}*************sql大容量插入结束***********”)
- 问题:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 13 in stage 38.0 failed 4 times, most recent failure: Lost task 13.3 in stage 38.0 (TID 1532, 10.0.6.6, executor 4): com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.\n\tat com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:227)\n\tat com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:796)\n\tat com.microsoft.sqlserver.jdbc.SQLServ
- 群集事件日志:
- 其他意见:
- 虽然作业运行很长时间,但集群并不是完全没有响应。我尝试在同一窗口中提交更多的作业。作业运行了,但花费的时间比平时多(约为10倍)
- 我尝试增加工作节点和节点类型(甚至选择了128 GB节点),但结果仍然是一样的
- 作业运行时,我尝试使用nolock查询检查SQL表行数。当作业运行时,我在3-4分钟后运行了它,它在表中给了我大约200万条记录。但当我在10分钟后再次运行它时,查询一直在运行,并且从未返回任何记录
- 我尝试过调整bulkCopyBatchSize属性,但没有多大帮助
- 我尝试删除sqlinsertion代码,并对从1GB文件创建的数据帧使用聚合操作,整个过程只需40-50秒,因此问题只存在于sql驱动程序/sql server
- 我也面临同样的问题
Azure SQL Server-标准S7:800 DTU
HDInsight-6个节点(2个D13V2头和4个D13V2工作节点)
数据大小-100GB镶木地板,17亿行
最初,我使用“bulkCopyTimeout”作为600秒,我观察到加载在超时后重新启动。然后我将超时更改为一个非常大的值,它工作正常
为了提高绩效:
在目标表中创建列存储索引并使用
“bulkCopyBatchSize”=1048576(将整个批次加载到最大容量的行组中,并将其直接压缩到列存储中,而不是加载到增量存储中,然后再压缩)
“bulkCopyTableLock”=“false”(为了允许并行性)我也面临同样的问题 Azure SQL Server-标准S7:800 DTU HDInsight-6个节点(2个D13V2头和4个D13V2工作节点) 数据大小-100GB镶木地板,17亿行 最初,我使用“bulkCopyTimeout”作为600秒,我观察到加载在超时后重新启动。然后我将超时更改为一个非常大的值,它工作正常 为了提高绩效: 在目标表中创建列存储索引并使用 “bulkCopyBatchSize”=1048576(将整个批次加载到最大容量的行组中,并将其直接压缩到列存储中,而不是加载到增量存储中,然后再压缩) “bulkCopyTableLock”=“false”(为了允许并行性)