在databricks上使用df.bulkCopyToSqlDB时,SQL批量插入永远无法完成1000万条记录

时间:2019-05-14 08:25:39

标签: scala apache-spark apache-spark-sql bulkinsert azure-databricks

我正在读取1 GB的CSV文件(记录数:1000万,列:13),并尝试将其转储到SQL Server中。以下是以下详细信息:

  • CSV文件位置:天蓝色的Blob存储

  • 代码:Spark + Scala

  • 集群:Databricks 尺寸 enter image description here

  • 代码用于读取文件并转储它:

    val df = spark.read.format(fileparser_config(“ fileFormat”)。as [String])。option(“ header”,fileparser_config(“ IsFirstRowHeader”)。toString).load(fileparser_config(“ FileName”)。 as [String])。withColumn(“ _ ID”,monotonically_increasing_id)

    val bulkCopyConfig = Config(Map(         “ url”-> connConfig(“ dataSource”)。as [String],         “数据库名称”-> connConfig(“ dbName”)。as [String],         “用户”-> connConfig(“ userName”)。as [String],         “密码”-> connConfig(“密码”).as [字串],         “ dbTable”-> tableName,         “ bulkCopyBatchSize”->“ 500000”,         “ bulkCopyTableLock”->“ true”,         “ bulkCopyTimeout”->“ 600”))

    println(s“ $ {LocalDateTime.now()} ************ sql批量插入开始************”)

    df.bulkCopyToSqlDB(bulkCopyConfig)

    println(s“ $ {LocalDateTime.now()} ************ sql批量插入结束************”)

    < / li>
  • 问题:

集群陷入困境,我的工作从未完成。一次它运行了足够长的时间就引发了错误

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
  • 集群事件日志:

enter image description here

  • 其他观察结果:

    1. 虽然该作业运行了很长时间,但群集并不是完全没有响应。我通过在同一窗口中提交更多作业来尝试此操作。这项工作已经完成,但花费的时间却比平时多(大约10倍)
    2. 我尝试增加工作节点和节点类型(甚至选择了128 GB节点),但结果仍然相同。
    3. 在作业运行期间,我尝试使用nolock查询检查SQL表的行数。在作业运行3-4分钟后,我运行了此程序,它为我提供了约200万条记录。但是当我在10分钟后再次运行它时,查询一直保持运行状态,并且从未返回任何记录。
    4. 我尝试调整bulkCopyBatchSize属性,但是它没有太大帮助。
    5. 我试图删除sqlinsertion代码,并对从1 GB文件创建的数据帧使用了聚合操作,整个过程仅需40-50秒,因此问题仅出在sql driver / sql server。 / li>

1 个答案:

答案 0 :(得分:0)

我面临着同样的问题。

Azure SQL Server -标准S7:800个DTU

HDInsight -6个节点(2个D13V2 Head和4个D13V2 Worker)

数据大小-具有17亿行的100GB镶木地板。

最初,我使用“ bulkCopyTimeout” 的时间为600秒,并且观察到超时后加载正在重新开始。然后我将超时值更改为非常大的值,效果很好。

为了提高性能:

在目标表中创建列存储索引并使用

“ bulkCopyBatchSize” = 1048576(将整个批次加载到行组的最大容量中,然后直接将其压缩到列存储中,而不是加载到增量存储中,然后再压缩)

“ bulkCopyTableLock” =“ false”(为了允许并行性)