Monitorimi i proceseve ETL në një magazinë të vogël të të dhënave

Shumë njerëz përdorin mjete të specializuara për krijimin e procedurave për nxjerrjen, transformimin dhe ngarkimin e të dhënave në bazat e të dhënave relacionale. Procesi i punës së mjeteve regjistrohet, gabimet dokumentohen.

Në rast të gabimit, logu përmban informacion se mjeti nuk arriti të kryejë detyrën dhe cilat module (shpesh është java) ku u ndalën. Në rreshtat e fundit mund të gjeni gabimin e bazës së të dhënave, për shembull, shkeljen e çelësit unik të tabelës.

Për të përgjigjur në pyetjen se çfarë roli luan informacioni mbi gabimet ETL, unë klasifikova të gjitha problemet që ndodhen gjatë dy viteve të fundit në një depo të madhe.

Monitorimi i proceseve ETL në një magazinë të vogël të të dhënave

Gabimet e bazës së të dhënave përfshijnë ato si mungesa e hapësirës, prishja e lidhjes, varenja e sesionit etj.

Gabimet logjike përfshijnë ato si shkeljet e çelësave të tabelës, objektet jo valide, mungesa e aksesit në objekte etj.
Planifikuesi mund të fillojë vonë, mund të ngecë etj.

Gabimet e thjeshta nuk kërkojnë shumë kohë për tu korrigjuar. Një pjesë e madhe e tyre menaxhohet mirë nga ETL me cilësi.

Gabimet komplekse kërkojnë hapjen dhe verifikimin e procedurave të punës me të dhënat, hetimin e burimeve të të dhënave. Shpesh çojnë në nevojën për testimin e ndryshimeve dhe shpërndarjen.

Pra, gjysma e të gjitha problemeve lidhen me bazën e të dhënave. 48% e të gjitha gabimeve janë gabime të thjeshta.
Një e treta e të gjitha problemeve lidhen me ndryshimin e logjikës ose modelit të depozitës, më shumë se gjysma e këtyre gabimeve janë komplekse.

Dhe më pak se një çerek i të gjitha problemeve lidhen me planifikuesin e detyrave, 18% e të cilave janë gabime të thjeshta.

Në përgjithësi, 22% e të gjitha gabimeve të ndodhura janë komplekse, korrigjimi i të cilave kërkon më shumë vëmendje dhe kohë. Ato ndodhin afërsisht një herë në javë. Ndërsa gabimet e thjeshta ndodhin pothuajse çdo ditë.

ËshtĂ« e qartĂ« se monitorimi i proceseve ETL do tĂ« jetĂ« efektiv kur nĂ« logun e gabimeve tregohet sa mĂ« saktĂ« vendi i gabimit dhe kĂ«rkohet njĂ« kohĂ« minimale pĂ«r tĂ« gjetur burimin e problemit.

Monitorim efektiv

ÇfarĂ« dĂ«shiroja tĂ« shihja nĂ« procesin e monitorimit ETL?

Monitorimi i proceseve ETL në një magazinë të vogël të të dhënave
Fillimi nĂ« — kur ka filluar puna,
Burimi — burimi i tĂ« dhĂ«nave,
Niveli — cilat nivele tĂ« depozitĂ«s ngarkohen,
Emri i PunĂ«s ETL — procedura e ngarkimit, e cila pĂ«rbĂ«het nga shumĂ« hapa tĂ« vegjĂ«l,
Numri i Hapave — numri i hapit qĂ« po ekzekutohet,
Rreshtat e Prekur — sa tĂ« dhĂ«na janĂ« trajtuar deri tani,
KohĂ«zgjatja sek — sa kohĂ« zgjat procesi,
Statusi — a Ă«shtĂ« gjithçka nĂ« rregull apo jo: OK, ERROR, RUNNING, HANGS
Mesazhi — mesazhi i fundit tĂ« suksesshĂ«m ose pĂ«rshkrimi i gabimit.

Në bazë të statusit të rekordeve mund të dërgohet një email te pjesëmarrësit e tjerë. Nëse nuk ka gabime, atëherë emaili nuk është i domosdoshëm.

Kështu, në rast gabimi, vendi i incidentit është shprehur qartë.

Ndonjëherë ndodh që vetë instrumenti i monitorimit të mos funksionojë. Në këtë rast, ka mundësinë që drejtpërdrejt në bazën e të dhënave të thirrni pamjen (view) mbi të cilën është ndërtuar raporti.

Tabela e monitorimit ETL

Për të realizuar monitorimin e proceseve ETL mjafton një tabelë dhe një pamje.

Për këtë mund të ktheheni në arkivën tuaj të vogël dhe të krijoni një prototip në bazën e të dhënave sqlite.

DDL e tabelës

