Работа с модулем «REST-Uploader»

Модуль асинхронной загрузки данных из сторонних источников реализован для обеспечения параллельной загрузки данных с независимым масштабированием REST- интерфейса. В REST-Uploader обеспечена буферизация поступающих на загрузку данных. Буферизированные данные направляются в базу менеджером дельт с группировкой по датамартам.
Обеспечены следующие функциональные особенности:
  • идентификатор генерируется по стандарту UUID;
  • метаданные от сервера витрины кешируются и проверяются на соответствие по количеству и по типам полей (при несоответствии загружаемых данных метаданным целевой таблицы сервис для передачи / загрузки данных возвращает статус запроса с ошибкой, без размещения данных в очереди на загрузку);
  • загруженные данные размещаются вместе с UUID в очереди с именем «queue»;
  • формируется запись с ключом «status.[UUID запроса]» и статусом 0 в очереди;
  • пользователю, отправившему запрос, возвращается успешный статус запроса вместе с UUID;
  • в логе приложения формироваться запись события получения запроса на загрузку с указанием идентификатора запроса, идентификатора внешнего источника, времени обработки и размера загруженных данных.
Загружаемые файлы обязательно должны быть в кодировке UTF-8.

Установка модуля

Действия по установке выполняются через SSH-консоль технологического пользователя.
Общий процесс установки состоит из следующих действий:
  1. Настроить конфигурацию модуля.
  2. Создать на сервере директорию для загрузки файлов модуля.
  3. Загрузить файлы модуля в созданную директорию.
  4. Запустить модуль.
  5. Проверить установку модуля.

Команды модуля

Команды, приведенные ниже в таблице, предназначены для загрузки данных в Витрину данных, получения статуса запроса, удаления данных из Витрины данных.
Команда (Метод)Формат 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 и повторить загрузку данных.

Хранение настроек в Zookeeper

Для каждого поля каждой таблицы может быть задано не более одного правила одного типа. в случае, если в POST-запросе у одного поля больше одного правила одного типа, записано в Zookeeper будет только последнее. Создать правила проверок можно только для таблиц, созданных в Prostore на момент создания проверки.
Таблица применимости проверок
Тип проверки/тип поляstringnumberЗначение 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=rest

fields:
  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, UUIDdcf43fc7-e152-459b-8af5-48d91d4b6a21
group_file_num
Номер файла в рамках группы, не должен быть больше group_file_countinteger1
group_file_count
Общее число файлов в группеinteger3
В рамках периода жизни группы, определяемом конфигурационным параметром save_group_time файла application.yaml, повторно использовать один и тот же group_id для разных групп файлов нельзя, в случае повторного использования, модуль REST-Uploader вернет ошибку dublicate.
При загрузке данных в рамках группы, помимо отчета об ошибках, после обработки всех файлов группы или по истечении периода жизни группы, формируется отчет по комплектности группы, в котором содержится информация:
  1. общее число файлов в группе (group_file_count);
  2. request_id каждого полученного модулем файла и его номер в рамках группы (group_file_num);
  3. статус валидации файла:
  • Done – в случае, если валидация выполнена успешно;
  • Timeout – в случае, если процесс валидации не успел завершиться за указанный в настройках период validation-timeout.
Предыдущий раздел
Подготовка к работе
Следующий раздел
Загрузка CSV-файлов в Витрину данных
Была ли страница полезной?