MÄnga anvÀnder specialiserade verktyg för att skapa processer för extrahering, transformation och laddning av data i relationsdatabaser. Arbetsprocessen för verktygen loggas och fel registreras.
I hÀndelse av ett fel innehÄller loggen information om att verktyget misslyckades med att utföra uppgiften och vilka moduler (ofta Java) som stannade. I de sista raderna kan du hitta databaserelaterade fel, till exempel, övertrÀdelse av den unika nyckeln i tabellen.
För att besvara frÄgan om vilken roll information om ETL-fel spelar, klassificerade jag alla problem som intrÀffade under de senaste tvÄ Ären i ett stort datalager.

Databasfel inkluderar sÄdana som otillrÀckligt utrymme, avbrutet anslutning, hÀngande sessioner, etc.
Logiska fel inkluderar sÄdana som nyckelövertrÀdelse i tabeller, ogiltiga objekt, brist pÄ Ätkomst till objekt, etc.
SchemalÀggaren kan startas vid fel tillfÀlle, kan hÀnga sig, etc.
Enkla fel krÀver inte mycket tid för att ÄtgÀrda. De flesta av dem kan en bra ETL hantera pÄ egen hand.
Komplexa fel krÀver att man öppnar och kontrollerar procedurer för databehandling, undersöker datakÀllor. De leder ofta till tester av Àndringar och installation.
SÄledes Àr hÀlften av alla problem relaterade till databasen. 48% av alla fel Àr enkla fel.
En tredjedel av alla problem Àr relaterade till Àndringar av logik eller lagermodell, mer Àn hÀlften av dessa fel Àr komplexa.
Och mindre Àn en fjÀrdedel av alla problem Àr relaterade till schemalÀggaren, dÀr 18% Àr enkla fel.
Ăvergripande utgör 22% av de intrĂ€ffade felen komplexa fel, vars Ă„tgĂ€rd krĂ€ver mest uppmĂ€rksamhet och tid. De intrĂ€ffar cirka en gĂ„ng i veckan, medan enkla fel intrĂ€ffar nĂ€stan varje dag.
Det Àr uppenbart att övervakningen av ETL-processerna kommer att vara effektiv nÀr loggen sÄ exakt som möjligt anger felplatsen och minimal tid krÀvs för att hitta problemkÀllan.
Effektiv övervakning
Vad skulle jag vilja se i övervakningen av ETL?

