كيف شاهد مهندس البيانات البيانات

مرحبا يا هابر! أريد أن أخبرك كيف كتبنا ونفذنا خدمة لمراقبة جودة البيانات. لدينا العديد من مصادر البيانات: البيانات من الأسواق المالية ونشاط التداول لعملائنا وعروض الأسعار وغير ذلك الكثير. كل هذا يولد مليارات التسجيلات يوميًا في عملياتنا. يعد اكتمال واتساق البيانات التجارية عنصرًا مهمًا في أعمال Exness.

إذا كنت قريبًا من مشاكل ضمان جودة البيانات وتهتم بكيفية حل هذه المشكلة في المنزل ، فمرحبًا بك في القط.



اسمي ديمتري ، أعمل في فريق يقوم بتخزين كل من البيانات الأولية والتحويل والتجميع وتوفير جميع البيانات المعالجة لجميع أقسام الشركة. يتم استهلاك بياناتنا من قبل العديد من الفرق داخل الشركة ، مثل Business Intelligence ، و Anti-Fraud ، و Finance ، ونوفرها أيضًا لشركائنا في b2b.

يعد العمل بالبيانات مهمة مسؤولة وصعبة ، لأن إيقاف عملية ETL واحدة يمكن أن يؤدي إلى شلل جزء من أعمال شركة Exness. 

لحل مشاكل ETL ، نستخدم مجموعة متنوعة من الأدوات:



التحديات التي نواجهها كل يوم:

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

من أجل توفير مثل هذه الضمانات ، كان من الضروري معرفة كيفية تتبع وقياس والاستجابة بشكل استباقي للانحرافات في جودة البيانات.

نظرًا لتعقيد عمليات جمع البيانات ومعالجتها ، نظرًا للسرعة العالية لتطوير وتعديل عمليات ETL ، يصبح من الضروري مراقبة جودة البيانات بالفعل عند النقطة النهائية. عادة ما يكون لدينا قاعدة بيانات Clickhouse أو PostgreSQL. ستخبرنا هذه المقاييس مدى سرعة عمل عملياتنا:

SELECT server, 
       avg(updated - close_time) 
