#sql-server #ssis #soa #hpc #parallel-processing
#sql-сервер #ssis #soa #hpc #параллельная обработка
Вопрос:
Я новичок в SSIS и пытаюсь использовать его функцию параллелизма для импорта данных из базы данных.
Моя задача состоит в том, чтобы сделать это: импортировать многотерабайтную базу данных в набор плоских файлов как можно быстрее.
Я думал об этом:
В моем распоряжении есть кластер Microsoft Server 2008 HPC (из 3 узлов). Я думал о написании задания HPC SOA, чтобы все три вычислительных узла могли устанавливать независимые подключения к SQL Server и параллельно импортировать часть данных. Конечно, это не имело бы ничего общего с SSIS и было бы независимой утилитой.
Затем я наткнулся на SSIS и его функции параллельного импорта. МОЙ сервер SSIS не очень высокого класса — всего 4 ГБ. Я почему-то склонен использовать SSIS, потому что это идеальный способ Microsoft для импорта данных — и мне не придется переписывать много материала и, возможно, использовать существующие преобразования и т.д.
Каков наилучший способ использовать пользовательские задачи (или доступные) и выполнять этот импорт параллельно?
Ответ №1:
Гитмо, я могу неправильно понять твой вопрос, но попробую ответить. Вам нужно переместить данные из экземпляра SQL Server в несколько файлов, правильно? Вы хотите использовать функциональность параллельного перемещения данных, предоставляемую SSIS. Это означает несколько одновременно выполняемых задач потока данных (DFT). Для каждого целевого файла у вас может быть только один DFT из-за проблем с одновременной записью.
Чтобы получить несколько одновременно выполняющихся задач потока данных, источником которых является база данных SQL Server, а целью — набор файлов, вы, возможно, можете попробовать следующие способы (пожалуйста, обратите внимание, что существуют верхние пределы распараллеливания, которые вы можете использовать в службах SSIS, в зависимости от многих факторов, включая количество ядер вашего процессора, работаете ли вы в BIDS / Visual Studio или нет, и различные настройки в ваших пакетах, вашем сервере (ах), вашем экземпляре SQL Server и многих других соображениях):
- Решение для множественного одновременного DFT: один пакет SSIS с одним диспетчером подключений указывает на исходную базу данных SQL Server, а множество диспетчеров подключений указывают на отдельный целевой файл, плюс один DFT для каждого целевого файла. Все DFT отключены друг от друга (нет ограничений приоритета или зеленых / красных / синих линий / стрелок). Если необходимо выполнить шаги до или после ETL, отличный способ распараллелить эти DFT — это поместить их все в контейнер последовательности, который связан с более ранними и более поздними задачами с помощью ограничений приоритета / стрелок. Все эти отключенные DFT в их собственном контейнере последовательности будут пытаться выполняться одновременно.
- Решение для одновременного использования нескольких DTEXEC: несколько пакетов служб SSIS, каждый со своим собственным DFT, зависящим от целевого файла. Вы вручную запускаете отдельные процессы DTEXEC либо через отдельные окна CMD, либо через графический интерфейс. # 3 ниже приведен вариант этого решения и, возможно, лучший.
- Родительский главный пакет, в котором запущено несколько дочерних пакетов Решение: Оберните пакеты для каждого целевого файла, разработанные в # 2 выше, в один родительский главный пакет. В родительском пакете одновременно запущено несколько задач Execute Package. Опять же, эти задачи Execute Package будут отключены от других задач. Хороший способ сделать это — поместить несколько задач пакета Execute в их собственный контейнер Sequence. Как и раньше, если задачи пакета Execute отключены (без ограничений приоритета / стрелок), все они будут пытаться выполняться одновременно.
Взгляните на эту превосходную статью от команды Microsoft SQLCAT для получения дополнительных идей / понимания: Лучшие практики 10 служб интеграции SQL Server
Вероятно, существуют вариации этих же идей и, возможно, другие решения, доступные как внутри, так и за пределами SSIS. Удачи!
Комментарии:
1. Привет, Стивен, спасибо за твой ответ. Этот параллелизм всегда будет ограничен аппаратным обеспечением сервера SSIS, верно? В моем распоряжении есть кластер Microsoft HPC. Если бы я мог написать какое-нибудь распределенное приложение, которое заставит вычислительные узлы в кластере создавать независимое SQL-соединение и импортировать раздел данных, разве это не было бы быстрее? Есть идеи? Могу ли я каким-то образом использовать пользовательские задачи, чтобы заставить вычислительные узлы в кластере выполнять это? Вот некоторые идеи, которые всплывают у меня в голове, я хотел, чтобы кто-нибудь проверил. Спасибо за ваш ответ!
2. хорошо, позвольте мне добавить к этому. Могу ли я каким-либо образом выполнить удаленный вызов пакета SSIS? Если каким-то образом мы сможем создать пакет ssis программно, я могу создавать их на нескольких узлах и параллельно импортировать данные. Есть идеи?
Ответ №2:
пожалуйста, посмотрите этот пост ….. использование ssis с многопоточностью на стороне и достижение параллелизма при многопоточном последовательном выполнении
без внесения изменений в большую часть пакета
http://sqljunkieshare.com/2011/12/21/parallelism-in-etl-process-ssis-2008-and-ssis-2012/