Paljuski kasutavad spetsialiseeritud tööriistu, et luua andmete vÀljavÔtmise, transformatsiooni ja laadimise protseduure suhelistesse andmebaasidesse. Tööriistade tööprotsessi jÀlgitakse ja vead fikseeritakse.
Vea tekkimisel logis on teave selle kohta, et tööriist ei suutnud ĂŒlesannet tĂ€ita ja millised moodulid (tihti java) kus peatunud on. Viimastest ridadest vĂ”ib leida andmebaasi vea, nĂ€iteks unikaalse vĂ”ti rikkumise tabelis.
Et vastata kĂŒsimusele, millist rolli mĂ€ngib ETL veateave, olen klassifitseerinud kĂ”ik probleemid, mis on viimase kahe aasta jooksul juhtunud suures andmehoidlas.

Andmebaasi vead hĂ”lmavad selliseid nagu vĂ€hese ruumi tĂ”ttu, ĂŒhenduse katkemine, seansi peatamine jne.
Loogilised vead hÔlmavad selliseid nagu tabeli vÔtmete rikkumine, kehtetud objektid, juurdepÀÀsu puudumine objektidele jne.
Planeerija vÔib kÀivituda ebasobival ajal, vÔib peatuda jne.
Lihtsad vead ei nÔua palju aega parandamiseks. Enamik neist suudab hea ETL iseseisvalt lahendada.
Kuna keerulised vead nÔuavad andmepÀringute menetlemise protseduuride avamist ja kontrollimist, nÔuavad nad sageli muudatuste testimist ja juurutamist.
Seega on pool kÔigist probleemidest seotud andmebaasiga. 48% kÔigist vigadest on lihtsad vead.
Kolmandik kÔigist probleemidest on seotud loogika vÔi andmehoidla mudeli muutumisega, millest rohkem kui pool on keerulised vead.
Ja vĂ€hem kui veerand kĂ”igist probleemidest on seotud ĂŒlesannete planeerijaga, millest 18% on lihtsad vead.
Kokku on 22% kÔigist tÔrgetest keerulised, nende parandamine nÔuab kÔige rohkem tÀhelepanu ja aega. Need juhtuvad umbes kord nÀdalas. Samas kui lihtsaid vigu esineb peaaegu iga pÀev.
Ilmselgelt on ETL-protsesside jÀlgimine tÔhus siis, kui vealogis on vÔimalikult tÀpselt mÀrgitud vea koht ja probleemide allika leidmiseks on minimaalne aeg vajalik.
TÔhus jÀlgimine
Mida sooviksin nÀha ETL jÀlgimise protsessis?

