Eftirlit með ETL ferlum í litlu gagnageymsluhúsi

Margir nota sérhæfð verkfæri til að búa til verklagsreglur til að draga út, umbreyta og hlaða gögnum í venslagagnagrunna. Ferlið við vinnutæki er skráð, villur eru lagaðar.

Ef um villu er að ræða, inniheldur skráningin upplýsingar um að tólið hafi ekki klárað verkefnið og hvaða einingar (oft java) stöðvuðu hvar. Í síðustu línum er hægt að finna villu í gagnagrunni, til dæmis brot á einkvæmum lykli í töflu.

Til að svara spurningunni um hvaða hlutverki ETL villuupplýsingar gegna hef ég flokkað öll vandamálin sem hafa komið upp undanfarin tvö ár í frekar stórri geymslu.

Eftirlit með ETL ferlum í litlu gagnageymsluhúsi

Gagnagrunnsvillur innihalda ekki nóg pláss, tengingarleysi, fundur hengdur o.s.frv.

Rökfræðilegar villur eru eins og brot á töflulykla, ógildir hlutir, skortur á aðgangi að hlutum o.s.frv.
Tímaáætlunin byrjar kannski ekki á réttum tíma, hann gæti frjósið o.s.frv.

Einföld mistök taka ekki langan tíma að laga. Góður ETL ræður við flestar þeirra á eigin spýtur.

Flóknar villur gera það að verkum að nauðsynlegt er að uppgötva og prófa verklag við að vinna með gögn, til að kanna gagnagjafa. Oft leiða til þess að þörf sé á breytingaprófun og uppsetningu.

Þannig að helmingur allra vandamála tengist gagnagrunninum. 48% allra mistaka eru einföld mistök.
Þriðjungur allra vandamála tengist því að breyta geymslulogic eða líkani, meira en helmingur þessara villna er flókinn.

Og minna en fjórðungur allra vandamála tengist verkefnaáætluninni, 18% þeirra eru einfaldar villur.

Almennt séð eru 22% allra villna sem verða flóknar og leiðrétting þeirra krefst mestrar athygli og tíma. Þeir gerast um það bil einu sinni í viku. En einföld mistök gerast næstum á hverjum degi.

Augljóslega mun eftirlit með ETL ferlum vera áhrifaríkt þegar villustaðsetningin er tilgreind í skránni eins nákvæmlega og mögulegt er og lágmarkstími þarf til að finna upptök vandans.

Skilvirkt eftirlit

Hvað vildi ég sjá í ETL eftirlitsferlinu?

Eftirlit með ETL ferlum í litlu gagnageymsluhúsi
Byrjaðu á - þegar hann hóf störf,
Uppruni - gagnagjafi,
Lag - hvaða geymslustig er verið að hlaða,
ETL starfsheiti - upphleðsluaðferð, sem samanstendur af mörgum litlum skrefum,
Skrefnúmer - númer skrefsins sem verið er að framkvæma,
Línur sem hafa áhrif - hversu mikið af gögnum hefur þegar verið unnið,
Lengd sek - hversu langan tíma það tekur,
Staða - hvort sem allt er í lagi eða ekki: OK, VILLA, RUNNING, HANGS
Skilaboð - Síðast heppnuð skilaboð eða villulýsing.

Byggt á stöðu gagna geturðu sent tölvupóst. bréf til annarra félagsmanna. Ef það eru engar villur, þá er bréfið ekki nauðsynlegt.

Þannig að ef um mistök er að ræða er staðsetning atviksins greinilega tilgreind.

Stundum gerist það að eftirlitstækið sjálft virkar ekki. Í þessu tilviki er hægt að kalla fram útsýni (view) beint í gagnagrunninn sem skýrslan er byggð á.

ETL vöktunartafla

Til að innleiða eftirlit með ETL ferlum dugar ein tafla og eitt útsýni.

Til að gera þetta geturðu farið aftur í litla geymslan þín og búðu til frumgerð í sqlite gagnagrunni.

DDL töflur

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

Skoða/Tilkynna 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 Athugar hvort hægt sé að fá nýtt lotunúmer

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

Eiginleikar borðs:

  • byrjun og lok gagnavinnsluferlisins verður að fylgja með skrefunum ETL_START og ETL_END
  • ef um villu er að ræða ætti að búa til ETL_ERROR skrefið með lýsingu þess
  • magn unninna gagna ætti að vera auðkennt, til dæmis með stjörnum
  • sömu aðferð er hægt að hefja á sama tíma með force_restart=y færibreytunni, án hennar er setunúmerið aðeins gefið út fyrir lokið ferli
  • í venjulegum ham geturðu ekki keyrt sama gagnavinnsluferlið samhliða

Nauðsynlegar aðgerðir til að vinna með töflu eru sem hér segir:

  • að fá setunúmer hlaupandi ETL málsmeðferðar
  • settu inn færsluskrá inn í töfluna
  • að fá síðasta árangursríka skráningu ETL málsmeðferðar

Í gagnagrunnum eins og Oracle eða Postgres er hægt að útfæra þessar aðgerðir sem innbyggðar aðgerðir. sqlite krefst ytri vélbúnaðar, og í þessu tilfelli það frumgerð í PHP.

Output

Þannig gegna villuboð í gagnavinnsluverkfærum mega mikilvægu hlutverki. En það er erfitt að kalla þá ákjósanlegasta til að finna fljótt orsök vandans. Þegar fjöldi aðgerða nálgast hundrað, þá breytist ferlivöktun í flókið verkefni.

Greinin gefur dæmi um mögulega lausn á vandamálinu í formi frumgerðar. Öll frumgerð litla geymslunnar er fáanleg í gitlab SQLite PHP ETL tól.

Heimild: www.habr.com

Bæta við athugasemd