هڪ ننڍي ڊيٽا گودام ۾ اي ٽي ايل عملن جي نگراني

ڪيترائي خاص اوزار استعمال ڪن ٿا ڊيٽا کي ڪڍڻ، تبديل ڪرڻ ۽ لوڊ ڪرڻ لاءِ طريقيڪار ٺاهڻ لاءِ لاڳاپيل ڊيٽابيس ۾. ڪم ڪندڙ اوزار جو عمل لاگ ان ٿيل آهي، غلطيون مقرر ٿيل آهن.

غلطي جي صورت ۾، لاگ ان معلومات تي مشتمل آهي ته ٽول ڪم مڪمل ڪرڻ ۾ ناڪام ٿيو ۽ ڪهڙا ماڊل (اڪثر جاوا) ڪٿي بند ٿي ويا. آخري لائينن ۾، توھان ڳولي سگھوٿا ڊيٽابيس جي غلطي، مثال طور، ھڪڙي جدول منفرد ڪيئي خلاف ورزي.

سوال جو جواب ڏيڻ لاءِ ته ETL غلطي جي معلومات ڪهڙي ڪردار ادا ڪري ٿي، مون انهن سڀني مسئلن کي ورهايو آهي جيڪي گذريل ٻن سالن ۾ پيش آيا آهن بلڪه وڏي ذخيري ۾.

هڪ ننڍي ڊيٽا گودام ۾ اي ٽي ايل عملن جي نگراني

ڊيٽابيس جي غلطين ۾ ڪافي جاءِ نه، گم ٿيل ڪنيڪشن، سيشن ھنگ، وغيره شامل آھن.

منطقي غلطيون شامل آهن جيئن ته ٽيبل جي چاٻين جي ڀڃڪڙي، غير صحيح شيون، شيون تائين رسائي جي کوٽ، وغيره.
شيڊيولر وقت تي شروع نه ٿي سگھي، اھو منجمد ٿي سگھي ٿو، وغيره.

سادي غلطين کي ٺيڪ ڪرڻ ۾ گهڻو وقت نه لڳندو آهي. ھڪڙو سٺو اي ٽي ايل انھن مان گھڻا پاڻ کي سنڀالي سگھي ٿو.

ڪمپليڪس بگ ان کي دريافت ڪرڻ ۽ ڊيٽا سان ڪم ڪرڻ جي طريقيڪار کي جانچڻ ضروري بڻائي ٿو، ڊيٽا جي ذريعن کي ڳولڻ لاء. اڪثر ڪري تبديلي جي جاچ ۽ مقرري جي ضرورت کي ڏسندا آهن.

تنهن ڪري، سڀني مسئلن جو اڌ ڊيٽابيس سان لاڳاپيل آهي. سڀني غلطين جو 48 سيڪڙو سادي غلطيون آهن.
سڀني مسئلن جو ٽيون حصو اسٽوريج منطق يا ماڊل کي تبديل ڪرڻ سان لاڳاپيل آهي، انهن مان اڌ کان وڌيڪ غلطيون پيچيده آهن.

۽ سڀني مسئلن جو هڪ چوٿون کان به گهٽ ٽاسڪ شيڊولر سان لاڳاپيل آهن، جن مان 18 سيڪڙو سادي غلطيون آهن.

عام طور تي، سڀني غلطين جو 22٪ پيچيده آهي، ۽ انهن جي اصلاح تمام گهڻي ڌيان ۽ وقت جي ضرورت آهي. اهي هفتي ۾ هڪ ڀيرو لڳن ٿا. جڏهن ته سادي غلطيون لڳ ڀڳ هر روز ٿينديون آهن.

ظاهر آهي، ETL عملن جي نگراني اثرائتو ٿيندو جڏهن لاگ ۾ غلطي جي جڳهه کي ممڪن طور تي صحيح طور تي ظاهر ڪيو ويو آهي ۽ مسئلي جو ذريعو ڳولڻ لاء گهٽ ۾ گهٽ وقت گهربل آهي.

مؤثر نگراني

مون کي ETL مانيٽرنگ جي عمل ۾ ڇا ڏسڻ چاهيو؟

هڪ ننڍي ڊيٽا گودام ۾ اي ٽي ايل عملن جي نگراني
شروع ڪيو - جڏهن هن ڪم شروع ڪيو،
ذريعو- ڊيٽا جو ذريعو،
پرت - اسٽوريج جي ڪهڙي سطح لوڊ ٿي رهي آهي،
ETL نوڪري جو نالو - اپلوڊ جو طريقو، جيڪو ڪيترن ئي ننڍن مرحلن تي مشتمل آهي،
قدم نمبر - قدم جو تعداد انجام ڏنو پيو وڃي،
متاثر ٿيل قطارون - ڪيترو ڊيٽا اڳ ۾ ئي پروسيس ڪيو ويو آهي،
مدت سيڪنڊ - ڪيترو وقت وٺندو آهي،
حالت - ڇا سڀ ڪجھ ٺيڪ آھي يا نه: ٺيڪ، ERROR، RUNNING، HANGS
پيغام - آخري ڪامياب پيغام يا غلطي بيان.

رڪارڊ جي حيثيت جي بنياد تي، توهان هڪ اي ميل موڪلي سگهو ٿا. ٻين ميمبرن ڏانهن خط. جيڪڏهن ڪو نقص نه آهي، ته پوء خط ضروري نه آهي.

اهڙيء طرح، غلطي جي صورت ۾، واقعي جي جڳهه کي واضح طور تي اشارو ڪيو ويو آهي.

ڪڏهن ڪڏهن اهو ٿئي ٿو ته مانيٽرنگ جو اوزار پاڻ ڪم نٿو ڪري. انهي حالت ۾، اهو ممڪن آهي ته هڪ ڏيک (ڏسو) سڌو سنئون ڊيٽابيس ۾، جنهن جي بنياد تي رپورٽ ٺاهي وئي آهي.

اي ٽي ايل مانيٽرنگ ٽيبل

اي ٽي ايل عملن جي نگراني کي لاڳو ڪرڻ لاء، هڪ ٽيبل ۽ هڪ ڏسڻ ڪافي آهي.

هن کي ڪرڻ لاء، توهان واپس ڪري سگهو ٿا توهان جو ننڍڙو ذخيرو ۽ sqlite ڊيٽابيس ۾ پروٽوٽائپ ٺاهيو.

ڊي ڊي ايل ٽيبل

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 ۾ پروٽوٽائپ ٿيل.

ٿڪل

اهڙيء طرح، ڊيٽا پروسيسنگ اوزار ۾ غلطي پيغام هڪ ميگا اهم ڪردار ادا ڪن ٿا. پر اهو ڏکيو آهي ته انهن کي بهتر سڏڻ لاء جلدي مسئلي جو سبب ڳولڻ لاء. جڏهن طريقيڪار جو تعداد هڪ سئو تائين پهچي ٿو، پوء پروسيس مانيٽرنگ هڪ پيچيده منصوبي ۾ بدلجي ٿو.

هن مقالي ۾ هڪ prototype جي صورت ۾ مسئلي جي ممڪن حل جو هڪ مثال مهيا ڪري. سڄو ننڍڙو ذخيرو پروٽوٽائپ موجود آهي gitlab ۾ SQLite PHP ETL افاديت.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو