Kichik ma'lumotlar omborida ETL jarayonlarini kuzatish

Ko'pchilik ma'lumotlarni relyatsion ma'lumotlar bazalariga olish, o'zgartirish va yuklash uchun tartiblarni yaratish uchun maxsus vositalardan foydalanadi. Asboblar jarayoni qayd qilinadi, xatolar qayd etiladi.

Xato bo'lsa, jurnalda asbob vazifani bajara olmagani va qaysi modullar (ko'pincha java) qaerda to'xtaganligi haqida ma'lumot mavjud. Oxirgi satrlarda jadvalning yagona kalitining buzilishi kabi ma'lumotlar bazasi xatosi bo'lishi mumkin.

ETL xato ma'lumotlari qanday rol o'ynaydi degan savolga javob berish uchun men so'nggi ikki yil ichida yuzaga kelgan barcha muammolarni juda katta omborda tasnifladim.

Kichik ma'lumotlar omborida ETL jarayonlarini kuzatish

Ma'lumotlar bazasi xatolariga quyidagilar kiradi: etarli joy yo'q edi, ulanish uzildi, seans osilgan va hokazo.

Mantiqiy xatolar qatoriga jadval kalitlarining buzilishi, yaroqsiz ob'ektlar, ob'ektlarga kirishning yo'qligi va boshqalar kiradi.
Rejalashtiruvchi o'z vaqtida ishga tushmasligi, qotib qolishi va hokazo.

Oddiy xatolarni tuzatish ko'p vaqtni talab qilmaydi. Yaxshi ETL ularning ko'pchiligini mustaqil ravishda hal qila oladi.

Murakkab xatolar ma'lumotlar bilan ishlash tartib-qoidalarini ochish va tekshirish va ma'lumotlar manbalarini tekshirish zaruriyatini keltirib chiqaradi. Ko'pincha o'zgarishlarni sinab ko'rish va joylashtirish zarurligiga olib keladi.

Shunday qilib, barcha muammolarning yarmi ma'lumotlar bazasi bilan bog'liq. Barcha xatolarning 48% oddiy xatolardir.
Barcha muammolarning uchdan bir qismi saqlash mantig'i yoki modelidagi o'zgarishlar bilan bog'liq, bu xatolarning yarmidan ko'pi murakkab;

Va barcha muammolarning chorak qismidan kamrog'i vazifalarni rejalashtiruvchi bilan bog'liq bo'lib, ularning 18% oddiy xatolardir.

Umuman olganda, yuzaga keladigan barcha xatolarning 22% murakkab va tuzatish uchun eng ko'p e'tibor va vaqt talab etiladi. Ular haftada bir marta sodir bo'ladi. Oddiy xatolar deyarli har kuni sodir bo'lsa-da.

Shubhasiz, ETL jarayonlarini monitoring qilish, agar xatoning joylashuvi jurnalda iloji boricha aniq ko'rsatilganda samarali bo'ladi va muammoning manbasini topish uchun minimal vaqt kerak bo'ladi.

Samarali monitoring

ETL monitoringi jarayonida men nimani ko'rmoqchi edim?

Kichik ma'lumotlar omborida ETL jarayonlarini kuzatish
Boshlash - men ish boshlaganimda,
Manba - ma'lumotlar manbai,
Qatlam - qaysi saqlash darajasi yuklangan,
ETL Job Name - bu ko'plab kichik bosqichlardan iborat yuklash protsedurasi,
Qadam raqami - bajarilayotgan qadamning raqami,
Ta'sir qilingan qatorlar - qancha ma'lumotlar qayta ishlangan,
Davomiyligi sek - bajarish uchun qancha vaqt ketadi,
Status - hammasi yaxshimi yoki yo'qmi: OK, ERROR, RUNING, HNGS
Xabar - oxirgi muvaffaqiyatli xabar yoki xato tavsifi.

Yozuvlar holatiga asoslanib, siz elektron pochta xabarini yuborishingiz mumkin. boshqa ishtirokchilarga xat. Hech qanday xato bo'lmasa, xat kerak emas.

Shunday qilib, xatolik yuz bergan taqdirda, voqea joyi aniq ko'rsatiladi.

Ba'zan shunday bo'ladiki, monitoring vositasi o'zi ishlamaydi. Bunda ko'rinishni (ko'rinishni) bevosita ma'lumotlar bazasida chaqirish mumkin, uning asosida hisobot tuziladi.

ETL monitoring jadvali

ETL jarayonlari monitoringini amalga oshirish uchun bitta jadval va bitta ko'rinish etarli.

Buning uchun siz ga qaytishingiz mumkin o'zingizning kichik xotirangiz va sqlite ma'lumotlar bazasida prototip yaratish.

DDL jadvallari

CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  SID               INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
  LOG_DT            INTEGER NOT NULL DEFAULT 0,  /* Date time */
  LOG_D             INTEGER NOT NULL DEFAULT 0,  /* Date */
  JOB_NAME          TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
  STEP_NAME         TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
  STEP_DESCR        TEXT,                        /* Description of task or error message */
  UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);

