powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / fias house
17 сообщений из 17, страница 1 из 1
fias house
    #39991209
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа,

Вопрос на фантазию:

Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс?

Поясню в чем интерес и что следует учесть: база данных домов представленна кучей файлов .dbf вида :HOUSE01.dbf, HOUSE02.dbf, HOUSENN.dbf

Сейчас NN ограниченна размером в 99, но будем учитывать что в итоге порог файлов может перешагнуть эту отметку и потенциально файлов будет больше 100.

нужно выстроить некий ETL процесс таким образом что бы он мог жить максимально долго без каких либо видоизменений в будующем.
в связи с этим вопрос рисования dtsx-пакета достаточно не тривиальный.

есть несколько идей как грузить:
как мне видится максимально быстро было бы загрузить каждую dbf в отдельную таблицу в параллельных потоках по типу:
нарисовать глобальный скоуп задач DF покрывающий каждый потенциальный файл
после этого сделать merge всего этого добра в единую таблицу. но этот подход не попадает в рамки условия что в будующей добавятся новые файлы, нужно будет добавлять дополнительные задачи data flow для новых файлов.
но тут есть потенциальный минус: в одной DF указывать кучу избыточных источников к примеру перечислить 100 источников каждый на свою dbf, то при запуске когда пакет попытается обратиться к источнику данных и не найдет его, он остановит весь шаг dataflow, а загрузки желательно должны быть не зависимы друг от друга: то есть если к примеру HOUSE05.dbf не положили - ничего страшного загрузится все без нее.
(и кстати у меня пакет при использовании овер 70 источников данных валится с ошибкой доступа oledb, не стал разбираться с чем это связанно)

другая идея что в начале отрабатывает скриптовая задача которая собирает список доступных файлов в каталоге загрузки и в рантайме мастерит новый пакет с требуемым кол-вом DF задач (не проверял, потенциально возможно, но не уверен что будет работать)

можно конечно выстроить модель: foreach var_dbf in catalog { run dataflow => oledb.AccessMode = Openrowset from variable, oledb.OpenrowsetVariable = var_dbf }
но такой подход будет файлы грузить последовательно а не параллельно.


вообщем кто как бы выстроил модель загрузки данных?
подчеркиваю цель - максимально быстрая загрузка с минимальными возможными изменениями процесса если кол-во файлов данных со временем будет меняться, спортивный интерес.
...
Рейтинг: 0 / 0
fias house
    #39991239
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати еще пришла мысль в голову что динамически можно выстроить в таком ключе:

в одном пакете собрать список файлов в папке и в for each цикле по данному списку запускать параметризированный пакет вида

псевдокод
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
data flow (var_sourcefile, var_destination_table) => {

    oledb_source { oledb.AccessMode = "Openrowset from variable",
                   oledb.OpenrowsetVariableName = var_sourcefile
    } =>
    oledb_target {
        oledb.TableName = var_destination_table
    }
}



где var_sourcefile = будет первым параметром пакета
var_destination_table = вторым параметром пакета


главное что бы запуск задачи execute package task был асинхронен, не помню есть ли опция у данного таска не ждать завершения работы пакета.

опять правда что то придется придумывать с синхронизацией загруженных данных в общую кучу когда все таски отработают
...
Рейтинг: 0 / 0
fias house
    #39991274
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

у меня это сделано через промежуточные таблицы, в которые сначала загружаются все DBF, затем производится синхронизация с внутренним справочником. Но задача максимально быстро не стоит. ФИАС настолько часто не обновляется.

От идеи загрузки домов отказались, т.к. актуальность запаздывает, это не устраивает. Кроме того ,есть проблемы с учетом угловых домов.

Одновременно можно загружать в кластерную секционированную таблицу если очень хочется. Но это не новость, полагаю.
...
Рейтинг: 0 / 0
fias house
    #39991275
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делал я как-то загрузчик на С# для подобной задачи. Выделяется сразу пул потоков, по мере их освобождения подкидывается задача через лямбда-выражение. Уже не помню всех материй.
...
Рейтинг: 0 / 0
fias house
    #39991278
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
felix_ff,

