Monitro prosesau ETL mewn warws data bach

Mae llawer yn defnyddio offer arbenigol i greu gweithdrefnau ar gyfer echdynnu, trawsnewid, a llwytho data i gronfeydd data perthynol. Mae'r broses o offer gweithio wedi'i gofnodi, mae gwallau'n cael eu trwsio.

Mewn achos o wall, mae'r log yn cynnwys gwybodaeth bod yr offeryn wedi methu Γ’ chwblhau'r dasg a pha fodiwlau (java yn aml) a stopiodd lle. Yn y llinellau olaf, gallwch ddod o hyd i wall cronfa ddata, er enghraifft, tabl torri allwedd unigryw.

I ateb y cwestiwn pa rΓ΄l y mae gwybodaeth gwall ETL yn ei chwarae, rwyf wedi dosbarthu'r holl broblemau sydd wedi digwydd dros y ddwy flynedd ddiwethaf mewn ystorfa eithaf mawr.

Monitro prosesau ETL mewn warws data bach

Mae gwallau cronfa ddata yn cynnwys dim digon o le, cysylltiad coll, sesiwn hongian, ac ati.

Mae gwallau rhesymegol yn cynnwys torri allweddi tabl, gwrthrychau nad ydynt yn ddilys, diffyg mynediad at wrthrychau, ac ati.
Efallai na fydd y trefnydd yn dechrau ar amser, efallai y bydd yn rhewi, ac ati.

Nid yw camgymeriadau syml yn cymryd llawer o amser i'w trwsio. Gall ETL da drin y rhan fwyaf ohonynt ar ei ben ei hun.

Mae bygiau cymhleth yn ei gwneud hi'n angenrheidiol i ddarganfod a phrofi gweithdrefnau ar gyfer gweithio gyda data, i ymchwilio i ffynonellau data. Yn aml yn arwain at yr angen am brofi newid a defnyddio.

Felly, mae hanner yr holl broblemau'n gysylltiedig Γ’'r gronfa ddata. Mae 48% o'r holl gamgymeriadau yn gamgymeriadau syml.
Mae traean o'r holl broblemau yn ymwneud Γ’ newid y rhesymeg storio neu fodel, mae mwy na hanner y gwallau hyn yn gymhleth.

Ac mae llai na chwarter yr holl broblemau'n gysylltiedig Γ’'r trefnydd tasgau, y mae 18% ohonynt yn wallau syml.

Yn gyffredinol, mae 22% o'r holl wallau sy'n digwydd yn gymhleth, ac mae angen y sylw a'r amser mwyaf i'w cywiro. Maent yn digwydd tua unwaith yr wythnos. Tra bod camgymeriadau syml yn digwydd bron bob dydd.

Mae'n amlwg y bydd monitro prosesau ETL yn effeithiol pan fydd lleoliad y gwall yn cael ei nodi yn y log mor gywir Γ’ phosibl a'r lleiafswm amser sydd ei angen i ddod o hyd i ffynhonnell y broblem.

Monitro effeithiol

Beth oeddwn i eisiau ei weld yn y broses monitro ETL?

Monitro prosesau ETL mewn warws data bach
Dechreuwch am - pan ddechreuodd weithio,
Ffynhonnell - ffynhonnell ddata,
Haen - pa lefel o storfa sy'n cael ei llwytho,
Enw Swydd ETL - gweithdrefn lanlwytho, sy'n cynnwys llawer o gamau bach,
Rhif y Cam - nifer y cam sy'n cael ei berfformio,
Rhesi yr effeithir arnynt - faint o ddata sydd eisoes wedi'i brosesu,
Hyd eiliad - faint o amser mae'n ei gymryd,
Statws - p'un a yw popeth yn iawn ai peidio: Iawn, GWALL, RHEDEG, HANGS
Neges - Neges lwyddiannus ddiwethaf neu ddisgrifiad gwall.

Yn seiliedig ar statws y cofnodion, gallwch anfon e-bost. llythyr at aelodau eraill. Os nad oes unrhyw wallau, yna nid oes angen y llythyr.

Felly, os bydd camgymeriad, mae lleoliad y digwyddiad wedi'i nodi'n glir.

Weithiau mae'n digwydd nad yw'r offeryn monitro ei hun yn gweithio. Yn yr achos hwn, mae'n bosibl galw golygfa (golwg) yn uniongyrchol yn y gronfa ddata, y mae'r adroddiad wedi'i adeiladu ar ei sail.

Tabl monitro ETL

Er mwyn gweithredu monitro prosesau ETL, mae un tabl ac un olygfa yn ddigon.

I wneud hyn, gallwch ddychwelyd i eich storfa fach a chreu prototeip mewn cronfa ddata sqlite.

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

Gweld/Adrodd 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 Gwirio a yw'n bosibl cael rhif sesiwn newydd

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

Nodweddion tabl:

  • rhaid dilyn dechrau a diwedd y drefn prosesu data gyda'r camau ETL_START ac ETL_END
  • rhag ofn y bydd gwall, dylid creu cam ETL_ERROR gyda'i ddisgrifiad
  • dylid amlygu swm y data wedi'i brosesu, er enghraifft, gyda seren
  • gellir cychwyn yr un drefn ar yr un pryd Γ’'r paramedr force_restart=y, hebddo mae rhif y sesiwn yn cael ei gyhoeddi i'r weithdrefn orffenedig yn unig
  • yn y modd arferol, ni allwch redeg yr un weithdrefn prosesu data yn gyfochrog

Mae'r gweithrediadau angenrheidiol ar gyfer gweithio gyda thabl fel a ganlyn:

  • cael rhif sesiwn y weithdrefn ETL sy'n rhedeg
  • mewnosod cofnod log yn y tabl
  • cael y cofnod llwyddiannus olaf o weithdrefn ETL

Mewn cronfeydd data fel Oracle neu Postgres, gellir gweithredu'r gweithrediadau hyn fel swyddogaethau adeiledig. sqlite yn gofyn am fecanwaith allanol, ac yn yr achos hwn mae'n prototeip yn PHP.

Allbwn

Felly, mae negeseuon gwall mewn offer prosesu data yn chwarae rhan mega-bwysig. Ond mae'n anodd eu galw'n optimaidd ar gyfer dod o hyd i achos y broblem yn gyflym. Pan fydd nifer y gweithdrefnau'n agosΓ‘u at gant, yna mae monitro prosesau yn troi'n brosiect cymhleth.

Mae'r erthygl yn rhoi enghraifft o ateb posibl i'r broblem ar ffurf prototeip. Mae'r prototeip ystorfa fach gyfan ar gael yn gitlab SQLite PHP ETL Cyfleustodau.

Ffynhonnell: hab.com

Ychwanegu sylw