Ngawas prosés ETL dina gudang data leutik

Loba ngagunakeun parabot husus pikeun nyieun prosedur pikeun extracting, transforming, sarta loading data kana database relational. Prosés alat-alat damel dilogam, kasalahan dibenerkeun.

Upami aya kasalahan, log ngandung inpormasi yén alat éta gagal pikeun ngarengsekeun tugas sareng modul mana (sering java) lirén dimana. Dina garis panungtungan, anjeun tiasa manggihan kasalahan database, Contona, palanggaran konci unik tabel.

Pikeun ngajawab sual naon peran ETL informasi kasalahan maén, Kuring geus digolongkeun sagala masalah anu lumangsung salila dua taun kaliwat dina gudang rada badag.

Ngawas prosés ETL dina gudang data leutik

Kasalahan database kalebet henteu cekap rohangan, sambungan anu leungit, sési digantung, jsb.

Kasalahan logis kalebet sapertos palanggaran konci méja, obyék anu henteu valid, kurangna aksés kana objék, jsb.
Jadwal tiasa henteu ngamimitian dina waktosna, tiasa beku, jsb.

Kasalahan basajan teu butuh waktu lila pikeun ngalereskeun. ETL anu saé tiasa ngadamel kalolobaanana nyalira.

Bug kompléks ngajadikeun perlu manggihan sarta nguji prosedur pikeun gawé bareng data, pikeun neuleuman sumber data. Mindeng ngakibatkeun kabutuhan pikeun nguji robah na deployment.

Janten, satengah sadaya masalah aya hubunganana sareng pangkalan data. 48% tina sakabéh kasalahan téh kasalahan basajan.
Katilu sadaya masalah aya hubunganana sareng ngarobih logika atanapi modél panyimpenan, langkung ti satengahna kasalahan ieu rumit.

Sareng kirang ti saparapat sadaya masalah anu aya hubunganana sareng jadwal tugas, 18% diantarana mangrupikeun kasalahan saderhana.

Sacara umum, 22% tina sakabéh kasalahan anu lumangsung téh kompléks, sarta koreksi maranéhanana merlukeun paling perhatian sarta waktu. Éta lumangsung ngeunaan saminggu sakali. Sedengkeun kasalahan basajan lumangsung ampir unggal poé.

Jelas, ngawaskeun prosés ETL bakal efektif nalika lokasi kasalahan dituduhkeun dina log sakumaha akurat-gancang sareng waktos minimum anu diperyogikeun pikeun milarian sumber masalah.

Ngawaskeun éféktif

Naon anu kuring hoyong tingali dina prosés ngawaskeun ETL?

Ngawas prosés ETL dina gudang data leutik
Mimitian - nalika anjeunna ngamimitian damel,
Sumber - sumber data,
Lapisan - naon tingkat panyimpenan anu dimuat,
Ngaran Proyék ETL - prosedur unggah, anu diwangun ku sababaraha léngkah leutik,
Nomer Lengkah - jumlah léngkah anu dilakukeun,
Baris anu kapangaruhan - sabaraha data anu parantos diolah,
Durasi detik - sabaraha lila waktu nu diperlukeun,
Status - naha sadayana henteu kunanaon: OKÉ, ERROR, RUNNING, HANGS
Pesen - Pesen suksés terakhir atanapi pedaran kasalahan.

Dumasar status rékaman, anjeun tiasa ngirim email. surat ka anggota lianna. Upami teu aya kasalahan, maka suratna henteu diperyogikeun.

Ku kituna, dina acara kasalahan, lokasi kajadian jelas dituduhkeun.

Kadang-kadang kajadian yén alat ngawaskeun sorangan henteu jalan. Dina hal ieu, kasebut nyaéta dimungkinkeun pikeun nelepon view a (view) langsung dina database, dina dasar nu laporan diwangun.

méja pangimeutan ETL

Pikeun ngalaksanakeun ngawaskeun prosés ETL, hiji méja sareng hiji tampilan cekap.

Jang ngalampahkeun ieu, anjeun bisa balik ka gudang saeutik Anjeun sarta nyieun prototipe dina database sqlite.

tabél 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);

Témbongkeun / Laporan 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 Mariksa lamun kasebut nyaéta dimungkinkeun pikeun meunangkeun nomer sési anyar

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

Fitur tabel:

  • mimiti jeung ahir prosedur ngolah data kudu dituturkeun ku léngkah ETL_START jeung ETL_END
  • Upami aya kasalahan, léngkah ETL_ERROR sareng pedaranana kedah didamel
  • jumlah data olahan kudu disorot, contona, kalawan tanda bintang
  • prosedur anu sami tiasa dimimitian dina waktos anu sami sareng parameter force_restart = y, tanpa éta nomer sési dikaluarkeun ngan ukur pikeun prosedur réngsé
  • dina modeu normal, Anjeun teu bisa ngajalankeun prosedur ngolah data sarua dina paralel

Operasi anu dipikabutuh pikeun damel sareng méja nyaéta kieu:

  • meunang nomer sési tina prosedur ETL ngajalankeun
  • selapkeun entri log kana tabél
  • meunangkeun catetan suksés panungtungan tina prosedur ETL

Dina database sapertos Oracle atanapi Postgres, operasi ieu tiasa dilaksanakeun salaku fungsi anu diwangun. sqlite merlukeun mékanisme éksternal, sarta dina hal ieu eta prototipe dina PHP.

kacindekan

Ku kituna, pesen kasalahan dina alat ngolah data maénkeun peran mega-penting. Tapi hese nelepon aranjeunna optimal pikeun gancang manggihan anu ngabalukarkeun masalah. Nalika jumlah prosedur ngadeukeutan saratus, teras ngawaskeun prosés janten proyék anu kompleks.

Artikel nyadiakeun conto solusi mungkin pikeun masalah dina bentuk prototipe. Prototipe gudang leutik sadayana sayogi di gitlab SQLite PHP ETL Utiliti.

sumber: www.habr.com

Tambahkeun komentar