Paljud kasutavad spetsialiseeritud tööriistu andmete eraldamise, töötlemise ja laadimise protseduuride loomiseks relatsioonilistes andmebaasides. Tööriistade tööprotsess logitakse ja vead registreeritakse.
Veateate korral logis on teave selle kohta, et tööriist ei suutnud ĂŒlesannet tĂ€ita ning millistes moodulites (tihti on need java) kus peatuti. Viimastest ridadest vĂ”ib leida andmebaasi vea, nĂ€iteks unikaalse vĂ”tme rikkumise tabelis.
KĂŒsimusele, millist rolli mĂ€ngib ETL veateave, vastamiseks klassifitseerisin kĂ”ik probleemid, mis esinesid viimase kahe aasta jooksul mĂ€rkimisvÀÀrses andmehoidlas.

Andmebaasi vead hĂ”lmavad nĂ€iteks ruumi puudumist, ĂŒhenduse katkemist, sessiooni hangumist jne.
Loogilised vead hÔlmavad nÀiteks vÔtmete rikkumisi tabelis, kehtetuks muutunud objekte, juurdepÀÀsu puudumist objektidele jne.
Plaani tÀitmine vÔib olla ebaÔige, see vÔib hanguda jne.
Lihtsad vead ei nÔua palju aega parandamiseks. Enamik neist vead suudab hea ETL lahendada iseseisvalt.
Komplekssete vigade korral tuleb avada ja kontrollida andmete töötlemise protseduure, uurida andmeallikaid. Need toovad sageli kaasa vajaduse muudatuste testimise ja juurutamise jÀrele.
Nii on pool kÔigist probleemidest seotud andmebaasiga. 48% kÔikidest vigadest on lihtsad vead.
Kolmandik kÔigist probleemidest on seotud andmehoidla loogika vÔi mudeli muutumisega, neist rohkem kui pooled vead on keerulised.
Ja vĂ€hem kui veerand kĂ”igist probleemidest on seotud ĂŒlesannete planeerijaga, kus 18% on lihtsad vead.
KokkuvÔttes on 22% kÔigist juhtunud vigadest keerulised, nende parandamiseks on vaja suurimat tÀhelepanu ja aega. Need esinevad umbes kord nÀdalas, samas kui lihtsad vead ilmnevad peaaegu iga pÀev.
On ilmne, et ETL-protsesside jÀlgimine on tÔhus siis, kui logis on maksimaalselt tÀpselt nÀidatud vea asukoht ja probleemiallika leidmiseks kulub minimaalselt aega.
TÔhus jÀlgimine
Mida ma sooviksin nÀha ETL jÀlgimise protsessis?

