Vill benotze spezialiséiert Tools fir Prozeduren ze kreéieren fir Daten an relational Datenbanken ze extrahieren, ze transforméieren an ze lueden. De Prozess vun Aarbechtsinstrumenter gëtt protokolléiert, Feeler ginn fixéiert.
Am Fall vun engem Feeler enthält de Logbuch Informatiounen datt d'Tool net fäerdeg war d'Aufgab ze kompletéieren a wéi eng Moduler (dacks Java) gestoppt hunn wou. An de leschten Zeilen, kënnt Dir eng Datebank Feeler fannen, Zum Beispill, engem Dësch eenzegaarteg Schlëssel Violatioun.
Fir d'Fro ze beäntweren, wéi eng Roll ETL Feelerinformatioun spillt, hunn ech all d'Problemer, déi an de leschten zwee Joer opgetrueden sinn, an engem zimlech grousse Repository klasséiert.
Datebank Feeler enthalen net genuch Plaz, verluer Verbindung, Sessioun hänkt, etc.
Logesch Feeler enthalen wéi Verstouss géint Tabelleschlësselen, net valabel Objeten, Mangel un Zougang zu Objeten, asw.
De Scheduler kann net op Zäit ufänken, et kann afréieren, etc.
Einfach Feeler huelen net laang fir ze fixéieren. Eng gutt ETL kann déi meescht vun hinnen eleng handhaben.
Komplex Bugs maachen et néideg Prozeduren ze entdecken an ze testen fir mat Daten ze schaffen, Datenquellen z'entdecken. Féieren dacks zu der Bedierfnes fir Ännerungstesten an Deployment.
Also, d'Halschent vun alle Probleemer si mat der Datebank verbonnen. 48% vun alle Feeler sinn einfach Feeler.
En Drëttel vun alle Probleemer sinn am Zesummenhang mat der Ännerung vun der Späicherlogik oder Modell, méi wéi d'Halschent vun dëse Feeler si komplex.
A manner wéi e Véierel vun alle Probleemer si mam Taskplaner am Zesummenhang, 18% vun deenen einfache Feeler sinn.
Am Allgemengen sinn 22% vun alle Feeler, déi optrieden, komplex, an hir Korrektur erfuerdert déi meescht Opmierksamkeet an Zäit. Si geschéien ongeféier eemol d'Woch. Woubäi einfach Feeler bal all Dag geschéien.
Et ass offensichtlech datt d'Iwwerwaachung vun ETL Prozesser effektiv wäert sinn wann d'Location vum Feeler am Logbuch sou genau wéi méiglech uginn ass an d'Mindestzäit erfuerderlech ass fir d'Quell vum Problem ze fannen.
Effektiv Iwwerwaachung
Wat wollt ech am ETL Iwwerwaachungsprozess gesinn?
Start bei - wann hien ugefaang ze schaffen,
Quell - Daten Quell,
Layer - wéi en Niveau vun der Späichere gëtt gelueden,
ETL Job Numm - Upload Prozedur, déi aus ville klenge Schrëtt besteet,
Schrëtt Nummer - d'Zuel vun de Schrëtt, déi duerchgefouert gëtt,
Affektéiert Reihen - wéi vill Donnéeën scho veraarbecht goufen,
Dauer sec - wéi laang et dauert,
Status - ob alles gutt ass oder net: OK, ERROR, RUNNING, HANGS
Message - Last erfollegräich Message oder Feeler Beschreiwung.
Baséierend op de Status vun de records, kënnt Dir eng E-Mail schécken. Bréif un aner Memberen. Wann et keng Feeler ass, ass de Bréif net néideg.
Also, am Fall vun engem Feeler, ass d'Plaz vum Tëschefall kloer uginn.
Heiansdo geschitt et datt d'Iwwerwaachungsinstrument selwer net funktionnéiert. An dësem Fall ass et méiglech eng Vue (Vue) direkt an der Datebank ze ruffen, op Basis vun deem de Bericht gebaut ass.
ETL Iwwerwachung Dësch
Fir Iwwerwaachung vun ETL Prozesser ëmzesetzen, sinn een Dësch an eng Vue genuch.
Fir dëst ze maachen, kënnt Dir zréck op
DDL Dëscher
CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
SID INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
LOG_DT INTEGER NOT NULL DEFAULT 0, /* Date time */
LOG_D INTEGER NOT NULL DEFAULT 0, /* Date */
JOB_NAME TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
STEP_NAME TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
STEP_DESCR TEXT, /* Description of task or error message */
UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);
Kuckt / Rapport DDL
CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
SELECT LOG_D,
LOG_DT,
UTL_JOB_STATUS_ID,
SID,
CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
ELSE 'N/A' END AS LAYER,
CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
ELSE 'N/A' END AS SOURCE,
JOB_NAME,
STEP_NAME,
CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS 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
FROM UTL_JOB_STATUS
WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT 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,
CASE
WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
ELSE 'OK'
END 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
FROM
( SELECT 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
FROM SRC
GROUP BY SID, SOURCE, LAYER, JOB_NAME
) JB,
( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_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.SOURCE;
SQL Iwwerpréift ob et méiglech ass eng nei Sessiounsnummer ze kréien
SELECT SUM (
CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
AND NOT ( 'y' = 'n' ) /* force restart 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' /* job name PARAMETER */
AND STEP_NAME = 'ETL_START'
GROUP BY JOB_NAME, SID
) start_job /* starts */
ON d_job.dummy = start_job.dummy
LEFT OUTER JOIN
( SELECT JOB_NAME, SID
FROM UTL_JOB_STATUS
WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
GROUP BY JOB_NAME, SID
) end_job /* ends */
ON start_job.JOB_NAME = end_job.JOB_NAME
AND start_job.SID = end_job.SID
Dësch Fonctiounen:
- den Ufank an Enn vun der Dateveraarbechtungsprozedur musse vun de Schrëtt ETL_START an ETL_END gefollegt ginn
- am Fall vun engem Feeler, soll de Schrëtt ETL_ERROR mat senger Beschreiwung geschaf ginn
- d'Quantitéit u veraarbechten Donnéeën soll zum Beispill mat Asterisken markéiert ginn
- déi selwecht Prozedur kann gläichzäiteg mat dem force_restart=y Parameter gestart ginn, ouni et gëtt d'Sessiounsnummer nëmmen un déi ofgeschloss Prozedur erausginn
- am normalen Modus, Dir kënnt net déi selwecht Dateveraarbechtungsprozedur parallel lafen
Déi néideg Operatiounen fir mat engem Dësch ze schaffen sinn wéi follegt:
- d'Sessiounsnummer vun der lafender ETL Prozedur ze kréien
- setzen d'Logbuch Entrée an den Dësch
- de leschten erfollegräiche Rekord vun enger ETL Prozedur ze kréien
An Datenbanken wéi Oracle oder Postgres kënnen dës Operatiounen als agebaute Funktiounen ëmgesat ginn. sqlite erfuerdert en externe Mechanismus, an an dësem Fall ass et
Konklusioun
Also, Fehlermeldungen an Datenveraarbechtungsinstrumenter spillen eng mega-wichteg Roll. Awer et ass schwéier se optimal ze nennen fir séier d'Ursaach vum Problem ze fannen. Wann d'Zuel vun de Prozeduren honnert ass, da gëtt d'Prozess Iwwerwachung an e komplexe Projet.
Den Artikel gëtt e Beispill vun enger méiglecher Léisung fir de Problem a Form vun engem Prototyp. De ganze klenge Repository Prototyp ass verfügbar a gitlab
Source: will.com