FROM   trades 
WHERE  close_time > subtractHours(Now(), 2GROUP  BY server

سيساعدون في العثور على التكرارات في البيانات (لا توجد قيود فريدة في Clickhouse):

SELECT SUM(count) FROM (
   SELECT
      COUNT(*) AS count
   FROM trades
   GROUP BY order_id
   HAVING count > 1
)

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

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

بحثنا عن حل جاهز يمكنه جمع مقاييس الأعراض هذه لنا. متطلباتنا:

  • دعم مصادر البيانات المختلفة (قواعد البيانات ، قوائم الانتظار ، طلبات http) ؛

  • ( , );
  • .

في بداية المقال ، قمت بإدراج التقنيات التي نستخدمها في ETL. كما ترون ، نحن مؤيدون للحلول مفتوحة المصدر! أحد الأمثلة: نستخدم قاعدة بيانات Clickhouse الموجهة نحو الأعمدة كمستودع البيانات الرئيسي. أجرى فريقنا تغييرات على شفرة مصدر Clickhouse عدة مرات (إصلاح الأخطاء بشكل أساسي). كأدوات للعمل مع المقاييس والسلسلة الزمنية ، نستخدم: تدفق النظام البيئي ، ومقاييس بروميثيوس وفكتوريا ، zabbix.

لدهشتنا ، اتضح أنه لا توجد أداة جاهزة ومريحة لرصد جودة البيانات التي تتناسب مع التقنيات التي اخترناها. أم أننا نظرنا بشكل سيء؟

نعم، zabbix لديه القدرة على تشغيل البرامج النصية المخصصة ، و تلغرافيمكنك تعليم كيفية تشغيل استعلامات SQL وتحويل نتائجها إلى مقاييس. لكن هذا يتطلب تشطيبات جدية ، ولم يعمل خارج الصندوق بالطريقة التي أردناها. لذلك ، قمنا بكتابة خدمتنا الخاصة (خفي) لمراقبة جودة البيانات. لقاء العصب!

ميزات الأعصاب


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

الملامح الرئيسية للبرنامج:

  • دعم أنواع مختلفة من المهام: Query ، CompareQueries ، وما إلى ذلك ؛
  • القدرة على كتابة أنواع المهام الخاصة بك في Python كمكوّن إضافي لوقت التشغيل ؛
  • العمل مع أنواع مختلفة من الموارد: Clickhouse ، Postgres ، وما إلى ذلك ؛
  • مقاييس بيانات النموذج ، كما هو الحال في بروميثيوس
    metric_name{label="value"} 123.3 ؛
  • pull prometheus;
  • : crontab-style;
  • WEB UI ;
  • yaml ;
  • Twelve-Factor App

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



لدينا ثلاث مهام. اثنان منهم من نوع الاستعلام - استعلام SQL. واحد من نوع Garcon - هذه مهمة مخصصة تذهب إلى إحدى خدماتنا. يمكن ضبط تكرار المهمة حسب فترة زمنية. على سبيل المثال ، 10 م تعني مرة واحدة كل عشر دقائق. أو على غرار crontab "* / 5 * * * *" - كل خمس دقائق كاملة. ترتبط المهام TaskA و TaskC بمورد DbCon1 ، وهو من نوع Clickhouse. دعونا نرى كيف سيبدو التكوين:

tasks:
  - name: TaskA
    type: Query
    resources: DbCon1
    period: 1m
    config:
      query: SELECT COUNT(*) FROM ticks
      gauge: metric_count{table="ticks"}

  - name: TaskB
    type: Garcon
    period: 10m
    config:
      url: "http://hostname:9003/api/v1/orders/backups/"
      gauge: backup_ago

  - name: TaskC
    type: Query
    period: "*/5 * * * *"
    resources: DbCon1
    config:
      query: SELECT now() - toDateTime(time_msc/1000)
   FROM deals WHERE trade_server= 'Real'
   ORDER BY deal DESC LIMIT 1
      gauge: orders_lag

resources:
  - name: DbCon1
    type: Clickhouse
    config:
      host: clickhouse.env
      port: 9000
      user: readonly
      password: "***"
      database: data

results:
  common_labels:
    env="prod"
task_types_paths:
  - "./tasks"

مسار "./tasks" هو المسار إلى المهام المخصصة. على وجه الخصوص ، يتم تحديد نوع مهمة Garcon هناك. في هذه المقالة سوف أغفل لحظة إنشاء أنواع المهام الخاصة بي.

نتيجة لإطلاق الخدمة العصبية بمثل هذا التكوين ، في WEB UI سيكون من الممكن مراقبة كيفية تنفيذ المهام:



وستتوفر مقاييس / مقاييس المجموعة:



نوع مهمة الاستعلام الأكثر استخدامًا في فريقنا. لذلك ، قمنا بتوسيع قدراته للعمل مع GROUP BY والقوالب. هذه الآليات تجعل من الممكن جمع الكثير من المعلومات حول البيانات مع طلب واحد في كل مرة:



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

بضع كلمات حول التنفيذ. Nerve هو تطبيق متعدد الخطوط python3 ~ 3k LoC يسهل تشغيله من خلال Docker ، ويكمله بتكوين مهمة.

ماذا حدث


بالعصب ، حصلنا على ما أردنا. في الوقت الحالي ، بالإضافة إلى فريقنا ، أبدت فرق أخرى في Exness اهتمامًا به. تدور حوالي 40 مهمة بتردد 30 ثانية ليوم واحد. تجمع Nerve حوالي 500 مقياس حول بياناتنا. تستغرق عملية إضافة مقاييس جديدة من 5 إلى 10 دقائق. يبدو التدفق الكامل للعمل باستخدام المقاييس كما يلي: العصب → prometheus → Victoria Metrics → لوحات العدادات Grafana → التنبيهات في PagerDuty.
مع العصبية ، بدأنا أيضًا في جمع مقاييس الأعمال: نختار بشكل دوري الأحداث الأولية في نظام التداول لتقييم ظروف التداول.

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

جيد للجميع!

All Articles