Starta vid â nĂ€r arbetet började,
KĂ€lla â datakĂ€lla,
Lager â vilket nivĂ„ av lagret som laddas,
ETL Job Name â laddningsproceduren som bestĂ„r av mĂ„nga smĂ„ steg,
Stegnummer â nummer pĂ„ det aktuella steget,
PĂ„verkade rader â hur mycket data som redan har bearbetats,
Varaktighet sek â hur lĂ€nge det tar att utföra,
Status â om allt Ă€r bra eller inte: OK, ERROR, RUNNING, HANGS
Meddelande â den senaste framgĂ„ngsrika meddelandet eller beskrivningen av felet.
Baserat pÄ statusen av poster kan ett e-postmeddelande skickas till andra deltagare. Om det inte finns nÄgra fel Àr inte e-postmeddelandet nödvÀndigt.
SÄledes, i hÀndelse av ett fel, anges tydligt platsen för hÀndelsen.
Ibland hÀnder det att sjÀlva övervakningsverktyget inte fungerar. I sÄdana fall finns det möjlighet att direkt i databasen anropa en vy, baserat pÄ vilken rapporten har byggts.
ETL övervakningstabell
För att genomföra övervakning av ETL-processer krÀvs endast en tabell och en vy.
För detta kan man ÄtervÀnda till och skapa en prototyp i databasen sqlite.
DDL-tabell
CREATE TABLE UTL_JOB_STATUS (
/* Tabell för loggning av jobbets körlogg. Viktigt att jobbet har stegen ETL_START och ETL_END eller ETL_ERROR */
UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
SID INTEGER NOT NULL DEFAULT -1, /* Sessionsidentifierare. Unik för varje körning av jobbet */
LOG_DT INTEGER NOT NULL DEFAULT 0, /* Datum och tid */
LOG_D INTEGER NOT NULL DEFAULT 0, /* Datum */
JOB_NAME TEXT NOT NULL DEFAULT 'N/A', /* Jobbnames som JOB_STG2DM_GEO */
STEP_NAME TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ..., ETL_END/ETL_ERROR */
STEP_DESCR TEXT, /* Beskrivning av uppgift eller felmeddelande */
UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);DDL vy/rapport
SKAPA VISNING OM DEN INTE FINNS UTL_JOB_STATUS_V
AS /* InnehÄll: Paketexekveringslogg för de senaste 3 mÄnaderna. */
MED SRC SOM (
VĂLJ LOG_D,
LOG_DT,
UTL_JOB_STATUS_ID,
SID,
FALL NĂR INSTR(JOB_NAME, 'FTP') DĂ
'ĂVERFĂRING' /* filöverföring */
NĂR INSTR(JOB_NAME, 'STG') DĂ
'STEG' /* steg */
NĂR INSTR(JOB_NAME, 'CLS') DĂ
'RENSE' /* rengöring */
NĂR INSTR(JOB_NAME, 'DIM') DĂ
'DIMENSION' /* dimension */
NĂR INSTR(JOB_NAME, 'FCT') DĂ
'FAKT' /* fakta */
NĂR INSTR(JOB_NAME, 'ETL') DĂ
'STEG-MART' /* datamart */
NĂR INSTR(JOB_NAME, 'RPT') DĂ
'RAPPORT' /* rapport */
ANNARS 'N/A' SLUT SOM LAGER,
FALL NĂR INSTR(JOB_NAME, 'ACCESS') DĂ
'Ă
TKOMSTLOGG' /* kÀlla */
NĂR INSTR(JOB_NAME, 'MASTER') DĂ
'MASTERDATA' /* kÀlla */
NĂR INSTR(JOB_NAME, 'AD-HOC') DĂ
'AD-HOC' /* kÀlla */
ANNARS 'N/A' SLUT SOM KĂLLA,
JOB_NAME,
STEP_NAME,
FALL NĂR STEP_NAME='ETL_START' DĂ
1 ANNARS 0 SLUT SOM START_FLAG,
FALL NĂR STEP_NAME='ETL_END' DĂ
1 ANNARS 0 SLUT SOM SLUT_FLAG,
FALL NĂR STEP_NAME='ETL_ERROR' DĂ
1 ANNARS 0 SLUT SOM FEL_FLAG,
STEP_NAME || ' : ' || STEP_DESCR SOM STEG_LOG,
SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) SOM PĂ
VERKADE_RADER
FRĂ
N UTL_JOB_STATUS
DĂR datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
VĂLJ JB.SID,
JB.MIN_LOG_DT SOM START_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) SOM LOG_DT,
JB.KĂLLA,
JB.LAGER,
JB.JOB_NAME,
FALL
NĂR JB.FEL_FLAG = 1 DĂ
'FEL'
NĂR JB.FEL_FLAG = 0 OCH JB.SLUT_FLAG = 0 OCH strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 DĂ
'HĂNGER' /* en halv timme */
NĂR JB.FEL_FLAG = 0 OCH JB.SLUT_FLAG = 0 DĂ
'KĂR'
ANNARS 'OK'
SLUT SOM STATUS,
ERR.STEP_LOG SOM STEG_LOG,
JB.CNT SOM STEG_CNT,
JB.PĂ
VERKADE_RADER SOM PĂ
VERKADE_RADER,
strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) SOM JOB_START_DT,
strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) SOM JOB_END_DT,
JB.MAX_LOG_DT - JB.MIN_LOG_DT SOM JOB_DURATION_SEC
FRĂ
N
( VĂLJ SID, KĂLLA, LAGER, JOB_NAME,
MAX(UTL_JOB_STATUS_ID) SOM UTL_JOB_STATUS_ID,
MAX(START_FLAG) SOM START_FLAG,
MAX(END_FLAG) SOM SLUT_FLAG,
MAX(FEL_FLAG) SOM FEL_FLAG,
MIN(LOG_DT) SOM MIN_LOG_DT,
MAX(LOG_DT) SOM MAX_LOG_DT,
SUM(1) SOM CNT,
SUM(IFNULL(PĂ
VERKADE_RADER, 0)) SOM PĂ
VERKADE_RADER
FRĂ
N SRC
GRUPPERA EFTER SID, KĂLLA, LAGER, JOB_NAME
) JB,
( VĂLJ UTL_JOB_STATUS_ID, SID, JOB_NAME, STEG_LOG
FRĂ
N SRC
DĂR 1 = 1
) ERR
DĂR 1 = 1
OCH JB.SID = ERR.SID
OCH JB.JOB_NAME = ERR.JOB_NAME
OCH JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDNA EFTER JB.MIN_LOG_DT DESC, JB.SID DESC, JB.KĂLLA;SQL Kontroll av möjligheten att fĂ„ ett nytt sessionsnummer
VĂLJ SUM (
FALL NĂR start_job.JOB_NAME ĂR INTE NULL OCH end_job.JOB_NAME ĂR NULL /* existerande jobb avslutat */
OCH INTE ( 'y' = 'n' ) /* tvinga omstart PARAMETER */
DĂ
1 ANNARS 0
SLUT ) SOM IS_RUNNING
FRĂ
N
( VĂLJ 1 SOM dummy FRĂ
N UTL_JOB_STATUS DĂR sid = -1) d_job
VĂNSTER YTTERJOIN
( VĂLJ JOB_NAME, SID, 1 SOM dummy
FRĂ
N UTL_JOB_STATUS
DĂR JOB_NAME = 'RPT_ACCESS_LOG' /* jobbnamn PARAMETER */
OCH STEP_NAME = 'ETL_START'
GRUPPERA EFTER JOB_NAME, SID
) start_job /* startar */
PĂ
d_job.dummy = start_job.dummy
VĂNSTER YTTERJOIN
( VĂLJ JOB_NAME, SID
FRĂ
N UTL_JOB_STATUS
DĂR JOB_NAME = 'RPT_ACCESS_LOG' /* jobbnamn PARAMETER */
OCH STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stoppstatus */
GRUPPERA EFTER JOB_NAME, SID
) end_job /* avslutar */
PĂ
start_job.JOB_NAME = end_job.JOB_NAME
OCH start_job.SID = end_job.SIDEgenskaper hos tabellen:
- Början och slutet av databehandlingsproceduren mÄste Ätföljas av stegen ETL_START och ETL_END
- Vid ett fel ska ett steg ETL_ERROR skapas med dess beskrivning
- Antalet behandlade data bör sÀrmarkeras, till exempel med stjÀrnor
- Samtidigt kan samma procedur startas med parametern force_restart=y; utan den ges sessionsnumret endast till den avslutade proceduren
- I normallÀge kan samma databehandlingsprocedur inte köras parallellt
NödvÀndiga operationer för arbetet med tabellen Àr följande:
- HÀmta sessionsnumret för den startade proceduren ETL
- Infoga en loggpost i tabellen
- HÀmta den senaste lyckade posten frÄn proceduren ETL
I databaser som till exempel Oracle eller Postgres kan dessa operationer realiseras med inbyggda funktioner. För sqlite krÀvs en extern mekanism och i detta fall Àr den .
Utdata
SÄledes spelar felmeddelanden i databehandlingsverktyg en mega-viktig roll. Men de kan knappast kallas optimala för snabb felsökning av problem. NÀr antalet procedurer nÀrmar sig hundra blir övervakning av processer ett komplext projekt.
I artikeln ges ett exempel pÄ en möjlig lösning pÄ problemet i form av en prototyp. Hela prototypen av det lilla lagret finns tillgÀnglig pÄ gitlab .
KĂ€lla: habr.com
