Fanaraha-maso ny fizotran'ny ETL ao amin'ny trano fanatobiana data kely

Olona maro no mampiasa fitaovana manokana mba hamoronana fomba fanao amin'ny fitrandrahana, fanovana ary fametahana angona ho amin'ny angona mifandraika. Ny fizotry ny fitaovana dia voarakitra an-tsoratra, ny fahadisoana dia voarakitra.

Raha misy hadisoana, ny log dia misy fampahafantarana fa tsy nahavita ilay asa ilay fitaovana ary ireo modules (matetika java) nijanona teo. Ny andalana farany dia mety misy hadisoana amin'ny angon-drakitra, toy ny fanitsakitsahana ny fanalahidy tokana an'ny latabatra.

Mba hamaliana ny fanontaniana hoe inona no anjara asan'ny fampahalalam-baovao momba ny fahadisoana ETL, nosokajiko tao anaty tahiry lehibe iray ny olana rehetra nitranga tao anatin'ny roa taona lasa.

Fanaraha-maso ny fizotran'ny ETL ao amin'ny trano fanatobiana data kely

Ny hadisoana amin'ny database dia misy toy ny: tsy ampy ny toerana, very ny fifandraisana, nihantona ny fivoriana, sns.

Ny lesoka lojika dia misy ny fanitsakitsahana ny fanalahidin'ny latabatra, ny zavatra tsy mety, ny tsy fahampian'ny fidirana amin'ny zavatra, sns.
Mety tsy hatomboka ara-potoana ny fandaharam-potoana, mety hivaingana, sns.

Ny fahadisoana tsotra dia tsy maka fotoana betsaka hanitsiana. Ny ETL tsara dia afaka mitantana samirery ny ankamaroan'izy ireo.

Ny hadisoana sarotra dia ilaina ny manokatra sy manamarina ny fomba fikarakarana angon-drakitra ary manadihady loharanon-kevitra. Matetika dia mitarika ho amin'ny filΓ na fitsapana ny fanovana sy ny fametrahana.

Noho izany, ny antsasaky ny olana rehetra dia mifandray amin'ny angon-drakitra. 48% amin'ny fahadisoana rehetra dia fahadisoana tsotra.
Ny ampahatelon'ny olana rehetra dia mifandraika amin'ny fiovana eo amin'ny lojika fitahirizana na maodely mihoatra ny antsasany amin'ireo fahadisoana ireo dia sarotra.

Ary latsaky ny ampahefatry ny olana rehetra dia mifandray amin'ny mpandrindra asa, ny 18% amin'ireo dia fahadisoana tsotra.

Amin'ny ankapobeny, ny 22% amin'ny lesoka rehetra mitranga dia sarotra ary mitaky fiheverana sy fotoana betsaka hanitsiana azy. Indray mandeha isan-kerinandro izy ireo no mitranga. Raha ny fahadisoana tsotra mitranga saika isan'andro.

Mazava ho azy fa hahomby ny fanaraha-maso ny fizotran'ny ETL rehefa aseho amin'ny log araka izay azo atao ny toerana misy ny hadisoana ary ilaina ny fotoana kely indrindra hahitana ny loharanon'ny olana.

Fanaraha-maso mahomby

Inona no tiako ho hita amin'ny fizotran'ny fanaraha-maso ETL?

Fanaraha-maso ny fizotran'ny ETL ao amin'ny trano fanatobiana data kely
Manomboka amin'ny - rehefa nanomboka niasa aho,
Loharano - loharano angona,
Layer - izay haavon'ny fitahirizana entana,
Ny anaran'ny asa ETL dia fomba fiasa izay misy dingana kely maro,
Step Number - laharan'ny dingana atao,
Laharana voakasika - firy ny angona efa voavoatra,
Faharetan'ny sec - hafiriana ny fotoana hanatanterahana,
Status - na tsara daholo na tsia: OK, ERROR, RUNNING, HANGS
Hafatra - hafatra nahomby farany na famaritana fahadisoana.

Miorina amin'ny satan'ny rakitra, afaka mandefa mailaka ianao. taratasy ho an'ny mpandray anjara hafa. Raha tsy misy lesoka dia tsy ilaina ny taratasy.

Amin'izany fomba izany, raha misy hadisoana, dia aseho mazava tsara ny toerana misy ny tranga.

Indraindray dia mitranga fa ny fitaovana fanaraha-maso mihitsy no tsy mandeha. Amin'ity tranga ity, azo atao ny miantso mivantana ny fijery (jereo) ao amin'ny tahiry, mifototra amin'ny fananganana ny tatitra.

tabilao fanaraha-maso ETL

Mba hampiharana ny fanaraha-maso ny fizotran'ny ETL, latabatra iray sy fijery iray dia ampy.

Mba hanaovana izany dia afaka miverina amin'ny ny fitahirizanao kely ary mamorona prototype ao amin'ny database sqlite.

Ny tabilaon'ny 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);

Jereo / tatitra 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 Fanamarinana ny fahafahana mahazo laharana fivoriana vaovao

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

Toetran'ny latabatra:

  • ny fiandohana sy ny fiafaran'ny dingana fanodinana angona dia tsy maintsy miaraka amin'ny dingana ETL_START sy ETL_END
  • raha misy hadisoana dia tokony hamorona dingana ETL_ERROR miaraka amin'ny famaritana azy
  • ny habetsaky ny angona voahodina dia tokony hasongadina, ohatra, miaraka amin'ny asterisk
  • Ny dingana mitovy dia azo atomboka miaraka amin'ny force_restart = y parameter raha tsy misy izany, ny laharan'ny fivoriana dia omena afa-tsy amin'ny dingana vita
  • amin'ny fomba mahazatra dia tsy azo atao ny mampandeha ny fomba fanodinana data mitovy amin'ny parallΓ¨le

Ny asa ilaina amin'ny fiasana amin'ny latabatra dia ireto manaraka ireto:

  • mahazo ny laharan'ny fivoriana amin'ny fomba fiasa ETL atomboka
  • fampidirana log in anaty latabatra
  • mahazo ny firaketana mahomby farany momba ny fomba fiasa ETL

Ao amin'ny angon-drakitra toy ny Oracle na Postgres, ireo asa ireo dia azo ampiharina amin'ny fiasa naorina. Ny sqlite dia mitaky mekanika ivelany ary amin'ity tranga ity prototype amin'ny PHP.

famaranana

Noho izany, mitana anjara toerana lehibe ny tatitra momba ny fahadisoana amin'ny fitaovana fanodinana data. Saingy tsy azo antsoina hoe tsara indrindra izy ireo mba hahitana haingana ny anton'ny olana. Rehefa manakaiky ny zato ny isan'ny fomba fiasa dia mivadika ho tetikasa sarotra ny fanaraha-maso ny fizotrany.

Ny lahatsoratra dia manome ohatra iray amin'ny vahaolana azo atao amin'ny olana amin'ny endrika prototype. Ny prototype manontolo amin'ny tahiry kely dia hita ao amin'ny gitlab SQLite PHP ETL Utilities.

Source: www.habr.com

Add a comment