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.

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?

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ë 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.SIDKarakteristikat 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 .
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 .
Burimi: habr.com
