Il-monitoraġġ tal-proċessi ETL f'maħżen tad-dejta żgħir

Ħafna jużaw għodod speċjalizzati biex joħolqu proċeduri għall-estrazzjoni, it-trasformazzjoni u t-tagħbija tad-dejta f'databases relazzjonali. Il-proċess tal-għodod tax-xogħol huwa illoggjat, l-iżbalji huma ffissati.

F'każ ta' żball, ir-reġistru fih informazzjoni li l-għodda naqset milli tlesti l-kompitu u liema moduli (spiss java) waqfu fejn. Fl-aħħar linji, tista 'ssib żball ta' database, per eżempju, vjolazzjoni ta 'ċavetta unika tabella.

Biex twieġeb il-mistoqsija dwar x'rwol għandha l-informazzjoni dwar l-iżball ETL, ikklassifikajt il-problemi kollha li seħħew matul l-aħħar sentejn f'repożitorju pjuttost kbir.

Il-monitoraġġ tal-proċessi ETL f'maħżen tad-dejta żgħir

Żbalji tad-database jinkludu spazju mhux biżżejjed, konnessjoni mitlufa, sessjoni mdendla, eċċ.

Żbalji loġiċi jinkludu bħal ksur ta 'ċwievet tal-mejda, oġġetti mhux validi, nuqqas ta' aċċess għal oġġetti, eċċ.
L-iskeder jista 'ma jibda fil-ħin, jista' jiffriża, eċċ.

Żbalji sempliċi ma jdumux biex jirranġaw. ETL tajjeb jista 'jimmaniġġja ħafna minnhom waħdu.

Bugs kumplessi jagħmluha meħtieġa li jiġu skoperti u ttestjati proċeduri biex taħdem mad-dejta, biex jiġu esplorati sorsi tad-dejta. Ħafna drabi jwasslu għall-ħtieġa għall-ittestjar tal-bidla u l-iskjerament.

Għalhekk, nofs il-problemi kollha huma relatati mad-database. 48% tal-iżbalji kollha huma żbalji sempliċi.
Terz tal-problemi kollha huma relatati mat-tibdil tal-loġika jew il-mudell tal-ħażna, aktar minn nofs dawn l-iżbalji huma kumplessi.

U inqas minn kwart tal-problemi kollha huma relatati mal-iskedar tal-kompiti, li 18% minnhom huma żbalji sempliċi.

B'mod ġenerali, 22% tal-iżbalji kollha li jseħħu huma kumplessi, u l-korrezzjoni tagħhom teħtieġ l-aktar attenzjoni u ħin. Jiġru madwar darba fil-ġimgħa. Billi żbalji sempliċi jiġri kważi kuljum.

Ovvjament, il-monitoraġġ tal-proċessi ETL se jkun effettiv meta l-post tal-iżball ikun indikat fil-ġurnal bl-aktar mod preċiż possibbli u jkun meħtieġ il-ħin minimu biex jinstab is-sors tal-problema.

Monitoraġġ effettiv

X'ridt nara fil-proċess ta' monitoraġġ ETL?

Il-monitoraġġ tal-proċessi ETL f'maħżen tad-dejta żgħir
Ibda minn - meta beda jaħdem,
Sors - sors tad-dejta,
Saff - liema livell ta 'ħażna qed jitgħabba,
Isem tax-Xogħol ETL - proċedura ta 'upload, li tikkonsisti f'ħafna passi żgħar,
Numru tal-Pass - in-numru tal-pass li qed isir,
Ringieli Affettwati - kemm dejta diġà ġiet ipproċessata,
Tul sek - kemm tieħu,
Status - jekk kollox huwiex tajjeb jew le: OK, ŻBALL, TĦEJR, HANGS
Messaġġ - L-aħħar messaġġ ta' suċċess jew deskrizzjoni ta' żball.

Ibbażat fuq l-istatus tal-entrati, tista 'tibgħat email. ittra lil membri oħra. Jekk ma jkunx hemm żbalji, allura l-ittra mhix meħtieġa.

Għalhekk, f'każ ta' żball, il-post tal-inċident huwa indikat b'mod ċar.

Xi drabi jiġri li l-għodda ta 'monitoraġġ innifsu ma taħdimx. F'dan il-każ, huwa possibbli li ssejjaħ viżjoni (vista) direttament fid-database, li fuq il-bażi tagħha huwa mibni r-rapport.

Tabella ta 'monitoraġġ ETL

Biex timplimenta l-monitoraġġ tal-proċessi ETL, tabella waħda u veduta waħda huma biżżejjed.

Biex tagħmel dan, tista 'terġa' lura għal il-ħażna żgħira tiegħek u toħloq prototip fid-database sqlite.

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

Ara/Rapporta 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 Iċċekkja jekk huwiex possibbli li tikseb numru ġdid ta 'sessjoni

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

Karatteristiċi tal-mejda:

  • il-bidu u t-tmiem tal-proċedura tal-ipproċessar tad-dejta għandhom jiġu segwiti mill-passi ETL_START u ETL_END
  • f'każ ta' żball, għandu jinħoloq il-pass ETL_ERROR bid-deskrizzjoni tiegħu
  • l-ammont ta' data pproċessata għandu jiġi enfasizzat, pereżempju, b'asterisks
  • l-istess proċedura tista' tinbeda fl-istess ħin bil-parametru force_restart=y, mingħajrha n-numru tas-sessjoni jinħareġ biss għall-proċedura kompluta
  • fil-modalità normali, ma tistax tmexxi l-istess proċedura ta 'proċessar tad-dejta b'mod parallel

L-operazzjonijiet meħtieġa biex taħdem ma 'tabella huma kif ġej:

  • jkollna n-numru tas-sessjoni tal-proċedura ETL li qed taħdem
  • daħħal id-dħul tal-ġurnal fit-tabella
  • tikseb l-aħħar rekord b'suċċess ta' proċedura ETL

F'databases bħal Oracle jew Postgres, dawn l-operazzjonijiet jistgħu jiġu implimentati bħala funzjonijiet integrati. sqlite jeħtieġ mekkaniżmu estern, u f'dan il-każ dan prototip fil-PHP.

Output

Għalhekk, messaġġi ta 'żball fl-għodod tal-ipproċessar tad-data għandhom rwol mega-importanti. Iżda huwa diffiċli li ssejħilhom l-aħjar biex issib malajr il-kawża tal-problema. Meta n-numru ta 'proċeduri joqrob il-mija, allura l-monitoraġġ tal-proċess jinbidel fi proġett kumpless.

L-artikolu jipprovdi eżempju ta 'soluzzjoni possibbli għall-problema fil-forma ta' prototip. Il-prototip tar-repożitorju żgħir kollu huwa disponibbli f'gitlab SQLite PHP ETL Utilitajiet.

Sors: www.habr.com

Żid kumment