загрузка 20 миллионов записей из SSIS в SNOWFLAKE через ODBC

Я пытаюсь загрузить около 20 миллионов записей из ssis в snowflake, используя соединение ODBC, эта загрузка занимает вечность. Есть ли более быстрый способ, чем использование ODBC? Я могу подумать о том, чтобы загрузить его в плоский файл, а затем использовать плоский файл для загрузки в снежинку, но знаю, как это сделать.

Обновление: я создал текстовый файл с помощью bcp и поместил этот файл в постановку снежинки с использованием соединения ODBC, а затем с помощью команды copy into для загрузки данных в таблицы.

проблема: сгенерированный txt файл представляет собой файл размером 2,5 ГБ, и ODBC изо всех сил пытается отправить файл на стадию снежинки, любая помощь по этой части ??


person ROXOR7    schedule 05.11.2019    source источник


Ответы (3)


ODBC работает медленно с такой базой данных, Snowflake (и аналогичные хранилища столбцов) также хотят есть файлы с кусками, а не отдельные большие. Проблема с вашим первоначальным подходом заключалась в том, что метод использования ODBC не был бы особенно быстрым в системе, предназначенной для параллельной загрузки узлов через измельченные поэтапные файлы.

Проблема с вашим вторым подходом заключалась в том, что ничего не произошло. Базы данных без столбцов с головным узлом (скажем, Netezza) хотели бы съесть и уничтожить ваш единственный файл, но Snowflake или Redshift в основном собираются принять его как один поток в один узел. Таким образом, прием одного файла размером 2,5 ГБ займет на XS Snowflake с 1 узлом столько же времени, что и на кластере Snowflake с 8 узлами L. Сам ваш единственный узел не перегружен, и у него много свободных циклов ЦП, и он ничего не делает. Похоже, что Snowflake использует до 8 потоков записи на каждом узле для операции извлечения или приема. Вы можете увидеть некоторые тесты здесь: https://www.doyouevendata.com/2018/12/21/how-to-load-data-into-snowflake-snowflake-data-load-best-practices/

Я предлагаю создать как минимум 8 файлов размером (2,5 ГБ / 8) или около 8 315 МБ файлов. Для 2-узлов, по крайней мере, 16. Вероятно, это потребует некоторых усилий в процессе создания файла, если он изначально не предусматривает измельчение и горизонтальное масштабирование; хотя в качестве бонуса он разбивает ваши данные на более простые процессы, которые можно прервать / возобновить / и т. д. в случае возникновения каких-либо проблем.

Также обратите внимание, что после массовой вставки данных в Snowflake маловероятно, что они будут оптимально размещены, чтобы воспользоваться преимуществами микро-разделов, поэтому я бы порекомендовал что-то вроде перестройки таблицы с загруженными данными и, по крайней мере, ее сортировки. ограниченный столбец, т.е. таблицу фактов, которую я бы, по крайней мере, перестроил и отсортировал по дате. https://www.doyouevendata.com/2018/03/06/performance-query-tuning-snowflake-clustering/

person doyouevendata    schedule 10.02.2020

Должно быть быстрее записывать сжатые объекты в хранилище объектов облачного провайдера (AWS S3, Azure blob и т. Д.), А затем COPY INTO Snowflake. Но тоже более сложный.

Вы случайно не пишете по одной строке для 20 000 000 обращений к базе данных?

person Hans Henrik Eriksen    schedule 05.11.2019
comment
Нет, я не делаю по одной строке за раз, я пробую то, что вы предложили, я создал файл с помощью команды bcp и пытаюсь загрузить с помощью копирования в - person ROXOR7; 06.11.2019

сгенерируйте файл, а затем используйте Snow CLI, чтобы поместить его во внутреннюю сцену. Используйте Cooy into для stage-> table. Некоторое кодирование нужно сделать, и вы никогда не сможете избежать транспортировки ГБ по сети, но поставьте coukd compress и передайте файл кусками

person Lars Johansson Blank    schedule 10.02.2020