Pag-monitor sa mga proseso sa ETL sa usa ka gamay nga bodega sa datos

Daghan ang naggamit ug pinasahi nga mga himan sa paghimo og mga pamaagi sa pagkuha, pagbag-o, ug pagkarga sa datos ngadto sa relational database. Ang proseso sa pagtrabaho nga mga himan gi-log, ang mga sayup naayo.

Sa kaso sa usa ka sayup, ang log adunay kasayuran nga ang himan napakyas sa pagkompleto sa buluhaton ug kung unsang mga module (kasagaran java) mihunong kung diin. Sa katapusang mga linya, makit-an nimo ang usa ka sayup sa database, pananglitan, usa ka talaan nga talagsaon nga paglapas sa yawe.

Aron matubag ang pangutana kung unsa ang papel sa kasayuran sa sayup sa ETL, giklasipikar nako ang tanan nga mga problema nga nahitabo sa miaging duha ka tuig sa usa ka dako nga tipiganan.

Pag-monitor sa mga proseso sa ETL sa usa ka gamay nga bodega sa datos

Ang mga sayup sa database naglakip sa dili igo nga wanang, nawala nga koneksyon, gibitay ang sesyon, ug uban pa.

Ang lohikal nga mga sayup naglakip sama sa paglapas sa mga yawe sa lamesa, dili balido nga mga butang, kakulang sa pag-access sa mga butang, ug uban pa.
Ang scheduler mahimong dili magsugod sa oras, kini mahimong magyelo, ug uban pa.

Ang yano nga mga sayup dili magdugay aron ayohon. Ang usa ka maayo nga ETL makahimo sa pagdumala sa kadaghanan niini sa iyang kaugalingon.

Ang mga komplikadong bug naghimo niini nga gikinahanglan aron madiskobrehan ug masulayan ang mga pamaagi alang sa pagtrabaho uban sa datos, aron masusi ang mga tinubdan sa datos. Kasagaran mosangpot sa panginahanglan alang sa pagbag-o sa pagsulay ug pag-deploy.

Busa, katunga sa tanan nga mga problema may kalabutan sa database. 48% sa tanang sayop kay simple nga sayop.
Ang ikatulo nga bahin sa tanan nga mga problema adunay kalabutan sa pagbag-o sa lohika o modelo sa pagtipig, labaw sa katunga sa kini nga mga sayup komplikado.

Ug wala’y ikaupat nga bahin sa tanan nga mga problema adunay kalabotan sa scheduler sa buluhaton, 18% niini yano nga mga sayup.

Sa kinatibuk-an, ang 22% sa tanan nga mga sayup nga mahitabo komplikado, ug ang ilang pagtul-id nanginahanglan labi ka atensyon ug oras. Kini mahitabo mga kausa sa usa ka semana. Samtang ang mga yanong sayop mahitabo halos kada adlaw.

Dayag, ang pagmonitor sa mga proseso sa ETL mahimong epektibo kung ang lokasyon sa sayup gipakita sa log sa tukma kutob sa mahimo ug ang labing gamay nga oras gikinahanglan aron makit-an ang gigikanan sa problema.

Epektibo nga pagmonitor

Unsa ang gusto nakong makita sa proseso sa pagmonitor sa ETL?

Pag-monitor sa mga proseso sa ETL sa usa ka gamay nga bodega sa datos
Pagsugod sa - sa dihang nagsugod siya sa trabaho,
Tinubdan - tinubdan sa datos,
Layer - unsa nga lebel sa pagtipig ang gikarga,
Ngalan sa Trabaho sa ETL - pamaagi sa pag-upload, nga naglangkob sa daghang gagmay nga mga lakang,
Numero sa Lakang - ang gidaghanon sa lakang nga gihimo,
Naapektuhan nga mga Laray - pila na ka datos ang naproseso na,
Gidugayon sec - unsa kadugay kini,
Status - maayo man o dili ang tanan: OK, ERROR, RUNNING, HANGS
Mensahe - Katapusan nga malampuson nga mensahe o paghulagway sa sayup.

Base sa status sa mga entry, pwede ka magpadala ug email. sulat sa ubang miyembro. Kung walay mga sayup, nan ang sulat dili kinahanglan.

Busa, kung adunay usa ka sayup, ang lokasyon sa insidente klaro nga gipakita.

Usahay mahitabo nga ang monitoring tool mismo dili molihok. Sa kini nga kaso, posible nga tawagan ang usa ka pagtan-aw (tan-aw) nga direkta sa database, base sa kung diin gitukod ang taho.

ETL monitoring table

Aron ipatuman ang pagmonitor sa mga proseso sa ETL, igo na ang usa ka lamesa ug usa ka pagtan-aw.

Aron mahimo kini, mahimo kang mobalik sa imong gamay nga storage ug paghimo prototype sa sqlite database.

DDL nga mga lamesa

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

Tan-awa/Ireport ang 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;

Pagsusi sa SQL kung posible ba makakuha usa ka bag-ong numero sa sesyon

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

Mga bahin sa lamesa:

  • ang pagsugod ug pagtapos sa pamaagi sa pagproseso sa datos kinahanglang sundan sa mga lakang ETL_START ug ETL_END
  • sa kaso sa usa ka sayop, ang ETL_ERROR lakang uban sa iyang paghulagway kinahanglan nga gibuhat
  • ang kantidad sa giproseso nga datos kinahanglan nga ipasiugda, pananglitan, nga adunay mga asterisk
  • ang parehas nga pamaagi mahimong sugdan sa parehas nga oras gamit ang force_restart = y parameter, kung wala kini ang numero sa sesyon gihatag lamang sa nahuman nga pamaagi
  • sa normal nga mode, dili ka makadagan sa parehas nga pamaagi sa pagproseso sa datos nga managsama

Ang gikinahanglan nga mga operasyon alang sa pagtrabaho sa usa ka lamesa mao ang mosunod:

  • pagkuha sa numero sa sesyon sa nagpadagan nga pamaagi sa ETL
  • isulod ang log entry sa lamesa
  • pagkuha sa katapusang malampuson nga rekord sa usa ka pamaagi sa ETL

Sa mga database sama sa Oracle o Postgres, kini nga mga operasyon mahimong ipatuman ingon mga built-in nga function. Ang sqlite nanginahanglan usa ka eksternal nga mekanismo, ug sa kini nga kaso kini prototype sa PHP.

konklusyon

Sa ingon, ang mga mensahe sa sayup sa mga himan sa pagproseso sa datos adunay hinungdanon nga papel. Apan lisud ang pagtawag kanila nga labing maayo alang sa dali nga pagpangita sa hinungdan sa problema. Kung ang gidaghanon sa mga pamaagi hapit usa ka gatos, nan ang pag-monitor sa proseso nahimo nga usa ka komplikado nga proyekto.

Ang artikulo naghatag usa ka pananglitan sa usa ka posible nga solusyon sa problema sa porma sa usa ka prototype. Ang tibuuk nga gamay nga prototype sa repository magamit sa gitlab SQLite PHP ETL Utilities.

Source: www.habr.com

Idugang sa usa ka comment