Работа с модулем «REST-Uploader»
Модуль асинхронной загрузки данных из сторонних источников реализован для обеспечения параллельной загрузки данных с независимым масштабированием REST- интерфейса. В REST-Uploader обеспечена буферизация поступающих на загрузку данных. Буферизированные данные направляются в базу менеджером дельт с группировкой по датамартам.
Обеспечены следующие функциональные особенности:
- идентификатор генерируется по стандарту UUID;
- метаданные от сервера витрины кешируются и проверяются на соответствие по количеству и по типам полей (при несоответствии загружаемых данных метаданным целевой таблицы сервис для передачи / загрузки данных возвращает статус запроса с ошибкой, без размещения данных в очереди на загрузку);
- загруженные данные размещаются вместе с UUID в очереди с именем «queue»;
- формируется запись с ключом «status.[UUID запроса]» и статусом 0 в очереди;
- пользователю, отправившему запрос, возвращается успешный статус запроса вместе с UUID;
- в логе приложения формироваться запись события получения запроса на загрузку с указанием идентификатора запроса, идентификатора внешнего источника, времени обработки и размера загруженных данных.
Загружаемые файлы обязательно должны быть в кодировке UTF-8.
Действия по установке выполняются через SSH-консоль технологического пользователя.
Общий процесс установки состоит из следующих действий:
- Настроить конфигурацию модуля.
- Создать на сервере директорию для загрузки файлов модуля.
- Загрузить файлы модуля в созданную директорию.
- Запустить модуль.
- Проверить установку модуля.
Команды, приведенные ниже в таблице, предназначены для загрузки данных в Витрину данных, получения статуса запроса, удаления данных из Витрины данных.
Команда (Метод) | Формат URL для вызова команды | Назначение |
---|---|---|
POST | v2/datamarts/{datamart_name}/tables/{table_name}/upload | Загрузка данных в витрину с учетом реализации ФЛК |
GET | v2/requests/{request_id}/status | Получение статуса запроса |
DELETE | v2/datamarts/{datamart_name}/tables/{table_name}/delete | Удаление данных из витрины |
POST | v2/conditions/{datamart}/{table} | Запрос для загрузки списка правил для таблицы, для сохранения в Zookeeper |
PUT | v2/conditions/{datamart}/{table} | Запрос для добавления правил для таблицы, для сохранения в Zookeeper |
GET | v2/conditions/{datamart}/{table} | Запрос для получения списка проверок для таблицы, хранящийся в Zookeer |
DELETE | v2/conditions/{datamart}/{table} | Запрос для удаления всего списка проверок по таблице |
GET | v2/requests/{request_id}/report | Возвращает отчет по форматно логическом контроле загружаемых данных в формате .csv |
GET | v2/group/{group_id}/report | Запрос возвращает отчет по комплектности группы загружаемых файлов в формате .csv |
Поверка форматно-логического контроля включают в себя обязательные проверки, выполняющиеся вне зависимости от настроек модуля в синхронном режиме и необязательные проверки, индивидуальные для каждой таблицы, выполняющиеся в асинхронном режиме в соответствии с правилами, загруженными в Сервисную БД.
Список реализованных проверок указан в таблице:
Наименование проверки | Код ошибки | Кириллическое описание в отчете |
---|---|---|
Проверка уникальности | dublicate | 'дубликат файла/группы’ |
Проверка парсинга файла | parsingErr | 'ошибка парсинга: * текст ошибки *' |
Проверка кодирования | encodingErr | 'кодировка файла не соответствует кодировке UTF-8' |
Проверка превышения предельного размера файла (больше 512 Мб) | tooLargeFile | 'слишком большой файл' |
Проверка наличия данных в файле | emptyFile | 'пустой файл' |
Проверка соответствия заголовков инфосхеме | wrongMetadata | 'структура файла не соответствует схеме' |
Проверка соответствия числа столбцов в строке | wrongFieldsCount | 'некорректное число столбцов в строке' |
Проверка соответствия типам полей | wrongFieldType | 'значение не соответствует типу * требуемый тип *' |
Проверка уникальности полей | nonUniq | 'значение не отвечает требованиям уникальности' |
Проверка регулярных выражений | nonMatchRegex | 'значение не соответствует регулярному выражению регулярное выражение' |
Проверка соответствия условию | nonMatchConstant | 'значение не соответствует условию * условие *' |
Таймаут валидации | validationTimeout | 'истек таймаут валидации файла' |
Синхронные проверки:
- выполняются вне зависимости от настроек модуля REST-Uploader;
- являются блокирующими;
- ошибки синхронных проверок возвращаются в теле ответа по REST-API.
К синхронным проверкам относятся:
- проверка соответствия инфосхеме:
- проверка соответствия имен и количества полей в заголовках;
- проверка типа данных;
- проверка экранирования данных: проверка соответствия числа столбцов по каждой строке;
- проверка соответствия файла кодировке UTF-8, отсутствие bom (при наличии при загрузке удаляются начальные байты ef bb bf);
- проверка размера файла и наличия данных:
- проверка предельного размера загружаемого файла (512 Мб);
- проверка наличия данных в файле.
Асинхронные проверки:
- выполняются в зависимости от настроек модуля;
- проверки не являются блокирующими (поведение при их наличии определяется конфигурацией модуля);
- список проверок уникален для каждой таблицы и хранится в Zookeeper в виде отдельного yaml-файла.
К асинхронным проверкам относятся:
- проверка уникальности полей:
- по сочетанию атрибутов (для комплексных ключей);
- по заданному атрибуту;
- сравнение значения с константой;
- соответствие регулярному выражению.
Для одного поля возможно создать не более одной проверки одного типа, при этом у каждого поля может быть несколько проверок разных типов.
Проверка уникальности проводится:
- в рамках группы файлов, если заданы headers - для проверки в рамках группы обязательно заполнения всех полей:
- group_id;
- group_file_num;
- group_file_count;
- при проверке в рамках группы значения ключей для проверки уникальности в рамках группы хранится в redis;
- по всем файлам в рамках группы при наличии групповых атрибутов;
- по одному файлу, при отсутствии групповых атрибутов.
Пример запроса для проверки уникальности по группе файлов:
--проверка по сочетанию полей fields: id: uniq: true uniq-with: [type,region] --проверка уникальности по одному полю snils: match: "/^[-\s\d]{11}$/" uniq: true
- Проверка соответствия заданному значению проводится для каждого файла вне зависимости от наличия group_id;
- Проверка осуществляется для значений каждого поля в соответствии с заданным правилом;
- Проверка соответствия заданному значению включает в себя:
- проверку сравнения с константой (
>
,<
,> =
,<=
,=
,!=
).
- проверку сравнения с константой (
Период выполнения асинхронных проверок определяется конфигурационным параметром
validation-timeout
и по умолчанию составляет 60 минут.
В случае, если за указанное в настройках время асинхронные проверки не были выполнены, файл удаляется из очереди с обогащением отчета о найденных ошибках ошибкой validationTimeout.
В случае возникновения подобной ошибки рекомендуется:- проверить регулярные выражения, по которым происходит проверка, так как неверно заданное регулярное выражение кратно увеличивает скорость проверки;
- увеличить значение
validation-timeout
и повторить загрузку данных.
Для каждого поля каждой таблицы может быть задано не более одного правила одного типа. в случае, если в POST-запросе у одного поля больше одного правила одного типа, записано в Zookeeper будет только последнее.
Создать правила проверок можно только для таблиц, созданных в Prostore на момент создания проверки.
Таблица применимости проверок
Тип проверки/тип поля | string | number | Значение null |
---|---|---|---|
uniq | --- | --- | правило не задано |
match | --- | --- | правило не задано |
'=' | --- | --- | правило не задано |
'!=' | --- | --- | правило не задано |
'>' | --- | --- | правило не задано |
'<' | --- | --- | правило не задано |
'>=' | --- | --- | правило не задано |
'<=' | --- | --- | правило не задано |
in | --- | --- | правило не задано |
При выполнении POST/PUT-запроса
/v2/conditions/{datamart}/{table}
модуль REST-Uploader запрашивает список метаданных по таблице запроса и проверяет yaml-файл по соответствию именам полей и типов (применима ли настройка на данного типа поля).В случае несоответствия проверок:
- именам полей – в yaml-файле присутствует проверка с именем поля, которого нет в списке полей Prostore;
- применимости – например, заданs проверки
>
,<
,> =
,<=
для текстового поля.
REST-Uploader возвращает ошибку 400 с текстом ошибки в теле ответа:
- "имя /имя поля/ не соответствует таблице"
- "проверка /проверка/ недопустима для поля /имя поля/
Путь хранения проверок: [zookeeper-path]/datamart/table.
Пример файла настроек rule-set для Zookeeper сохраняется в виде .yaml-файла.
Раскрыть type=rest---example1 fields: id: match: "/^\d+$/" uniq: true uniq-with: [type,region] type: in: ["1","2","3"] snils: match: "/^[-\s\d]{11}$/" uniq: true e-mail: match: "/^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i" age: “>”: 6 “<”: 19 ---example2 fields: id: uniq: true subject: '=': math mark: “!=”: null year: “in”: [2022, 2023] #или
Примеры недопустимых проверок:
Раскрыть type=restfields: id: match: "/^\d+$/" uniq: true uniq-with: [type,region] uniq-with: [type,snils] #две проверки одного типа, в zookeeper будет записано последнее правило: uniq-with: [type,snils] snils: match: "/^[-\s\d]{11}$/" uniq: false uniq: true #взаимоисключающие проверки, записано в zookeeper будет последнее правило uniq: true e-mail: match: "/^[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}$/i" match: "/^[-\s\d]{11}$/" #две проверки одного типа, записано в zookeeper будет последнее правило match: "/^[-\s\d]{11}$/" age: “>”: 6 “>”: 19 #две проверки одного типа, записано в zookeeper будет последнее правило: '>': 19 subject: “>”: math #несоответствие применимости типа проверки текстовому полю
Идентификаторы клиентов хранятся в Zookeeper:
- путь хранения:
/adapter/[env]/REST-Uploader/ids
; - формат хранения:
- .yaml-файл;
- вид:
ids: ['a111','b222']
.
Отчет проверки ФЛК в случае ошибок
Отчет по проверкам ФЛК хранится на общем дисковом ресурсе в формате .csv, путь определяется в файле application.yaml и должен быть общим для всех экземпляров модуля.
Имя файла:
report_[request_id]
.Отчет состоит из следующих полей:
- line – номер строки, в которой зафиксирована ошибка, для проверок по файлу в строке в данном поле указываем file;
- field – наименование поля, в котором зафиксирована ошибка, если поле невозможно определить, оставляем пустую строку;
- err_code – код ошибки;
- value – значение поля, если поле невозможно определить, оставляем пустую строку;
- text – кириллическое описание ошибки в соответствии с классификатором.
Пример .csv-журнала:
line, field, err_code, value, text 25, email, nonMatchRegex, pisem@net, значение не соответствует регулярному выражению "/^\S+@\S+\.\S+$/" 25, id, nonUniq, 132, значение не отвечает требованиям уникальности
Для оценки результатов ФЛК реализован REST-интерфейс для получения отчета об ошибках по request_id файла в формате .csv.
Отчет по группе файлов
Отчет об итогах проверки файлов в рамках группы формируется после валидации всех файлов группы или после истечения периода жизни группы и хранится на дисковом ресурсе, путь к которому определяется конфигурацией модуля REST-Uploader.
Имя файла:
group_[group_id]
.request_id, group_file_num, group_file_count, validation 2e8c8ab2-44db-4dcb-8ae5-2365121b4e14, 3, 3, done dcf43fc7-e152-459b-8af5-48d91d4b6a21, 1, 3, done b4503fc7-e152-459b-8af5-48d91d4b6a21, 2, 3, timeout
Каждый экземпляр REST-Uploader проверяет возраст файлов отчетов, при обнаружении файлов старше, чем срок хранения отчетов, указанный в конфигурации, удаляет их. Периодичность проверки равна (срок хранения отчетов) *10.
Загрузка файлов в рамках группы
При необходимости обеспечить проверку уникальности полей в рамках группы файлов, при выполнении запроса следует
'/v2/datamarts/{datamart_name}/tables/{table_name}/upload'
заполнить в header три групповых атрибута файла:Атрибут | Описание | Формат | Пример |
---|---|---|---|
group_id | Идентификатор группы (задается пользователем) | string, UUID | dcf43fc7-e152-459b-8af5-48d91d4b6a21 |
group_file_num | Номер файла в рамках группы, не должен быть больше group_file_count | integer | 1 |
group_file_count | Общее число файлов в группе | integer | 3 |
В рамках периода жизни группы, определяемом конфигурационным параметром
save_group_time
файла application.yaml, повторно использовать один и тот же group_id для разных групп файлов нельзя, в случае повторного использования, модуль REST-Uploader вернет ошибку dublicate.При загрузке данных в рамках группы, помимо отчета об ошибках, после обработки всех файлов группы или по истечении периода жизни группы, формируется отчет по комплектности группы, в котором содержится информация:
- общее число файлов в группе (
group_file_count
); - request_id каждого полученного модулем файла и его номер в рамках группы (
group_file_num
); - статус валидации файла:
- Done – в случае, если валидация выполнена успешно;
- Timeout – в случае, если процесс валидации не успел завершиться за указанный в настройках период
validation-timeout
.