Праћење ЕТЛ процеса у малом складишту података

Многи људи користе специјализоване алате за креирање рутина за издвајање, трансформацију и учитавање података у релационе базе података. Процес алата се евидентира, грешке се бележе.

У случају грешке, дневник садржи информације да алат није успео да заврши задатак и који модули (често јава) су стали где. Последњи редови могу да садрже грешку базе података, као што је повреда јединственог кључа табеле.

Да бих одговорио на питање какву улогу играју информације о грешци ЕТЛ-а, класификовао сам све проблеме који су се десили у последње две године у прилично велико спремиште.

Праћење ЕТЛ процеса у малом складишту података

Грешке базе података укључују: није било довољно простора, веза је изгубљена, сесија је прекинута итд.

Логичке грешке укључују кршења кључева табеле, неважеће објекте, недостатак приступа објектима итд.
Планер се можда неће покренути на време, може се замрзнути итд.

За исправљање једноставних грешака није потребно много времена. Добар ЕТЛ може сам да реши већину њих.

Сложене грешке чине неопходним отварање и проверу процедура руковања подацима и истраживање извора података. Често доводе до потребе да се измене тестирају и примене.

Дакле, половина свих проблема се односи на базу података. 48% свих грешака су једноставне грешке.
Трећина свих проблема је повезана са променама у логици или моделу складиштења више од половине ових грешака.

А мање од четвртине свих проблема се односи на планер задатака, од којих су 18% једноставне грешке.

Све у свему, 22% свих грешака које се јављају су сложене и захтевају највише пажње и времена за исправљање. Оне се дешавају отприлике једном недељно. Док се једноставне грешке дешавају скоро сваки дан.

Очигледно, праћење ЕТЛ процеса ће бити ефикасно када је локација грешке назначена у дневнику што је прецизније могуће и када је потребно минимално време да се пронађе извор проблема.

Ефикасно праћење

Шта сам желео да видим у процесу праћења ЕТЛ-а?

Праћење ЕТЛ процеса у малом складишту података
Почни од - када сам почео да радим,
Извор - извор података,
Слој - који ниво складиштења је учитан,
ЕТЛ Јоб Наме је процедура учитавања која се састоји од много малих корака,
Степ Нумбер — број корака који се извршава,
Захваћени редови – колико података је већ обрађено,
Трајање сек - колико је потребно да се изврши,
Статус - да ли је све у реду или не: ОК, ГРЕШКА, ТРЧИ, ЗАКАСИ
Порука — последња успешна порука или опис грешке.

На основу статуса записа, можете послати е-пошту. писмо осталим учесницима. Ако нема грешака, онда писмо није потребно.

На овај начин, у случају грешке, локација инцидента је јасно назначена.

Понекад се дешава да сам алат за праћење не ради. У овом случају могуће је позвати приказ (виев) директно у бази података, на основу које се гради извештај.

ЕТЛ мониторинг табела

За спровођење праћења ЕТЛ процеса довољна је једна табела и један приказ.

Да бисте то урадили, можете се вратити на своје мало складиште и креирајте прототип у склите бази података.

ДДЛ табеле

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);

Прикажи/пријави ДДЛ

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;

СКЛ Провера могућности добијања новог броја сесије

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

Карактеристике стола:

  • почетак и крај поступка обраде података морају бити праћени корацима ЕТЛ_СТАРТ и ЕТЛ_ЕНД
  • у случају грешке треба креирати корак ЕТЛ_ЕРРОР са његовим описом
  • количину обрађених података треба истаћи, на пример, звездицама
  • иста процедура се може покренути у исто време са параметром форце_рестарт=и без њега, број сесије се издаје само довршеној процедури;
  • у нормалном режиму немогуће је паралелно покренути исту процедуру обраде података

Неопходне операције за рад са столом су следеће:

  • добијање броја сесије ЕТЛ процедуре која се покреће
  • убацивање записника у табелу
  • добијање последњег успешног записа ЕТЛ процедуре

У базама података као што су Орацле или Постгрес, ове операције се могу имплементирати помоћу уграђених функција. склите захтева спољни механизам иу овом случају он прототиповано у ПХП-у.

Излаз

Дакле, извештавање о грешкама у алатима за обраду података игра мега-важну улогу. Али тешко се могу назвати оптималним за брзо проналажење узрока проблема. Када се број процедура приближи стотини, праћење процеса се претвара у сложен пројекат.

Чланак даје пример могућег решења проблема у облику прототипа. Цео прототип малог спремишта је доступан у гитлабу СКЛите ПХП ЕТЛ Услужни програми.

Извор: ввв.хабр.цом

Додај коментар