Շատերն օգտագործում են մասնագիտացված գործիքներ՝ տվյալների արդյունահանման, փոխակերպման և հարաբերական տվյալների բազաներում բեռնելու ընթացակարգեր ստեղծելու համար: Գործիքների աշխատանքային գործընթացը գրանցվում է, սխալները շտկվում են:
Սխալի դեպքում գրանցամատյանը պարունակում է տեղեկատվություն այն մասին, որ գործիքը չի կատարել առաջադրանքը, և որ մոդուլները (հաճախ java) որտեղ են կանգ առել։ Վերջին տողերում կարող եք գտնել տվյալների բազայի սխալ, օրինակ՝ աղյուսակի եզակի բանալու խախտում:
Հարցին պատասխանելու համար, թե ինչ դեր է խաղում ETL սխալի մասին տեղեկատվությունը, ես դասակարգել եմ բոլոր խնդիրները, որոնք առաջացել են վերջին երկու տարիների ընթացքում բավականին մեծ պահեստում:
Տվյալների բազայի սխալները ներառում են ոչ բավարար տարածք, կորցրած կապ, նստաշրջանի կախվածություն և այլն:
Տրամաբանական սխալները ներառում են, ինչպիսիք են աղյուսակի ստեղների խախտումը, ոչ վավեր օբյեկտները, օբյեկտների հասանելիության բացակայությունը և այլն:
Ժամանակացույցը կարող է չգործարկվել ժամանակին, կարող է սառչել և այլն:
Պարզ սխալները երկար ժամանակ չեն պահանջում ուղղելու համար: Լավ ETL-ը կարող է ինքնուրույն կարգավորել դրանց մեծ մասը:
Բարդ վրիպակներն անհրաժեշտ են դարձնում տվյալների հետ աշխատելու ընթացակարգերի հայտնաբերումը և փորձարկումը, տվյալների աղբյուրները ուսումնասիրելու համար: Հաճախ հանգեցնում են փոփոխության փորձարկման և տեղակայման անհրաժեշտության:
Այսպիսով, բոլոր խնդիրների կեսը կապված է տվյալների բազայի հետ։ Բոլոր սխալների 48%-ը պարզ սխալներ են։
Բոլոր խնդիրների մեկ երրորդը կապված է պահեստավորման տրամաբանության կամ մոդելի փոփոխության հետ, այդ սխալների կեսից ավելին բարդ է:
Եվ բոլոր խնդիրների մեկ քառորդից պակասը կապված է առաջադրանքների ժամանակացույցի հետ, որոնց 18%-ը պարզ սխալներ են:
Ընդհանուր առմամբ, տեղի ունեցող բոլոր սխալների 22%-ը բարդ է, և դրանց ուղղումը պահանջում է առավելագույն ուշադրություն և ժամանակ: Դրանք տեղի են ունենում մոտավորապես շաբաթը մեկ անգամ: Մինչդեռ հասարակ սխալները տեղի են ունենում գրեթե ամեն օր։
Ակնհայտ է, որ ETL գործընթացների մոնիտորինգը արդյունավետ կլինի, երբ սխալի գտնվելու վայրը նշված է գրանցամատյանում հնարավորինս ճշգրիտ, և նվազագույն ժամանակ է պահանջվում խնդրի աղբյուրը գտնելու համար:
Արդյունավետ մոնիտորինգ
Ի՞նչ էի ուզում տեսնել ETL մոնիտորինգի գործընթացում:
Սկսեք, երբ նա սկսեց աշխատանքը,
Աղբյուր - տվյալների աղբյուր,
Շերտ - պահեստավորման ինչ մակարդակ է բեռնվում,
ETL Job Name - վերբեռնման ընթացակարգ, որը բաղկացած է բազմաթիվ փոքր քայլերից,
Քայլի համարը - կատարվող քայլի համարը,
Ազդեցված տողեր - որքան տվյալներ են արդեն մշակվել,
Տևողությունը վայրկյան - որքան ժամանակ է տևում,
Կարգավիճակ. ամեն ինչ լավ է, թե ոչ. ԼԱՎ, ՍԽԱԼ, ՎԱԶՈՒՄ, ԿԱԽՎՈՒՄ Է
Հաղորդագրություն - Վերջին հաջողված հաղորդագրությունը կամ սխալի նկարագրությունը:
Ելնելով գրառումների կարգավիճակից՝ կարող եք նամակ ուղարկել: նամակ մյուս անդամներին։ Եթե սխալներ չկան, ապա նամակն անհրաժեշտ չէ։
Այսպիսով, սխալի դեպքում հստակ նշվում է դեպքի վայրը։
Երբեմն պատահում է, որ մոնիտորինգի գործիքն ինքնին չի աշխատում: Այս դեպքում հնարավոր է անմիջապես տվյալների բազայում անվանել դիտում (դիտում), որի հիման վրա կառուցվում է հաշվետվությունը։
ETL մոնիտորինգի աղյուսակ
ETL գործընթացների մոնիտորինգ իրականացնելու համար բավական է մեկ աղյուսակ և մեկ դիտում:
Դա անելու համար կարող եք վերադառնալ
DDL սեղաններ
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);
Դիտել/Հաղորդել 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 Ստուգում, թե արդյոք հնարավոր է նոր նստաշրջանի համար ստանալ
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
Սեղանի առանձնահատկությունները.
- տվյալների մշակման ընթացակարգի մեկնարկին և ավարտին պետք է հետևեն ETL_START և ETL_END քայլերը
- սխալի դեպքում պետք է ստեղծվի ETL_ERROR քայլն իր նկարագրությամբ
- մշակված տվյալների քանակը պետք է ընդգծվի, օրինակ, աստղանիշներով
- նույն ընթացակարգը կարող է միաժամանակ սկսվել force_restart=y պարամետրով, առանց դրա սեսիայի համարը տրվում է միայն ավարտված ընթացակարգին:
- նորմալ ռեժիմում դուք չեք կարող զուգահեռ վարել տվյալների մշակման նույն ընթացակարգը
Սեղանի հետ աշխատելու համար անհրաժեշտ գործողությունները հետևյալն են.
- ստանալով ընթացիկ ETL ընթացակարգի նիստի համարը
- մուտքագրեք մատյան մուտքը աղյուսակում
- ստանալով ETL ընթացակարգի վերջին հաջող գրառումը
Տվյալների բազաներում, ինչպիսիք են Oracle-ը կամ Postgres-ը, այս գործողությունները կարող են իրականացվել որպես ներկառուցված գործառույթներ: sqlite-ը պահանջում է արտաքին մեխանիզմ, և այս դեպքում այն
Արտադրողականություն
Այսպիսով, տվյալների մշակման գործիքներում սխալ հաղորդագրությունները մեգակարևոր դեր են խաղում: Բայց դժվար է դրանք անվանել օպտիմալ՝ խնդրի պատճառն արագ գտնելու համար։ Երբ պրոցեդուրաների թիվը մոտենում է հարյուրի, ապա գործընթացի մոնիտորինգը վերածվում է բարդ նախագծի։
Հոդվածում բերված է խնդրի հնարավոր լուծման օրինակ՝ նախատիպի տեսքով։ Ամբողջ փոքր պահեստի նախատիպը հասանելի է gitlab-ում
Source: www.habr.com