KRIJONI TABELË UTL_JOB_STATUS (

table për regjistrimin e logeve të ekzekutimit të punëve. E rëndësishme që puna të ketë hapat ETL_START dhe ETL_END ose ETL_ERROR *
  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  SID               INTEGER NOT NULL DEFAULT -1, /* Identifikuesi i sesionit. Unik për çdo ekzekutim të punës */
  LOG_DT            INTEGER NOT NULL DEFAULT 0,  /* Data dhe koha */
  LOG_D             INTEGER NOT NULL DEFAULT 0,  /* Data */
  JOB_NAME          TEXT NOT NULL DEFAULT 'N/A', /* Emri i punës si p.sh. JOB_STG2DM_GEO */
  STEP_NAME         TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
  STEP_DESCR        TEXT,                        /* Përshkrimi i detyrës ose mesazhi i gabimit */
  UNIKE (SID, JOB_NAME, STEP_NAME)
);
SHKRUANI NE UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VLERAT (-1);

DDL e pamjes/raportit

Krijo Pamje NËSE NUK EKZISTON UTL_JOB_STATUS_V
SI 
/* Përmbajtja: Regjistri i Ekzekutimit të Paketës për 3 Muajt e Fundit. */
ME SRC SI (
  SELEKTO LOG_D,
    LOG_DT,
    UTL_JOB_STATUS_ID,
    SID,
	RASTI KUR INSTR(JOB_NAME, 'FTP') ATËHERË 'TRANSFER' /* transferimi i skedarit */
	     KUR INSTR(JOB_NAME, 'STG') ATËHERË 'STAGE' /* skena */
	     KUR INSTR(JOB_NAME, 'CLS') ATËHERË 'CLEANING' /* pastrimi */
	     KUR INSTR(JOB_NAME, 'DIM') ATËHERË 'DIMENSION' /* dimensioni */
	     KUR INSTR(JOB_NAME, 'FCT') ATËHERË 'FACT' /* faktori */
		 KUR INSTR(JOB_NAME, 'ETL') ATËHERË 'STAGE-MART' /* tregu i tĂ« dhĂ«nave */
	     KUR INSTR(JOB_NAME, 'RPT') ATËHERË 'REPORT' /* raporti */
	     ND otherwise 'N/A' KUSHTI SI LAYER,
	Rasti KUR INSTR(JOB_NAME, 'ACCESS') ATËHERË 'ACCESS LOG' /* burimi */
	     KUR INSTR(JOB_NAME, 'MASTER') ATËHERË 'MASTER DATA' /* burimi */
	     KUR INSTR(JOB_NAME, 'AD-HOC') ATËHERË 'AD-HOC' /* burimi */
	     ND otherwise 'N/A' KUSHTI SI BURIM,
    JOB_NAME,
    STEP_NAME,
    RASTI KUR STEP_NAME='ETL_START' ATËHERË 1 ND otherwise 0 KUSHTI SI START_FLAG,
    RASTI KUR STEP_NAME='ETL_END' ATËHERË 1 ND otherwise 0 KUSHTI SI END_FLAG,
    RASTI KUR STEP_NAME='ETL_ERROR' ATËHERË 1 ND otherwise 0 KUSHTI SI 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
  NGA UTL_JOB_STATUS
  KUNDERSHTO datetime(LOG_D, 'unixepoch') >= date('tanë', 'fillimi i muajit', '-3 muaj')
)
SELEKTO JB.SID,
  JB.MIN_LOG_DT SI START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) SI LOG_DT,
  JB.SOURCE,
  JB.LAYER,
  JB.JOB_NAME,
  KUSHTI
  KUR JB.ERROR_FLAG = 1 ATËHERË 'ERROR'
  KUR JB.ERROR_FLAG = 0 DHE JB.END_FLAG = 0 DHE strftime('%s','tanĂ«') - JB.MIN_LOG_DT > 0.5*60*60 ATËHERË 'HANGS' /* gjysmĂ« ore */
  KUR JB.ERROR_FLAG = 0 DHE JB.END_FLAG = 0 ATËHERË 'RUNNING'
  ND otherwise 'OK'
  KUSHTI SI STATUS,
  ERR.STEP_LOG     SI STEP_LOG,
  JB.CNT           SI STEP_CNT,
  JB.AFFECTED_ROWS SI AFFECTED_ROWS,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) SI JOB_START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) SI JOB_END_DT,
  JB.MAX_LOG_DT - JB.MIN_LOG_DT SI JOB_DURATION_SEC
 NGA
  ( SELEKTO SID, SOURCE, LAYER, JOB_NAME,
           MAX(UTL_JOB_STATUS_ID) SI UTL_JOB_STATUS_ID,
           MAX(START_FLAG)       SI START_FLAG,
           MAX(END_FLAG)         SI END_FLAG,
           MAX(ERROR_FLAG)       SI ERROR_FLAG,
           MIN(LOG_DT)           SI MIN_LOG_DT,
           MAX(LOG_DT)           SI MAX_LOG_DT,
           SUM(1)                SI CNT,
           SUM(IFNULL(AFFECTED_ROWS, 0)) SI AFFECTED_ROWS
    NGA SRC
    GRUPI NGA SID, SOURCE, LAYER, JOB_NAME
  ) JB,
  ( SELEKTO UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
    NGA SRC
    KUNDERSHTO 1 = 1
  ) ERR
