Çavdêriya pêvajoyên ETL di depoyek daneya piçûk de

Pir kes amûrên pispor bikar tînin da ku prosedurên ji bo derxistin, veguheztin û barkirina daneyan di databasên pêwendiyê de biafirînin. Pêvajoya amûrên xebatê tê tomar kirin, xeletî têne rast kirin.

Di bûyera xeletiyekê de, têketin agahdarî vedihewîne ku amûrê nekariye peywirê biqedîne û kîjan modul (bi gelemperî java) li ku rawestiyane. Di rêzikên paşîn de, hûn dikarin xeletiyek databasê bibînin, mînakî, binpêkirina keyek bêhempa ya tabloyê.

Ji bo bersiva pirsa ka agahdariya xeletiya ETL çi rola dilîze, min hemî pirsgirêkên ku di van du salên borî de qewimîne di depoyek pir mezin de dabeş kiriye.

Çavdêriya pêvajoyên ETL di depoyek daneya piçûk de

Çewtiyên databasê ne cîhê têr, girêdana winda, danişîna daleqandî, hwd.

Çewtiyên mantiqî wek binpêkirina bişkojkên tabloyê, tiştên nederbasdar, negihîştina tiştan, hwd.
Dibe ku plansaz di wextê xwe de dest pê neke, dibe ku bicemide, hwd.

Çewtiyên hêsan ji bo rastkirina wan demek dirêj nake. ETLyek baş dikare piraniya wan bixwe bi rê ve bibe.

Çewtiyên tevlihev hewce dike ku prosedurên ji bo xebata bi daneyan vedîtin û ceribandin, lêgerîna çavkaniyên daneyê. Bi gelemperî dibe sedema hewcedariya ceribandin û bicîhkirina guhartinê.

Ji ber vê yekê, nîvê hemî pirsgirêkan bi databasê ve girêdayî ne. 48% ji hemî xeletiyan xeletiyên hêsan in.
Sêyek ji hemî pirsgirêkan bi guhertina mantiq an modela hilanînê ve girêdayî ye, ji nîvê zêdetir van xeletiyan tevlihev in.

Û kêmtir ji çaryeka hemî pirsgirêkan bi plansazkirina peywirê ve girêdayî ne, 18% ji wan xeletiyên hêsan in.

Bi gelemperî, 22% ji hemî xeletiyên ku diqewimin tevlihev in, û rastkirina wan herî zêde bal û wext hewce dike. Ew heftê carekê çêdibin. Digel ku xeletiyên hêsan hema hema her roj diqewimin.

Eşkere ye, çavdêriya pêvajoyên ETL dê bi bandor be dema ku cîhê xeletiyê di têketinê de bi qasî ku pêkan rast tê destnîşan kirin û dema herî kêm hewce ye ku çavkaniya pirsgirêkê bibîne.

Şopandina bi bandor

Min dixwest di pêvajoya çavdêriya ETL de çi bibînim?

Çavdêriya pêvajoyên ETL di depoyek daneya piçûk de
Dest pê bike - gava ku wî dest bi kar kir,
Çavkanî - çavkaniya daneyê,
Layer - çi asta hilanînê tê barkirin,
Navê Karê ETL - pêvajoya barkirinê, ku ji gelek gavên piçûk pêk tê,
Hejmara Gav - hejmara gava ku tê kirin,
Rêzên Bibandor - çiqas daneya ku jixwe hatî hilberandin,
Demjimêr saniye - çiqas dirêj digire,
Rewş - gelo her tişt baş e an na: BAŞ, ÇEWT, RÊZIN, DALIQE
Peyam - Peyama serketî ya paşîn an şirovekirina xeletiyê.

Li ser bingeha rewşa navnîşan, hûn dikarin e-nameyek bişînin. nameyek ji endamên din re. Ger xeletî nebin, wê hingê nameyê ne hewce ye.

Bi vî awayî, di bûyera xeletiyekê de, cihê bûyerê bi zelalî tê destnîşan kirin.

Carinan diqewime ku amûra çavdêriyê bixwe nexebite. Di vê rewşê de, gengaz e ku meriv rasterast di databasê de, ku li ser bingeha wê rapor hatî çêkirin, nêrînek (dîmenek) bang bike.

Tabloya çavdêriya ETL

Ji bo pêkanîna şopandina pêvajoyên ETL, yek tablo û yek dîtin bes in.

Ji bo vê yekê, hûn dikarin vegerin depoya weya piçûk û di databasa sqlite de prototîp biafirînin.

maseyên 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);

Dîtin / DDL Rapor bikin

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 Kontrol dike ka gelo gengaz e ku jimareyek danişîna nû bistînin

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

Taybetmendiyên tabloyê:

  • divê destpêk û dawiya prosedûra hilanîna daneyê bi gavên ETL_START û ETL_END were şopandin
  • heke xeletiyek hebe, divê gavê ETL_ERROR bi danasîna wê re were afirandin
  • mîqdara daneyên pêvajoyî divê were ronî kirin, mînakî, bi stêrkan
  • heman prosedur dikare di heman demê de bi parametreya force_restart=y were destpêkirin, bêyî wê jimareya danişînê tenê ji prosedûra qedandî re tê derxistin.
  • di moda normal de, hûn nekarin heman prosedûra hilberandina daneyê bi paralelî bimeşînin

Operasyonên pêwîst ên ji bo xebata bi tabloyê wiha ne:

  • wergirtina jimareya danişînê ya prosedûra ETL-ê ya xebitandinê
  • têketina têketinê têxe tabloyê
  • bidestxistina tomara serketî ya paşîn a pêvajoyek ETL

Di databasên wekî Oracle an Postgres de, ev operasyon dikarin wekî fonksiyonên çêkirî werin bicîh kirin. sqlite mekanîzmayek derveyî hewce dike, û di vê rewşê de prototîpa di PHP de.

encamê

Ji ber vê yekê, peyamên xeletiyê di amûrên hilberandina daneyê de rolek mega-girîng dilîzin. Lê dijwar e ku meriv wan ji bo zû dîtina sedema pirsgirêkê binav bike. Gava ku hejmara proseduran nêzî sed dibe, wê hingê çavdêriya pêvajoyê vediguhere projeyek tevlihev.

Gotar mînakek çareseriyek gengaz a pirsgirêkê di forma prototîpê de peyda dike. Tevahiya prototîpa depoya piçûk di gitlab de heye Karûbarên SQLite PHP ETL.

Source: www.habr.com

Add a comment