Monitorimi i proceseve ETL në një depo të vogël të dhënash

Shumë njerëz përdorin mjete të specializuara për të krijuar rutina për nxjerrjen, transformimin dhe ngarkimin e të dhënave në bazat e të dhënave relacionale. Procesi i mjeteve regjistrohet, gabimet regjistrohen.

Në rast gabimi, regjistri përmban informacion që mjeti dështoi për të përfunduar detyrën dhe cilat module (shpesh java) ndaluan ku. Rreshtat e fundit mund të përmbajnë një gabim të bazës së të dhënave, siç është një shkelje e çelësit unik të tabelës.

Për t'iu përgjigjur pyetjes se çfarë roli luan informacioni i gabimit ETL, i klasifikova të gjitha problemet që ndodhën gjatë dy viteve të fundit në një depo mjaft të madhe.

Monitorimi i proceseve ETL në një depo të vogël të dhënash

Gabimet e bazës së të dhënave përfshijnë si p.sh.: nuk kishte hapësirë ​​të mjaftueshme, lidhja u humb, seanca u pezullua, etj.

Gabimet logjike përfshijnë shkelje të çelësave të tabelës, objekte të pavlefshme, mungesë aksesi në objekte, etj.
Planifikuesi mund të mos lansohet në kohë, mund të ngrijë, etj.

Gabimet e thjeshta nuk kërkojnë shumë kohë për t'u korrigjuar. Një ETL e mirë mund t'i trajtojë vetë shumicën prej tyre.

Gabimet komplekse e bëjnë të nevojshme hapjen dhe kontrollimin e procedurave të trajtimit të të dhënave dhe hetimin e burimeve të të dhënave. Shpesh çojnë në nevojën për të testuar ndryshimet dhe vendosjen.

Pra, gjysma e të gjitha problemeve janë të lidhura me bazën e të dhënave. 48% e të gjitha gabimeve janë gabime të thjeshta.
Një e treta e të gjitha problemeve lidhen me ndryshimet në logjikën ose modelin e ruajtjes; më shumë se gjysma e këtyre gabimeve janë komplekse.

Dhe më pak se një e katërta e të gjitha problemeve lidhen me planifikuesin e detyrave, 18% e të cilave janë gabime të thjeshta.

Në përgjithësi, 22% e të gjitha gabimeve që ndodhin janë komplekse dhe kërkojnë më shumë vëmendje dhe kohë për t'u korrigjuar. Ato ndodhin rreth një herë në javë. Ndërsa gabimet e thjeshta ndodhin pothuajse çdo ditë.

Natyrisht, monitorimi i proceseve ETL do të jetë efektiv kur vendndodhja e gabimit tregohet në regjistër sa më saktë që të jetë e mundur dhe kërkohet kohë minimale për të gjetur burimin e problemit.

Monitorim efektiv

Çfarë doja të shihja në procesin e monitorimit të ETL?

Monitorimi i proceseve ETL në një depo të vogël të dhënash
Filloni në - kur fillova të punoj,
Burimi - burimi i të dhënave,
Shtresa - cili nivel ruajtjeje është i ngarkuar,
ETL Job Name është një procedurë ngarkimi që përbëhet nga shumë hapa të vegjël,
Numri i hapit - numri i hapit që po ekzekutohet,
Rreshtat e prekur - sa të dhëna janë përpunuar tashmë,
Kohëzgjatja sekondë - sa kohë duhet për të ekzekutuar,
Statusi - nëse çdo gjë është mirë apo jo: OK, ERROR, RUNNING, HANGS
Mesazh - mesazhi i fundit i suksesshëm ose përshkrimi i gabimit.

Bazuar në statusin e të dhënave, mund të dërgoni një email. letër pjesëmarrësve të tjerë. Nëse nuk ka gabime, atëherë një letër nuk është e nevojshme.

Në këtë mënyrë, në rast gabimi, tregohet qartë vendndodhja e incidentit.

Ndonjëherë ndodh që vetë mjeti i monitorimit të mos funksionojë. Në këtë rast, është e mundur të thirret pamja (pamja) drejtpërdrejt në bazën e të dhënave, në bazë të së cilës është ndërtuar raporti.

Tabela e monitorimit ETL

Për të zbatuar monitorimin e proceseve ETL mjafton një tabelë dhe një pamje.

Për ta bërë këtë ju mund të ktheheni në ruajtjen tuaj të vogël dhe krijoni një prototip në bazën e të dhënave sqlite.

Tabelat DDL

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);

Shiko/raporto DDL

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 Kontrollimi i aftësisë për të marrë një numër të ri sesioni

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

Karakteristikat e tabelës:

  • fillimi dhe përfundimi i procedurës së përpunimit të të dhënave duhet të shoqërohet me hapat ETL_START dhe ETL_END
  • në rast gabimi, duhet të krijohet një hap ETL_ERROR me përshkrimin e tij
  • sasia e të dhënave të përpunuara duhet të theksohet, për shembull, me yje
  • e njëjta procedurë mund të fillohet në të njëjtën kohë me parametrin force_restart=y; pa të, numri i seancës i jepet vetëm procedurës së përfunduar
  • në modalitetin normal është e pamundur të kryhet paralelisht e njëjta procedurë e përpunimit të të dhënave

Operacionet e nevojshme për të punuar me tabelën janë si më poshtë:

  • marrja e numrit të seancës së procedurës ETL që po fillon
  • futja e një hyrjeje regjistri në një tabelë
  • marrjen e rekordit të fundit të suksesshëm të një procedure ETL

Në bazat e të dhënave si Oracle ose Postgres, këto operacione mund të zbatohen me funksione të integruara. sqlite kërkon një mekanizëm të jashtëm dhe në këtë rast atë prototip në PHP.

Prodhim

Kështu, raportimi i gabimeve në mjetet e përpunimit të të dhënave luan një rol shumë të rëndësishëm. Por ato vështirë se mund të quhen optimale për të gjetur shpejt shkakun e problemit. Kur numri i procedurave i afrohet njëqind, monitorimi i procesit kthehet në një projekt kompleks.

Artikulli ofron një shembull të një zgjidhjeje të mundshme të problemit në formën e një prototipi. I gjithë prototipi i depove të vogla është i disponueshëm në gitlab Shërbimet SQLite PHP ETL.

Burimi: www.habr.com

Shto një koment