Monatóireacht a dhéanamh ar phróisis ETL i stóras sonraí beag

Úsáideann go leor daoine uirlisí speisialaithe chun gnáthaimh a chruthú chun sonraí a bhaint, a athrú agus a luchtú isteach i mbunachair shonraí choibhneasta. Tá próiseas na n-uirlisí logáilte, taifeadtar earráidí.

I gcás earráide, tá faisnéis sa loga gur theip ar an uirlis an tasc a chur i gcrích agus cé na modúil (Java go minic) a stopann áit. Féadfaidh earráid bhunachar sonraí a bheith sna línte deiridh, mar shárú ar eochair uathúil an tábla.

Chun an cheist a fhreagairt maidir le cén ról atá ag faisnéis earráide ETL, rangaigh mé na fadhbanna go léir a tharla le dhá bhliain anuas i stór sách mór.

Monatóireacht a dhéanamh ar phróisis ETL i stóras sonraí beag

Áirítear le hearráidí bunachar sonraí mar: ní raibh go leor spáis ann, cailleadh an nasc, crochadh an seisiún, etc.

Áirítear le hearráidí loighciúla sáruithe ar eochracha tábla, rudaí neamhbhailí, easpa rochtana ar rudaí, etc.
Ní féidir an sceidealóir a sheoladh in am, féadfar é a reo, etc.

Ní thógann sé mórán ama le botúin shimplí a cheartú. Is féidir le ETL maith an chuid is mó díobh a láimhseáil leis féin.

De bharr earráidí casta is gá nósanna imeachta láimhseála sonraí a oscailt agus a sheiceáil agus foinsí sonraí a imscrúdú. Is minic mar thoradh ar an ngá atá le hathruithe a thástáil agus imscaradh.

Mar sin, baineann leath de na fadhbanna leis an mbunachar sonraí. Is earráidí simplí iad 48% de na hearráidí go léir.
Baineann trian de na fadhbanna go léir le hathruithe sa loighic nó sa tsamhail stórála; tá níos mó ná leath de na hearráidí seo casta.

Agus baineann níos lú ná an ceathrú cuid de na fadhbanna go léir leis an sceidealóir tasc, agus is earráidí simplí iad 18% díobh.

Ar an iomlán, tá 22% de na hearráidí go léir a tharlaíonn casta agus is gá an aird agus an t-am is mó lena gceartú. Tarlaíonn siad thart ar uair sa tseachtain. Cé go dtarlaíonn botúin shimplí beagnach gach lá.

Ar ndóigh, beidh monatóireacht ar phróisis ETL éifeachtach nuair a chuirtear suíomh na hearráide in iúl sa loga chomh cruinn agus is féidir agus nuair a bhíonn an t-am is lú ag teastáil chun foinse na faidhbe a aimsiú.

Monatóireacht éifeachtach

Cad a theastaigh uaim a fheiceáil sa phróiseas monatóireachta ETL?

Monatóireacht a dhéanamh ar phróisis ETL i stóras sonraí beag
Tosaigh ag - nuair a thosaigh mé ag obair,
Foinse - foinse sonraí,
Ciseal - cén leibhéal stórála atá luchtaithe,
Is nós imeachta luchtaithe é Ainm Poist ETL atá comhdhéanta de go leor céimeanna beaga,
Uimhir Chéim - uimhir na céime atá á déanamh,
Sraitheanna a bhfuil tionchar orthu - cé mhéad sonraí atá próiseáilte cheana féin,
Soic ré - cé chomh fada a thógann sé é a fhorghníomhú,
Stádas - cibé an bhfuil gach rud go maith nó nach bhfuil: ceart go leor, EARRÁID, RIALTAIS, HANGS
Teachtaireacht - an teachtaireacht rathúil dheireanach nó cur síos earráide.

Bunaithe ar stádas na dtaifead, is féidir leat ríomhphost a sheoladh. litir chuig rannpháirtithe eile. Mura bhfuil aon earráidí ann, ní gá litir a sheoladh.

Ar an mbealach seo, i gcás earráide, léirítear go soiléir suíomh an teagmhais.

Uaireanta tarlaíonn sé nach n-oibríonn an uirlis monatóireachta féin. Sa chás seo, is féidir an dearcadh (amharc) a ghlaoch go díreach sa bhunachar sonraí, ar a bhfuil an tuarascáil tógtha.

Tábla monatóireachta ETL

Chun monatóireacht a dhéanamh ar phróisis ETL, is leor tábla amháin agus radharc amháin.

Chun seo a dhéanamh is féidir leat filleadh ar do stór beag féin agus cruthaigh fréamhshamhail i mbunachar sonraí sqlite.

Táblaí 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);

Féach/tuairisc 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 Seiceáil an cumas uimhir seisiúin nua a fháil

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

Gnéithe Tábla:

  • caithfidh na céimeanna ETL_START agus ETL_END a bheith in éineacht le tús agus deireadh an nós imeachta próiseála sonraí
  • i gcás earráide, ba cheart céim ETL_ERROR a chruthú lena cur síos
  • ba cheart méid na sonraí próiseáilte a aibhsiú, mar shampla, le réiltíní
  • is féidir an nós imeachta céanna a thosú ag an am céanna leis an bparaiméadar force_restart=y; gan é, eisítear uimhir an tseisiúin don nós imeachta críochnaithe amháin
  • i ngnáthmhód tá sé dodhéanta an nós imeachta próiseála sonraí céanna a reáchtáil go comhthreomhar

Is iad seo a leanas na hoibríochtaí is gá chun oibriú leis an tábla:

  • ag fáil uimhir seisiúin an nós imeachta ETL atá á sheoladh
  • iontráil logáil isteach i dtábla
  • an taifead deireanach rathúil de nós imeachta ETL a fháil

I mbunachair shonraí mar Oracle nó Postgres, is féidir na hoibríochtaí seo a chur i bhfeidhm le feidhmeanna ionsuite. Éilíonn sqlite meicníocht sheachtrach agus sa chás seo é fréamhshamhail i PHP.

Aschur

Mar sin, tá ról mórthábhachtach ag tuairisciú earráidí in uirlisí próiseála sonraí. Ach is ar éigean gur féidir iad a ghairm mar an rogha is fearr chun cúis na faidhbe a aimsiú go tapa. Nuair a thagann líon na nósanna imeachta i dtreo céad, is tionscadal casta é monatóireacht próisis.

Soláthraíonn an t-alt sampla de réiteach féideartha ar an bhfadhb i bhfoirm fhréamhshamhail. Tá fréamhshamhail iomlán an stór beag ar fáil i gitlab SQLite PHP ETL Fóntais.

Foinse: will.com

Add a comment