sql массовая вставка никогда не завершается для 10 миллионов записей при использовании df.bulkCopyToSqlDB для блоков данных - PullRequest
1 голос
/ 14 мая 2019

Я читаю 1 ГБ файла CSV (количество записей: 10 миллионов, столбцы: 13) и пытаюсь выгрузить его на сервер SQL. Ниже приведены подробности ниже:

  • Расположение файла CSV: хранилище BLOB-объектов Azure

  • Код: Spark + Scala

  • Кластер: блоки данных Размер: 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], "databaseName" -> connConfig ("dbName"). as [String], "user" -> connConfig ("userName"). as [String], "пароль" -> connConfig ("пароль"). as [String], "dbTable" -> tableName, "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
  • Журналы событий кластера:

enter image description here

  • Другие наблюдения:

    1. Хотя задание выполняется очень долго, кластер не полностью не отвечает. Я попробовал это, отправив больше рабочих мест в том же окне. Работа выполнялась, но заняла сравнительно больше времени, чем обычно (примерно в 10 раз)
    2. Я пытался увеличить рабочие узлы и тип узла (даже выбрал узлы 128 ГБ), но результат все равно был.
    3. Во время выполнения задания я попытался проверить количество строк в таблице SQL с помощью запроса nolock. Я запустил это через 3-4 минуты, пока выполнялось задание, и в таблице было около 2 миллионов записей. Но когда я снова запустил его через 10 минут, запрос продолжал выполняться вечно и никогда не возвращал никаких записей.
    4. Я пытался настроить свойство bulkCopyBatchSize, но оно не очень помогло.
    5. Я попытался удалить код sqlinsertion и использовал операцию агрегации на фрейме данных, который я создаю из файла размером 1 ГБ, и все это занимает всего 40-50 секунд, поэтому проблема заключается только в драйвере SQL / сервере SQL.
...