په کوچني ډیټا ګدام کې د ETL پروسې څارنه

ډیری خلک د اړونده ډیټابیسونو کې د ډیټا ایستلو ، بدلولو او بارولو لپاره معمول رامینځته کولو لپاره ځانګړي وسیلې کاروي. د وسیلو پروسه ننوتنه شوې ، غلطۍ ثبت شوي.

د تېروتنې په صورت کې، لاګ معلومات لري چې وسیله د دندې په بشپړولو کې پاتې راغلې او کوم ماډلونه (اکثرا جاوا) چیرته ودریدل. په وروستي کرښو کې ممکن د ډیټابیس تېروتنه وي، لکه د میز د ځانګړي کیلي څخه سرغړونه.

د دې پوښتنې ځواب لپاره چې د ETL غلطۍ معلومات څه رول لوبوي، ما ټول هغه ستونزې طبقه بندي کړې چې په تیرو دوو کلونو کې واقع شوي په یوه لوی ذخیره کې.

په کوچني ډیټا ګدام کې د ETL پروسې څارنه

د ډیټابیس تېروتنې شاملې دي لکه: کافي ځای نه و، پیوستون ورک شوی، ناسته ځړول، او داسې نور.

په منطقي غلطیو کې د میز کیلي څخه سرغړونه، ناسم شیان، شیانو ته د لاسرسي نشتوالی، او نور شامل دي.
مهالویش شاید په خپل وخت پیل نشي، کیدای شي کنګل شي، او داسې نور.

ساده غلطۍ د سمولو لپاره ډیر وخت نه نیسي. یو ښه ETL کولی شي ډیری یې پخپله اداره کړي.

پیچلې تېروتنې دا اړینه کوي چې د ډیټا اداره کولو طرزالعملونه خلاص او چیک کړئ او د معلوماتو سرچینې وپلټئ. ډیری وختونه د بدلونونو ازموینې او پلي کولو اړتیا ته لاره هواروي.

نو، د ټولو ستونزو نیمایي په ډیټابیس پورې اړه لري. د ټولو غلطیو 48٪ ساده غلطۍ دي.
د ټولو ستونزو دریمه برخه د ذخیره کولو منطق یا ماډل کې بدلونونو پورې اړه لري؛ د دې نیمایي څخه زیاتې غلطۍ پیچلې دي.

او د ټولو ستونزو له څلورمې برخې څخه لږ د کاري مهالویش سره تړاو لري، چې 18٪ یې ساده غلطۍ دي.

په ټولیز ډول، د ټولو غلطیتونو 22٪ پیچلې دي او د سمولو لپاره خورا پام او وخت ته اړتیا لري. دوی په اونۍ کې یو ځل پیښیږي. پداسې حال کې چې ساده غلطۍ نږدې هره ورځ پیښیږي.

په ښکاره ډول، د ETL پروسو څارنه به اغیزمنه وي کله چې د خطا موقعیت په لاګ کې د امکان تر حده دقیق ښودل شوی وي او د ستونزې سرچینې موندلو لپاره لږترلږه وخت ته اړتیا وي.

اغیزمنه څارنه

زه د ETL څارنې پروسې کې څه لیدل غواړم؟

په کوچني ډیټا ګدام کې د ETL پروسې څارنه
په پیل کې - کله چې ما کار پیل کړ،
سرچینه - د معلوماتو سرچینه
پرت - د ذخیره کولو کومه کچه بار شوې،
د ETL د دندې نوم د بارولو پروسه ده چې ډیری کوچني ګامونه لري،
د مرحلې شمیره - د هغه ګام شمیره چې اجرا کیږي،
اغیزمن شوي قطارونه - څومره معلومات دمخه پروسس شوي،
موده ثانيه - دا څومره وخت نیسي چې اعدام شي،
حالت - ایا هرڅه ښه دي یا نه: سمه، تېروتنه، چلول، ځړول
پیغام - وروستی بریالی پیغام یا د تېروتنې توضیحات.

د ریکارډونو حالت پراساس ، تاسو کولی شئ بریښنالیک واستوئ. نورو ګډونوالو ته لیک. که کومه تېروتنه نه وي، نو لیک اړین نه دی.

په دې توګه، د تېروتنې په صورت کې، د پیښې ځای په روښانه توګه په ګوته کیږي.

ځینې ​​​​وختونه داسې پیښیږي چې د څارنې وسیله پخپله کار نه کوي. پدې حالت کې ، دا ممکنه ده چې لید ( لید) په مستقیم ډول په ډیټابیس کې واچوئ ، د کوم پراساس راپور جوړ شوی.

د ETL څارنې میز

د ETL پروسو د څارنې پلي کولو لپاره، یو میز او یو لید کافي دي.

د دې کولو لپاره تاسو کولی شئ بیرته راستانه شئ ستاسو خپل کوچنی ذخیره او په sqlite ډیټابیس کې یو پروټوټایپ جوړ کړئ.

د 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 یو بهرني میکانیزم ته اړتیا لري او پدې حالت کې دا په PHP کې پروټوټایپ شوی.

پایلې

په دې توګه، د معلوماتو پروسس کولو وسیلو کې د تېروتنې راپور ورکول یو لوی مهم رول لوبوي. مګر دوی په سختۍ سره د ستونزې د علت موندلو لپاره غوره بلل کیدی شي. کله چې د پروسیجرونو شمیر سل ته ورسیږي، د پروسې څارنه په یوه پیچلې پروژه بدلیږي.

مقاله د پروټوټایپ په بڼه د ستونزې لپاره د ممکنه حل یوه بیلګه وړاندې کوي. د کوچني ذخیره ټول پروټوټایپ په ګیټلاب کې شتون لري د SQLite PHP ETL اسانتیاوې.

سرچینه: www.habr.com

Add a comment