Как разделить загрузочные файлы DB2 по узлам на сервере ETL? - PullRequest
0 голосов
/ 03 мая 2011

Я строю хранилище данных DB2 "Инфосфера" и ожидаю, что у меня будет 8-16 узлов или разделов.

Поскольку я буду загружать со 130-300 миллионов строк в день, и моя загрузкаПроцесс также является моим процессом восстановления - я хочу, чтобы нагрузки были максимально быстрыми.Я не удивлен, обнаружив этот совет в документации IBM "Инфоцентр":

"Можно ожидать повышения производительности, если разделы базы данных, участвующие в процессе распространения, отличаются от разделов загрузки базы данных, посколькуменьше циклов ЦП. "

Я бы предпочел не выделять дорогой узел DB2 только для разделения файлов загрузки по хеш-ключам - поскольку мои ETL-серверы очень дешевы (мы используем Python, а нелицензированный коммерческий продукт).Кроме того, поскольку для восстановления я полагаюсь на архивированные нагрузки, возможно, мне придется преобразовать их в случае добавления узлов в базу данных.Я хотел бы, чтобы это также было сделано на сервере ETL.Примечание. Я считаю, что DataStage также выполняет эту задачу на сервере ETL, а не через DB2.

Кто-нибудь может подсказать, как наш процесс Python ETL может эффективно использовать тот же алгоритм хеширования и таблицы отображения, которые использует DB2?И другие советы?

Спасибо

1 Ответ

2 голосов
/ 03 мая 2011

Прежде всего:

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

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

С точки зрения НАГРУЗКИ количество времени, которое вы сэкономите, предварительно разделив данные, ничтожно мало. Ограничивающим фактором при загрузке данных является запись данных на диск, а не их разбиение. Если перезагрузка данных - ваш основной метод восстановления, я бы не стал сильно беспокоиться об этом.

Если все это не убеждает вас, и вы действительно хотите пойти по пути разделения вашего ETL-процесса, DB2 предоставляет API (в C), который приложения могут вызывать для обработки это: db2GetDistMap () и db2GetRowPartNum (). Вы можете написать собственный модуль Python для этого.

Это наиболее полезно в тех случаях, когда приложение использует SQL для вставки строк в таблицу (в отличие от использования утилиты LOAD) и порождает несколько потоков для записи данных в каждый раздел независимо (т. Е. Каждый поток выполняет преобразование и загрузка параллельно). Если вы не можете распараллелить часть преобразования, не беспокойтесь об этом.

Очевидно, что есть много переменных, поэтому YMMV.

...