Start at â millal töö algas,
Source â andmeallikas,
Layer â milline andmehoidla tase laaditakse,
ETL Job Name â laadimisprotseduur, mis koosneb paljusid vĂ€ikeseid samme,
Step Number â teostatava sammu number,
Affected Rows â kui palju andmeid on juba töödeldud,
Duration sec â kui kaua see kestab,
Status â kas kĂ”ik on hĂ€sti vĂ”i mitte: OK, ERROR, RUNNING, HANGS
Message â viimane edukas sĂ”num vĂ”i veakirjeldus.
Salvestatud kirjade staatuse pÔhjal saab saata e-kirja teistele osalistele. Kui vigu pole, siis ei ole kirja saatmine vajalik.
Seega on vigade korral selgelt mÀrgitud juhtumikoht.
MÔnikord juhtub, et jÀlgimise tööriist ise ei tööta. Sellisel juhul on vÔimalik otse andmebaasis kutsuda esitus (view), mille alusel aruanne on koostat.
ETL jÀlgimise tabel
ETL-protsesside jĂ€lgimiseks piisab ĂŒhest tabelist ja ĂŒhest esitusest.
Selle jaoks saab naasta ja luua andmebaasis sqlite prototĂŒĂŒp.
DDL tabel
CREATE TABLE UTL_JOB_STATUS (
/* Tabel tĂ¶Ă¶ĂŒlesannete tĂ€itmise logimise jaoks. Oluline on, et tööl on sammud 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, /* Seansi identifikaator. Ainulaadne 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 esitus/aruanne
Loo vaade, kui UTL_JOB_STATUS_V ei eksisteeri
AS /* Sisu: Paketi tÀitmise logi viimase 3 kuu kohta. */
WITH SRC AS (
SELECT LOG_D,
LOG_DT,
UTL_JOB_STATUS_ID,
SID,
CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'ĂLEKANNE' /* failiedastus */
WHEN INSTR(JOB_NAME, 'STG') THEN 'ETAPPI' /* etapp */
WHEN INSTR(JOB_NAME, 'CLS') THEN 'PUHASTAMINE' /* puhastamine */
WHEN INSTR(JOB_NAME, 'DIM') THEN 'MĂĂTMINE' /* mÔÔtmine */
WHEN INSTR(JOB_NAME, 'FCT') THEN 'FAKT' /* fakt */
WHEN INSTR(JOB_NAME, 'ETL') THEN 'ETAPPI-RANDI' /* andmete rand */
WHEN INSTR(JOB_NAME, 'RPT') THEN 'ARUANNE' /* aruanne */
ELSE 'N/A' END AS KIHT,
CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'JĂUDSUS LOGI' /* allikas */
WHEN INSTR(JOB_NAME, 'MASTER') THEN 'PEAMEETODI ANDMED' /* allikas */
WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* allikas */
ELSE 'N/A' END AS ALLIKAS,
JOB_NAME,
STEP_NAME,
CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS ALGUS_FLAG,
CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS LĂPP_FLAG,
CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS VIGA_FLAG,
STEP_NAME || ' : ' || STEP_DESCR AS ETAPI_LOG,
SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS KĂSITLETUD_RRID
FROM UTL_JOB_STATUS
WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
JB.MIN_LOG_DT AS ALGUS_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
JB.ALLIKAS,
JB.KIHT,
JB.JOB_NAME,
CASE
WHEN JB.VIGA_FLAG = 1 THEN 'VIGA'
WHEN JB.VIGA_FLAG = 0 AND JB.LĂPP_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'PEATUNUD' /* pool tundi */
WHEN JB.VIGA_FLAG = 0 AND JB.LĂPP_FLAG = 0 THEN 'KĂIVITAMINE'
ELSE 'HEA'
END AS STAATUS,
ERR.ETAPI_LOG AS ETAPI_LOG,
JB.CNT AS ETAPI_CNT,
JB.KĂSITLETUD_RRID AS KĂSITLETUD_RRID,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS TĂĂPROTSESSI_ALGUS_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS TĂĂPROTSESSI_LĂPP_DT,
JB.MAX_LOG_DT - JB.MIN_LOG_DT AS TĂĂPROTSESSI_AEG_SEC
FROM
( SELECT SID, ALLIKAS, KIHT, JOB_NAME,
MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
MAX(ALGUS_FLAG) AS ALGUS_FLAG,
MAX(LĂPP_FLAG) AS LĂPP_FLAG,
MAX(VIGA_FLAG) AS VIGA_FLAG,
MIN(LOG_DT) AS MIN_LOG_DT,
MAX(LOG_DT) AS MAX_LOG_DT,
SUM(1) AS CNT,
SUM(IFNULL(KĂSITLETUD_RRID, 0)) AS KĂSITLETUD_RRID
FROM SRC
GROUP BY SID, ALLIKAS, KIHT, JOB_NAME
) JB,
( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, ETAPI_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.ALLIKAS;SQL Kontroll uue sessiooni numbri saamise vĂ”imaluse ĂŒle
SELECT SUM (
CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* eksisteerinud töö lÔppenud */
AND NOT ( 'y' = 'n' ) /* jÔudude taaskÀivitamise 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' /* töö nime PARAMETER */
AND STEP_NAME = 'ETL_START'
GROUP BY JOB_NAME, SID
) start_job /* algused */
ON d_job.dummy = start_job.dummy
LEFT OUTER JOIN
( SELECT JOB_NAME, SID
FROM UTL_JOB_STATUS
WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* töö nime PARAMETER */
AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* peatada olek */
GROUP BY JOB_NAME, SID
) end_job /* lÔpurajad */
ON start_job.JOB_NAME = end_job.JOB_NAME
AND start_job.SID = end_job.SIDTabeli eripÀrad:
- andmete töötlemise protsessi algus ja lÔpp peaks olema ETL_START ja ETL_END etappidena
- vea korral peaks olema ETL_ERROR etapp koos selle kirjeldusega
- töödeldud andmete arvu peaks eraldama, nÀiteks tÀhekestega
- samal ajal vÔib sama protseduuri kÀivitada parameetriga force_restart=y; ilma selleta antakse sessiooni number ainult lÔpetatud protseduurile
- tavalistes tingimustes ei saa sama andmete töötlemise protseduuri kÀivitada paralleelselt
Tabeliga töötamisel vajalikud toimingud on jÀrgmised:
- ETL protsessi kÀivitusseansi numbri saamine
- logi kirje lisamine tabelisse
- viimase eduka ETL protsessi kirje saamine
Sellistes andmebaasides nagu Oracle vÔi Postgres on neid toiminguid vÔimalik teostada sisseehitatud funktsioonide kaudu. SQLite puhul on vajalik vÀline mehhanism ja sel juhul on see .
KokkuvÔte
Seega mĂ€ngivad vigade teated andmete töötlemise tööriistades ĂŒliolulist rolli. Kuid nende kiire leidmine probleemide pĂ”hjuse osas on keeruline. Kui protsesside arv lĂ€heneb sajale, muutub protsesside jĂ€lgimine keeruliseks projektiks.
Artiklis on toodud nĂ€ide probleemide lahendamisest prototĂŒĂŒbi vormis. Kogu vĂ€ikese ladustamise prototĂŒĂŒp on saadaval gitlabis .
Allikas: habr.com