Start at â millal töö algas,
Source â andmeallikas,
Layer â milline tasand andmehoidlas laaditakse,
ETL Job Name â laadimisprotseduur, mis koosneb paljusid vĂ€ikestest sammudest,
Step Number â tĂ€idetava sammu number,
MĂ”jutatud read â kui palju andmeid on juba töödeldud,
Kestus sec â kui kaua see kestab,
Oleku â kas kĂ”ik on korras vĂ”i mitte: OK, ERROR, RUNNING, HANGS
SĂ”num â viimane edukas sĂ”num vĂ”i veateade.
Failide staatuse pÔhjal on vÔimalik saata e-kiri teistele osalejatele. Kui vigu pole, siis pole ka kirja saatmine vajalik.
Nii on veateate korral selgelt nÀidatud, kus probleem esines.
MÔnikord juhtub, et monitorimisriist ise ei tööta. Sel juhul on vÔimalik otse andmebaasis kutsuda esile vaade (view), mille alusel raport on koostatud.
ETL-monitooringu tabel
ETL-protsesside jĂ€lgimiseks piisab ĂŒhest tabelist ja ĂŒhest vaatest.
Selleks vĂ”ib naasta ja luua andmebaasis sqlite prototĂŒĂŒp.
DDL tabel
CREATE TABLE UTL_JOB_STATUS (
/* Tabel töö tÀitmise logimiseks. Oluline, et tööl on etapid ETL_START ja ETL_END vÔi ETL_ERROR */
UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
SID INTEGER NOT NULL DEFAULT -1, /* Sessiooni Identifikaator. Unikaalne iga töö kÀivitamise jaoks */
LOG_DT INTEGER NOT NULL DEFAULT 0, /* KuupÀev ja kellaaeg */
LOG_D INTEGER NOT NULL DEFAULT 0, /* KuupÀev */
JOB_NAME TEXT NOT NULL DEFAULT 'N/A', /* Töö nimi nagu JOB_STG2DM_GEO */
STEP_NAME TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
STEP_DESCR TEXT, /* Ălesande vĂ”i veateate kirjeldus */
UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);DDL vaade/raport
LOO KAA KUILE KUILE UTL_JOB_STATUS_V
KUILE \* Sisu: Paketi tÀitmise logi viimase 3 kuu jooksul. \*
KOOS SRC KUIGA (
VALI LOG_D,
LOG_DT,
UTL_JOB_STATUS_ID,
SID,
JUHUL KUI INSTR(JOB_NAME, 'FTP') SIIS 'ĂLEKANNE' \* failide edastamine \*
JUHUL KUI INSTR(JOB_NAME, 'STG') SIIS 'ETAPPIK' \* etapp \*
JUHUL KUI INSTR(JOB_NAME, 'CLS') SIIS 'PUHTUS' \* puhastamine \*
JUHUL KUI INSTR(JOB_NAME, 'DIM') SIIS 'DIMENSIOON' \* dimensioon \*
JUHUL KUI INSTR(JOB_NAME, 'FCT') SIIS 'TEGUR' \* tegur \*
JUHUL KUI INSTR(JOB_NAME, 'ETL') SIIS 'ETAPPIK-MART' \* andmete turustamise etapp \*
JUHUL KUI INSTR(JOB_NAME, 'RPT') SIIS 'ARUANNE' \* aruanne \*
MUUL JUHUL 'N/A' LÔPUNAS,
JUHUL KUI INSTR(JOB_NAME, 'ACCESS') SIIS 'ACCESS LOG' \* allikas \*
JUHUL KUI INSTR(JOB_NAME, 'MASTER') SIIS 'MEISTERSISU' \* allikas \*
JUHUL KUI INSTR(JOB_NAME, 'AD-HOC') SIIS 'AD-HOC' \* allikas \*
MUUL JUHUL 'N/A' LÔPUNAS,
JOB_NAME,
STEP_NAME,
JUHUL KUI STEP_NAME='ETL_START' SIIS 1 MUUL JUHUL 0 LÔPUNAS,
JUHUL KUI STEP_NAME='ETL_END' SIIS 1 MUUL JUHUL 0 LÔPUNAS,
JUHUL KUI STEP_NAME='ETL_ERROR' SIIS 1 MUUL JUHUL 0 LÔPUNAS,
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
KUST UTL_JOB_STATUS
KUHI datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
VALI 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,
JUHUL
KUI JB.ERROR_FLAG = 1 SIIS 'ERROR'
KUI JB.ERROR_FLAG = 0 JA JB.END_FLAG = 0 JA strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 SIIS 'HANGS' \* pool tundi \*
KUI JB.ERROR_FLAG = 0 JA JB.END_FLAG = 0 SIIS 'KĂIBES'
MUUL JUHUL 'OK'
LĂPUNA 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
KUST
( VALI 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
KUST SRC
GRUPPEERI SID, SOURCE, LAYER, JOB_NAME
) JB,
( VALI UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
KUST SRC
KUHI 1 = 1
) ERR
KUHI 1 = 1
JA JB.SID = ERR.SID
JA JB.JOB_NAME = ERR.JOB_NAME
JA JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
KORRALDA JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;SQL Kontrolli, kas on vÔimalik saada uut sessiooni numbrit
VALI SUM (
JUHUL KUI start_job.JOB_NAME EI OLE NULL JA end_job.JOB_NAME ON NULL \* eksisteeriv töö lÔppes \*
JA MITTE ( 'y' = 'n' ) \* sunniviisiline taaskÀivitamine PARAMEETER \*
SIIS 1 MUUL JUHUL 0
LĂPUNA ) AS IS_RUNNING
KUST
( VALI 1 AS dummy KUST UTL_JOB_STATUS KUHI sid = -1) d_job
VASAKU VĂLJAVĂTT
( VALI JOB_NAME, SID, 1 AS dummy
KUST UTL_JOB_STATUS
KUHI JOB_NAME = 'RPT_ACCESS_LOG' \* töö nime PARAMEETER \*
JA STEP_NAME = 'ETL_START'
GRUPPEERI JOB_NAME, SID
) start_job \* algused \*
ON d_job.dummy = start_job.dummy
VASAKU VĂLJAVĂTT
( VALI JOB_NAME, SID
KUST UTL_JOB_STATUS
KUHI JOB_NAME = 'RPT_ACCESS_LOG' \* töö nime PARAMEETER \*
JA STEP_NAME in ('ETL_END', 'ETL_ERROR') \* peatamise olek \*
GRUPPEERI JOB_NAME, SID
) end_job \* lÔpeb \*
ON start_job.JOB_NAME = end_job.JOB_NAME
JA start_job.SID = end_job.SIDTabeli omadused:
- Andmete töötlemise protseduuri algus ja lÔpp peaks olema mÀrgistatud ETL_START ja ETL_END sammudega
- Viga ilmnenud korral tuleb luua samm ETL_ERROR koos selle kirjeldusega
- Töödeldud andmete arvu tuleb esile tuua, nÀiteks tÀhtedega
- Ăhe ja sama protseduuri saab samal ajal kĂ€ivitada parameetriga force_restart=y; ilma selleta antakse seanssi number ainult lĂ”petatud protseduurile
- Tavaliselt ei saa paralleelselt ĂŒhte ja sama andmete töötlemise protsessi kĂ€ivitada
Tabeliga töötamiseks vajalikud toimingud on jÀrgmised:
- ETL protseduuri kÀivitamise seanssi numbri saamine
- Logi kirje lisamine tabelisse
- ETL protseduuri viimase eduka kirje saamine
Sellistes andmebaasides nagu Oracle vÔi Postgres saab neid operatsioone rakendada sisseehitatud funktsioonide kaudu. SQLite puhul on vajalik vÀline mehhanism ja antud juhul on see .
KokkuvÔte
Seega mÀngivad andmete töötlemise tööriistades veateated ÀÀrmiselt olulist rolli. Kuid neid on keeruline nimetada optimaalseteks kiirete probleemide lahendamiseks. Kui protseduuride arv lÀheneb sajale, muutub protsesside jÀlgimine keeruliseks projektiks.
Artiklis on toodud nĂ€ide vĂ”imalikust lahendusest prototĂŒĂŒbi kaudu. Kogu vĂ€ikese ladustamise prototĂŒĂŒp on saadaval GitLabis .
Allikas: habr.com