KUNDERSHTO 1 = 1
  DHE JB.SID = ERR.SID
  DHE JB.JOB_NAME = ERR.JOB_NAME
  DHE JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;

Kontrolli SQL për mundësinë e marrjes së një numri të ri seance.

SELEKTO SUM (
  KUSHTI KUR start_job.JOB_NAME IS NOT NULL DHE end_job.JOB_NAME IS NULL /* punë ekzistuese përfundoi */
	    DHE JO ( 'y' = 'n' ) /* riciklim i detyrueshëm PARAMETRI */
       ATËHERË 1 ND otherwise 0
  ) SI IS_RUNNING
  NGA
    ( SELEKTO 1 SI dummy NGA UTL_JOB_STATUS KUNDERSHTO sid = -1) d_job
  LEFT OUTER JOIN
    ( SELEKTO JOB_NAME, SID, 1 AS dummy
      NGA UTL_JOB_STATUS
      KUNDERSHTO JOB_NAME = 'RPT_ACCESS_LOG' /* emri i punës PARAMETRI */
	    DHE STEP_NAME = 'ETL_START'
      GRUPI NGA JOB_NAME, SID
    ) start_job /* fillon */
  ON d_job.dummy = start_job.dummy
  LEFT OUTER JOIN
    ( SELEKTO JOB_NAME, SID
      NGA UTL_JOB_STATUS
      KUNDERSHTO JOB_NAME = 'RPT_ACCESS_LOG'  /* emri i punës PARAMETRI */
	    DHE STEP_NAME in ('ETL_END', 'ETL_ERROR') /* statusi i ndalimit */
      GRUPI NGA JOB_NAME, SID
    ) end_job /* përfundon */
  ON start_job.JOB_NAME = end_job.JOB_NAME
     DHE start_job.SID = end_job.SID

Karakteristikat e tabelës:

  • Fillimi dhe pĂ«rfundimi i procesit tĂ« pĂ«rpunimit tĂ« tĂ« dhĂ«nave duhet tĂ« shoqĂ«rohet me hapat ETL_START dhe ETL_END
  • NĂ« rast tĂ« njĂ« gabimi, duhet tĂ« krijohet hapi ETL_ERROR me pĂ«rshkrimin e tij
  • Numri i tĂ« dhĂ«nave tĂ« pĂ«rpunuara duhet tĂ« veçohet, pĂ«r shembull me yje
  • NĂ« tĂ« njĂ«jtĂ«n kohĂ«, njĂ« procedurĂ« e njĂ«jtĂ« mund tĂ« nisĂ« me parametrin force_restart=y, pa tĂ«, numri i seancĂ«s jepet vetĂ«m pĂ«r procedurat e pĂ«rfunduara
  • NĂ« modin normal, nuk mund tĂ« nisen paralelisht njĂ« procedurĂ« e njĂ«jtĂ« pĂ«r pĂ«rpunimin e tĂ« dhĂ«nave

Operacione të nevojshme për punën me tabelën janë si më poshtë:

  • Marrja e numrit tĂ« seancĂ«s sĂ« procedurĂ«s ETL qĂ« po niset
  • Shtimi i njĂ« regjistĂ«r tĂ« logut nĂ« tabelĂ«
  • Marrja e regjistrit tĂ« fundit tĂ« suksesshĂ«m tĂ« procedurĂ«s ETL

Në baza të dhënash si Oracle apo Postgres, këto operacione mund të realizohen me funksione të integruara. Për sqlite nevojitet një mekanizëm jashtë, dhe në këtë rast ai është prototipuar në PHP.

Përfundimi

Kështu, mesazhet e gabimeve në mjetet e përpunimit të të dhënave luajnë një rol mjaft të rëndësishëm. Por optimal për kërkimin e shpejtë të arsyeve të problemit, ato janë të vështira për t'u quajtur. Kur numri i procedurave afrohet në njëqind, monitorimi i proceseve kthehet në një projekt të ndërlikuar.

Në artikull jepet një shembull i mundshëm i zgjidhjes së problemit në formën e një prototipi. Të gjithë prototipi i një depoje të vogël është në dispozicion në gitlab SQLite PHP ETL Utilities.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster