مراقبة عمليات ETL في مستودع بيانات صغير

يستخدم العديد منهم أدوات متخصصة لإنشاء إجراءات لاستخراج البيانات وتحويلها وتحميلها إلى قواعد بيانات علائقية. يتم تسجيل عملية أدوات العمل ، يتم تسجيل الأخطاء.

في حالة وجود خطأ ، يحتوي السجل على معلومات فشلت فيها الأداة في إكمال المهمة وأي وحدات (غالباً جافا) حيث توقفت. في الأسطر الأخيرة ، يمكنك العثور على خطأ في قاعدة البيانات ، على سبيل المثال ، انتهاك مفتاح جدول فريد.

للإجابة على السؤال ، ما هو الدور الذي تلعبه معلومات خطأ ETL ، قمت بتصنيف جميع المشكلات التي حدثت في المستودع الكبير نوعًا ما خلال العامين الماضيين.

صورة

خصائص التخزين حيث تم إجراء التصنيف:

  • 20 مصادر البيانات متصلة
  • يتم معالجة 10.5 مليار الصفوف يوميا
  • التي يتم تجميعها تصل إلى 50 مليون صف ،
  • معالجة البيانات 140 حزمة في 700 خطوات (خطوة واحدة sql طلب)
  • الخادم - 4-قاعدة بيانات X5

تتضمن أخطاء قاعدة البيانات مثل نفاد المساحة ، اتصال غير متصل ، تعليق الجلسة ، إلخ.

تتضمن الأخطاء المنطقية انتهاكات مفاتيح الجدول ، كائنات غير صالحة ، عدم إمكانية الوصول إلى الكائنات ، إلخ.
قد لا يبدأ المجدول في الوقت المناسب ، وقد يتعطل ، إلخ.

الأخطاء البسيطة لا تتطلب الكثير من الوقت لإصلاحها. مع معظمهم ، يمكن ETL جيدة التعامل من تلقاء نفسها.

تجعل الأخطاء المعقدة من الضروري فتح إجراءات التحقق من العمل والتحقق منها ، للبحث في مصادر البيانات. غالبًا ما تؤدي إلى الحاجة إلى اختبار التغييرات والنشر.

لذلك ، نصف جميع المشاكل مرتبطة بقاعدة البيانات. 48 ٪ من جميع الأخطاء هي أخطاء بسيطة.
يرتبط الجزء الثالث من جميع المشاكل بتغيير في منطق أو نموذج المستودع ؛ أكثر من نصف هذه الأخطاء معقدة.

ترتبط أقل من ربع جميع المشاكل بجدولة المهام ، 18٪ منها أخطاء بسيطة.

بشكل عام ، 22 ٪ من جميع الأخطاء التي وقعت معقدة ؛ إصلاحها يتطلب أكبر قدر من الاهتمام والوقت. تحدث مرة واحدة في الأسبوع تقريبًا. بينما تحدث أخطاء بسيطة كل يوم تقريبًا.

من الواضح أن مراقبة عمليات 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 .

استنتاج


وبالتالي ، تلعب رسائل الخطأ في أدوات معالجة البيانات دورًا مهمًا للغاية. ولكن من الصعب أن ندعو لهم الأمثل للبحث السريع عن أسباب المشكلة. عندما يقترب عدد الإجراءات من مائة ، يتحول رصد العمليات إلى مشروع معقد.

تقدم المقالة مثالًا عن حل محتمل للمشكلة في شكل نموذج أولي. يتوفر النموذج الأولي الكامل للمستودع الصغير في gitlab SQLite PHP ETL Utilities .

Source: https://habr.com/ru/post/ar465637/


All Articles