DDLni koβ€˜rish/hisobot qilish

CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
  SELECT LOG_D,
    LOG_DT,
    UTL_JOB_STATUS_ID,
    SID,
	CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
	     WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
	     WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
	     WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
	     WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
		 WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
	     WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
	     ELSE 'N/A' END AS LAYER,
	CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
	     WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
	     WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
	     ELSE 'N/A' END AS SOURCE,
    JOB_NAME,
    STEP_NAME,
    CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
    CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
    CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS ERROR_FLAG,
    STEP_NAME || ' : ' || STEP_DESCR AS STEP_LOG,
	SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS AFFECTED_ROWS
  FROM UTL_JOB_STATUS
  WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
  JB.MIN_LOG_DT AS START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
  JB.SOURCE,
  JB.LAYER,
  JB.JOB_NAME,
  CASE
  WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
  ELSE 'OK'
  END AS STATUS,
  ERR.STEP_LOG     AS STEP_LOG,
  JB.CNT           AS STEP_CNT,
  JB.AFFECTED_ROWS AS AFFECTED_ROWS,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS JOB_START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS JOB_END_DT,
  JB.MAX_LOG_DT - JB.MIN_LOG_DT AS JOB_DURATION_SEC
FROM
  ( SELECT SID, SOURCE, LAYER, JOB_NAME,
           MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
           MAX(START_FLAG)       AS START_FLAG,
           MAX(END_FLAG)         AS END_FLAG,
           MAX(ERROR_FLAG)       AS ERROR_FLAG,
           MIN(LOG_DT)           AS MIN_LOG_DT,
           MAX(LOG_DT)           AS MAX_LOG_DT,
           SUM(1)                AS CNT,
           SUM(IFNULL(AFFECTED_ROWS, 0)) AS AFFECTED_ROWS
    FROM SRC
    GROUP BY SID, SOURCE, LAYER, JOB_NAME
  ) JB,
  ( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
    FROM SRC
    WHERE 1 = 1
  ) ERR
WHERE 1 = 1
  AND JB.SID = ERR.SID
  AND JB.JOB_NAME = ERR.JOB_NAME
  AND JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;

SQL Yangi sessiya raqamini olish imkoniyatini tekshirish

SELECT SUM (
  CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
	    AND NOT ( 'y' = 'n' ) /* force restart PARAMETER */
       THEN 1 ELSE 0
  END ) AS IS_RUNNING
  FROM
    ( SELECT 1 AS dummy FROM UTL_JOB_STATUS WHERE sid = -1) d_job
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID, 1 AS dummy
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
	    AND STEP_NAME = 'ETL_START'
      GROUP BY JOB_NAME, SID
    ) start_job /* starts */
  ON d_job.dummy = start_job.dummy
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG'  /* job name PARAMETER */
	    AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
      GROUP BY JOB_NAME, SID
    ) end_job /* ends */
  ON start_job.JOB_NAME = end_job.JOB_NAME
     AND start_job.SID = end_job.SID

Jadvalning xususiyatlari:

  • ma'lumotlarni qayta ishlash protsedurasining boshlanishi va oxiri ETL_START va ETL_END bosqichlari bilan birga bo'lishi kerak
  • xato bo'lsa, uning tavsifi bilan ETL_ERROR qadam yaratilishi kerak
  • qayta ishlangan ma'lumotlar miqdori, masalan, yulduzcha bilan ta'kidlanishi kerak
  • xuddi shu protsedurani force_restart=y parametri bilan bir vaqtda boshlash mumkin, seans raqami faqat tugallangan protseduraga beriladi;
  • normal rejimda bir xil ma'lumotlarni qayta ishlash protsedurasini parallel ravishda bajarish mumkin emas

Jadval bilan ishlash uchun zarur bo'lgan operatsiyalar quyidagilardir:

  • ishga tushirilayotgan ETL protsedurasining sessiya raqamini olish
  • jurnalga yozuvni jadvalga kiritish
  • ETL protsedurasining so'nggi muvaffaqiyatli rekordini olish

Oracle yoki Postgres kabi ma'lumotlar bazalarida bu operatsiyalar o'rnatilgan funktsiyalar bilan amalga oshirilishi mumkin. sqlite tashqi mexanizmni talab qiladi va bu holda u PHPda prototiplangan.

xulosa

Shunday qilib, ma'lumotlarni qayta ishlash vositalarida xatolar haqida xabar berish juda muhim rol o'ynaydi. Ammo muammoning sababini tezda topish uchun ularni optimal deb atash qiyin. Jarayonlar soni yuzga yaqinlashganda, jarayon monitoringi murakkab loyihaga aylanadi.

Maqolada prototip shaklida muammoning mumkin bo'lgan echimiga misol keltirilgan. Kichik omborning butun prototipi gitlabda mavjud SQLite PHP ETL Utilities.

Manba: www.habr.com

a Izoh qo'shish