у меня это сделано через промежуточные таблицы, в которые сначала загружаются все DBF, затем производится синхронизация с внутренним справочником. Но задача максимально быстро не стоит. ФИАС настолько часто не обновляется.

От идеи загрузки домов отказались, т.к. актуальность запаздывает, это не устраивает. Кроме того ,есть проблемы с учетом угловых домов.

Одновременно можно загружать в кластерную секционированную таблицу если очень хочется. Но это не новость, полагаю.


да в целом у меня тоже острой задачи не стоит.
у нас есть обычный пакет по последовательной загрузке он вообще полный справочник лопатит где то минут за 30-40 на виртуалке с 16 гб озу, но чет на меня сегодня перфекционизм напал решил поизвращаться поэкспериментировать в плане фантазии высокого полета как можно было бы добиться более внушительных показателей.

и пока копался как раз наткнулся на некоторые костыли в плане возможных извращений как раз источников данных по провайдеру jet.oledb - они нормально не параметризируются из-за этого сделать более менее адаптивный пакет к динамическому содержимому -приходится придумывать какие то мудреные схемы.
...
Рейтинг: 0 / 0
fias house
    #39991279
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

я размышлял, но простого для понимания решения для SSIS не нашел. Источник можно определить через переменную, например, но как организовать параллелизм не совсем понятно. На C# реализовать параллельную загрузку файлов проще, припоминаю,что я делал расчет номеров пула потоков исходя из количества ядер. Можно зарезервировать сотню секций, например и при передаче потока передавать номер секции во вставляемых данных согласно номеру потока в пуле.
...
Рейтинг: 0 / 0
fias house
    #39991318
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Господа,
Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс?

Сошлюсь на свою статью:
https://habr.com/ru/post/451720/

Правда, грузит медленно. 5 часов.
...
Рейтинг: 0 / 0
fias house
    #39991322
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
подчеркиваю цель - максимально быстрая загрузка с минимальными возможными изменениями процесса если кол-во файлов данных со временем будет меняться, спортивный интерес.
Сделать несколько параллельных data flow, каждую вызывать в цикле по файлам. Для каждого потока сделать отдельный источник.
В начале пакета получать список всех файлов, и распределять по этим потокам.
Грузить в одну таблицу-кучу.

По моему, тривиальное решение, если файлы одинаковые.

felix_ff
при запуске когда пакет попытается обратиться к источнику данных и не найдет его, он остановит весь шаг dataflow
Этим же разработчик управляет. Хочет, останавливает пакет при ошибке, хочет, не останавливает.
...
Рейтинг: 0 / 0
fias house
    #39991327
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
felix_ff
Господа,
Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс?

Сошлюсь на свою статью:
https://habr.com/ru/post/451720/

Правда, грузит медленно. 5 часов.
Отличная статья!

Но почему XMLBulkLoad загружает так медленно???
...
Рейтинг: 0 / 0
fias house
    #39991343
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, Таблицы гружу последовательно, можно параллельно, тогда будет 2,5 часа. Дольше всего грузится фиас-хаус, собственно, 2,5 часа.
Сервер 24 Гб RAM, зеркало из 7200 шпинделей.
Грузится 3-5 Мб/с
...
Рейтинг: 0 / 0
fias house
    #39991352
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

А зачем грузить сразу всё? Там же что-то было типа "последние изменения".
...
Рейтинг: 0 / 0
fias house
    #39991359
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,

Код: sql
1.
А зачем грузить сразу всё? Там же что-то было типа "последние изменения".



да, дельту мы и грузим она маленькая, но тут недавно был косяк загрузки при котором дельта накатила дополнительно новые дома не убрав при этом старые.

во вторых это спортивный интерес.

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

Этим же разработчик управляет. Хочет, останавливает пакет при ошибке, хочет, не останавливает.

