Хімічна тамп; Матеріалотехніка
Розробка автоматизованих тестових рамок для інженерних систем даних за допомогою Spark
Table of Contents
Критична роль автоматизованого тестування в трубах даних
Системи обробки даних, побудовані на базі даних Apache Spark, що ведеться в задачі-критичній аналітикі, процес машинного навчання та прийняття рішень в режимі реального часу. Навіть єдина логічна помилка в трансформації може призвести до пошкодження звітів про потік, викликати неправильні ділові дії або відходи дорогих ресурсів. Ручне тестування — пошук декількох рядків або запуск сценарію підмножити дані — не може тримати темп з складністю та швидкістю сучасних інженерних систем даних. Автоматизовані системи тестування вирішують цей проміжок шляхом систематично перевірки того, що кожен етап трубопроводу виробляє точні, послідовні результати за відомими умовами. За допомогою складання випробувань в життєвий цикл, команди знижують час виробництва, що досягають впевненості, що досягають досягнення, що.
Розробка програмного забезпечення для систем Spark
В рамках проекту Spark є можливість самостійної роботи з тестуванням та впровадженням технологій розробки трубопроводів для обробки даних в повторювану інженерну дисципліну. В рамках необхідно відокремити проблеми в модульних, багаторазових компонентах, які можуть бути виготовлені для установки, інтеграції та кінцевих випробувань. Нижче наведено основні блоки будівель.
Формування даних
Представник тестових даних є основою ефективного тестування. Замість копіювання всіх виробничих таблиць — це великі, часто чутливі та складні для підтримки — невеликі, фокусовані дані, які здійснюють граничні умови, значення null, дублікати ключів та несподівані формати. Використовуйте вбудовані Spark ] з явними щілинами для ремісничих детермінатичних вводів. Для більш складних сценаріїв, важільних заводів або будівельників, які генерують випадково, але повторювані синтетичні дані за допомогою таких як ScalaCheck (Scala) або
Тестові випадки та асертини
Кожен тестовий випадок визначає конкретний вхідний стан, виконує перетворення або ряд трансформацій, а потім поширюється на затвердження від виходу. Загальні положення включають:
- Рівно-рівнева рівноправність: Порівняйте кожен ряд очікуваних і фактичних данихФраманси.
- Schema Validation: Забезпечити вихідний щіма відповідає призначеним типам і нулімітованим властивостям.
- Постановка перевірок: Перевірити кількість, суми, або унікальні значення після групової роботи.
- Законом роботи: Підтвердити, що отримані стовпчики (наприклад, вік відро, аномалі прапор) потрапляють в прийнятні діапазони.
Написати твердження як чіткі, самодозволюючі заяви. У ScalaTest використовується або ; в PyTest об'єднати з пандасом-сумісними твердженнями або виділеними chisui/assert-spark Бібліотека.
Виконання навколишнього середовища
Тести Spark працюють в локальному режимі, щоб уникнути накладу кластера. Налаштуйте з для багатопоточного виконання в одному JVM або Python процес. Налаштуйте паралельність низькому номеру (наприклад, ]]) для зменшення часу тесту. Для проектів Scala траєта з ]Настроювання бази даних для тестування Spark забезпечує єдиний сеанс для тестування, зниження витрат на стартап. Для PySpark використовуйте [F[FLT:], що налаштовують сеанси Spark.
Перевірка та звітність
Автоматичне виконання тестових випробувань виробляє журнали, пропуски/розрахунки, і деталі помилок. Інтеграція тестових звітів в безперервну інтеграцію (CI) панель так, щоб члени команди можуть швидко визначити, які компоненти трубопроводу зламали і чому. Інструменти, такі як Allure] або вбудовані XML-репортери в ScalaTest і PyTest генерують багаті, бритальні звіти, які відображають вхідні дані, очікувані проти фактичних результатів, і тривалість виконання. Ця прозорість прискорює аналіз кореневих даних і сприяє культурі якості.
Стратегії практичної реалізації
Наведено наступні підходи до карти компонентів в реальних сценаріїх випробувань трубопроводів Spark.
Трансформація тестування одиниць
Підрозділом теста перевіряє одну функцію або метод, який маніпулює DataFrame. Наприклад, розглянемо функцію, яка очищає часові рядки: . Тест блока створює крихітні даніFrame з дією, зловмисними і нульовими таймерами, викликає функцію, і стверджує, що вихідний стовпчик містить лише ці очікувані значення стовпця. Тому що тест працює в локальному режимі і обробляє тільки кілька рядків, він завершується в другому, заохочуючи розробники, щоб перевірити кожен крайовий випадок.
Тестування інтеграції
Тестування інтеграції, які працюють з декількома перетвореннями, також працюють. Наприклад, трубопровод може читати сирі JSON події, розплавлені конструкції, приєднатися до таблиць розмірів, і застосувати функції вікна. Інтеграція тестових завантажень навантажує всі вихідні дані (або реалістичні синтетичні замінники), виконує всю логіку роботи до певного етапу, і стверджує, що вихід цього етапу відповідає відомому золотій мітці. Це зловлює тонкі помилки, такі як неправильні ключі, втрачені рядки через розділення, або schema drift через дії перетворення.
Енд-на-на-дійне тестування труб
Кінцеві тести імітують повний життєвий цикл: читання з джерела (наприклад, Parquet файлів або теми Kafka), обробка та написання на цільову раковину. Тому що ці тести залежать від зовнішніх компонентів, вони найкраще підходять для виділеного тестового середовища або контейнеризації (наприклад, Docker Compose з Spark, MinIO для зберігання об'єктів, і mock Kafka). Дійсно від кінцевого виходу на очікувані файли даних або почитанням назад від мийки. End-to-end тести працюють рідше (наприклад, нічний) але забезпечують найвищу впевненість, що не розірвався точки інтеграції.
Розширені дослідження тестування
За рахунок правильності, сучасні трубопроводи даних також повинні використовувати якість даних, продуктивність SLAs і стійкість. Автоматизовані тести можуть обкладигати ці розміри і також.
Перевірка якості даних з деекватним
Deequ - це бібліотека, побудована на вершині Spark, яка визначає та перевіряє дані, якісне обмеження. Інтеграція Deequ перевіряє у свої тестові люкси для перевірки повноти (не-нульових рахунках), унікальності (не дублікати основних ключів), а також дотримання (наприклад, відсоток значень, що падають в діапазоні). Порада кожного обмеження як тестового випадку: якщо обмеження не зникає, відповідний тест не зникає. Цей підхід забезпечує, що якість даних не є після того, але громадянином трубопроводу першого класу.
Тестування продуктивності та стресу
Автоматизовані тести продуктивності вимірюють, чи може водитися очікувані дані в рамках часу бюджету. Використовуйте одну і ту саму локальну програму Spark, але масштабувати тестові дані на кілька типових розмірів партії. Записувати тривалість виконання для кожного етапу і порівняти його з базовою основою. Якщо зміна коду вводить новий шматочок або неефективний вступ, тест відкриє регресія. Для більш реалістичних результатів, запустіть ці тести на невеликому кластері (наприклад, ефемераль Amazon EMR кластер або Запити кластер[F3:2]
Тестування на CI/CD
Інтеграція Spark тестового пакету в безперервний інтеграційний канал, такі як Jenkins, GitLab CI, або GitHub Actions.
- Перевірка параметрів та навантаження.
- Запускний блок і інтеграційні тести в локальному режимі (записати зворотний зв'язок).
- Якщо всі прохідні, додатково запускають кінцеві або результативні тести в трансієнтному кластері.
- Випробувано з посиланням на всі матеріали, які не можуть бути використані.
Ця автоматизація забезпечує, що без коду досягає основного відділення без проходження акумулятора перевірок. Також вона забезпечує історичний запис результатів випробувань, що полегшує переїзд до конкретних координат.
Кращі практики для забезпечення відповідності профілактиці
- Процедури незалежно: Кожен тест повинен створити свій вхід DataFrames і не покладатися на загальний стан м'язових. Використовуйте свіжу Spark сеанси (або багаторазові, але скидання) для уникнення перехресного забруднення.
- Використовувати представника, але невеликі дані: Тест, який працює в декількох мілісекундах, заохочує часті виконання. Якщо тест вимагає великих даних для отримання значущих результатів, відокремити його в повільному етапі ТПП, який працює на ніч.
- => Тести, що зашифровані: ], що означає, що читач точно перевіряється, що результат очікуваний.
- Рефакторні тест-допомоги: Витягувати загальні візерунки (наприклад, створення Spark сеансу, завантаження фіксатора DataFrame) в корисні функції або риси. Це зменшує дублювання і полегшує оновлення тестового пакету при зміні трубопроводів.
- ]Перевірка тестових даних: Store невеликих файлів фіксації (наприклад, CSV, Parquet) в репозиторію під каталогом . Для збільшення кількості даних використовуйте інструмент для редагування даних, як DVC] або зберігати їх в виділеному S3 відро з контрольними активами.
- Включає негативні тести: Перевірити, що трубопровод ручить недійсний вхід, грацільно-випускаючи винятки з чіткими повідомленнями або виготовляти порожні даніФрами при відповідному.
- Чисте сценарії тестування документів: Встановіть короткий контрольний контроль за даними тестів, що пояснює призначення кожного набору даних, а також правила ведення бізнесу.
Висновок
Будівництво автоматизованої системи тестування для трубопроводів Spark на основі технічних даних не є одними з кроків, але постійними інвестиціями в надійність даних. Поєднання ретельно побудованих даних випробувань, добре визначених затвердження, локальних умов виконання, і інтеграції CI / CD, інженерних команд можуть зловити помилки рано, запобігти виникненню якості даних, і суднопровід змін з впевненістю. Некоректні передові методи, такі як обмеження Deequ і бендикти продуктивності, додатково посилює безпеку мережі. Результатом є цикл розробки, де швидке ітерація не приходить до вартості правильності -налагоджувальні організації, щоб довірити дані, які приводять їх найбільш критичні рішення.