вот чет у меня не получилось не отменять действие шага если внутри datasource вызывает исключение:
настройка была такая:
псевдокод
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
package { 
    .FailParentOnFailure = False
    .MaximumErrorCount = 100

    data flow task {
        .EngineThreads = 100
        .FailParentOnFailure = False
        .FailPackageOnFailure = False
        .MaximumErrorCount = 100
        .LoggingMode = UseParentSetting
        .RunInOptimizedMode = True
        {
           внутри 99 источников типа oledb вида:
            data flow component {
                   .AccessMode = OpenRowset
                   .AlwaysUsedefaultCodePage = False
                   .CommandTimeout = 0
                   .DefaultCodePage = 1251
                   .Name = HOUSE01
                   .OpenRowset = HOUSE01
                   .ValidateExternalMetadata
            }

            у каждого меняется только {Name и OpenRowset от 01 до 99}

           все источники линкуются на 
           Union all компонент а уже он линкуется на 
           цель oledb смотрящую на сервер
         }
    }
}

если такую вариацию запускать, то при наличии более 70 источников будет выдаваться вот такое:
Код ошибки служб SSIS: DTS_E_OLEDBERROR. Возникла ошибка OLE DB. Код ошибки: 0x80004005.
Доступна запись OLE DB. Источник: "Microsoft JET Database Engine" Результат: 0x80004005 Описание: "Неопознанная ошибка".
Ошибка: 0xC020801C в DF, HOUSE71 [5378]: Код ошибки служб SSIS: DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. Вызов метода AcquireConnection диспетчера соединений "\\path_to_dbf_catalog" завершился сбоем с кодом ошибки 0xC0202009. Возможно, до этого были опубликованы сообщения об ошибках, в которых содержатся более подробные сведения о причине сбоя метода AcquireConnection.
Ошибка: 0xC004701A в DF, SSIS.Pipeline: Ошибка перед выполнением HOUSE71. Код ошибки 0xC020801C.

и как бы шаг тормозится, хотя по сути не должен
если количество источников опускать до 70 она уходит, но пакет все равно остановится если источника файлика одного из таких источников данных в каталоге не окажется

но смысл даже не в ошибке, такой подход как я уже говорил несколько неоптимален в плане того что как только появятся новые файлы данных в какой то момент придется залезать в пакет и допиливать его под новые источники

...
Рейтинг: 0 / 0
fias house
    #39991361
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще кстати для ускорения есть идея грузить в стейджевые in-memory таблицы а уже с них сливать в постоянную дисковую, руки пока не дошли до конфига самого сервера но там думаю тоже есть с чем поиграться
...
Рейтинг: 0 / 0
fias house
    #39991387
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Да надо тогда уж вообще сделать id-хеш строки и засунуть всё в какую-нибудь key-value-nosql, да проверять изменения по ней.
...
Рейтинг: 0 / 0
fias house
    #39991451
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
еще кстати для ускорения есть идея грузить в стейджевые in-memory таблицы а уже с них сливать в постоянную дисковую, руки пока не дошли до конфига самого сервера но там думаю тоже есть с чем поиграться


Не надо, я такое тестировал для DWH, выигрыша особо и нет.

alexeyvg предложил способ распараллеливания, им и пользуйтесь.
...
Рейтинг: 0 / 0
fias house
    #39991568
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
alexeyvg, Таблицы гружу последовательно, можно параллельно, тогда будет 2,5 часа. Дольше всего грузится фиас-хаус, собственно, 2,5 часа.
Сервер 24 Гб RAM, зеркало из 7200 шпинделей.
Грузится 3-5 Мб/с
Обратил внимание, что CheckConstraints включена, а ForceTableLock наоборот.
Может, возрастёт скорость в десяточек раз, если это перевыключить?

Притом что вы грузите в кучи без индексов, и, как я понял, без других констрейнов, решив всё это создать потом.
...
Рейтинг: 0 / 0
fias house
    #39991619
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, Гм... Не обратил внимание. Если так, то реальный косяк, спасибо, попробую, отпишусь.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / fias house
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]