Skip to main content
يوفّر هذا المحرك تكاملًا للقراءة فقط مع جداول Apache Paimon الموجودة في Amazon S3 وAzure وHDFS والجداول المخزّنة محليًا. ويدعم قراءات اللقطات وعمليات القراءة التزايدية واستبعاد الأقسام الأساسي الذي يوفّره المحرك.

إنشاء جدول

لاحظ أن جدول Paimon يجب أن يكون موجودًا بالفعل في التخزين، إذ لا يدعم هذا الأمر معلمات DDL لإنشاء جدول جديد. يتطلب إنشاء جداول Paimon* تفعيل allow_experimental_paimon_storage_engine (وهو معطّل افتراضيًا)، لذا قم بتمكينه قبل تشغيل CREATE TABLE.

وسائط المحرك

يتوافق وصف هذه الوسائط مع وصف الوسائط في المحركات S3 وAzureBlobStorage وHDFS وFile، كلٌّ بحسبه. يشير format إلى تنسيق ملفات البيانات في جدول Paimon. يمكن تحديد معلمات المحرك باستخدام المجموعات المسماة

مثال

استخدام المجموعات المُسمّاة:

الإمكانات

  • تتم عمليات قراءة اللقطات من أحدث لقطة للجدول.
  • تتم عمليات القراءة التزايدية استنادًا إلى معرّف اللقطة المُعتمدة عند تفعيلها.
  • استبعاد الأقسام عند تمكين use_paimon_partition_pruning.
  • تحديث اختياري للبيانات الوصفية في الخلفية عند ضبطه.
  • معرّف UUID ثابت للجدول عند استخدام قواعد بيانات Atomic/Replicated، مما يتيح وحدات الماكرو {uuid} في مسارات Keeper.

الإعدادات

يستخدم هذا المحرك الإعدادات نفسها المستخدمة في محركات تخزين الكائنات المقابلة، ويضيف إعدادات خاصة بـ Paimon:
  • allow_experimental_paimon_storage_engine — يتيح إنشاء محركات الجداول Paimon وPaimonS3 وPaimonAzure وPaimonHDFS وPaimonLocal. القيمة الافتراضية: 0 (معطّل).
  • use_paimon_metadata_files_cache — يفعّل ذاكرة التخزين المؤقت لملفات البيانات الوصفية في Paimon (تخزّن manifest list وmanifest بعد فك التسلسل). اضبطه على 1 للتفعيل، و0 للتعطيل. القيمة الافتراضية: 0. تختلف كيفية تطبيق هذا الإعداد بين دوال الجداول ومحركات الجداول الدائمة — راجع الملاحظة أدناه.
  • paimon_incremental_read — يفعّل وضع القراءة التزايدية.
  • paimon_metadata_refresh_interval_sec — الفاصل الزمني لتحديث البيانات الوصفية في الخلفية، بالثواني. عند ضبطه على قيمة أكبر من 0، تسحب مهمة تعمل في الخلفية أحدث لقطة ومخطط دوريًا من تخزين الكائنات. القيمة الافتراضية: 30.
  • paimon_keeper_path — مسار Keeper لحالة القراءة التزايدية. يجب ضبطه وأن يكون فريدًا لكل جدول؛ ويدعم وحدات الماكرو مثل {database} و{table} و{uuid}.
  • paimon_replica_name — اسم النسخة المتماثلة لحالة القراءة التزايدية. يجب ضبطه وأن يكون فريدًا لكل نسخة متماثلة؛ ويدعم وحدات الماكرو مثل {replica}.
مثال (تفعيل محرك Paimon التجريبي وذاكرة التخزين المؤقت لملفات البيانات الوصفية):
دورة حياة use_paimon_metadata_files_cacheتعتمد كيفية تطبيق use_paimon_metadata_files_cache على طريقة الوصول إلى جدول Paimon:
  • دوال الجداول (مثل SELECT ... FROM paimonS3(...)): يُقيَّم قرار استخدام الذاكرة المؤقتة لكل query، لذلك يمكنك تمرير SETTINGS use_paimon_metadata_files_cache = 1 مباشرةً في عبارة SELECT.
  • محركات الجداول الدائمة (PaimonS3 وPaimonAzure وPaimonHDFS وPaimonLocal والاسم المستعار Paimon): يُثبَّت قرار استخدام الذاكرة المؤقتة مرةً واحدة عند تهيئة البيانات الوصفية للجدول، ويُخزَّن في مكونات دائمة غير قابلة للتغيير؛ كما أن مسار تحديث البيانات الوصفية لا يعيد عمدًا قراءة هذا الإعداد. لذلك، فإن تمرير SETTINGS use_paimon_metadata_files_cache = 1 ضمن عبارة SELECT على جدول دائم جرت تهيئته بالفعل لا يكون له أي تأثير — إذ يستمر استخدام القرار الذي جرى تثبيته سابقًا. ولتغييره، اضبط use_paimon_metadata_files_cache قبل تهيئة البيانات الوصفية للجدول، أو نفّذ DROP ثم أعد CREATE الجدول بالقيمة المطلوبة.
سعة الذاكرة المؤقتة على مستوى الخادم (paimon_metadata_files_cache_size) ليست مُثبَّتة: فهي إعداد runtime يمكن تغييره عبر SYSTEM RELOAD CONFIG، ويسري مفعوله فورًا حتى على الجداول التي جرت تهيئتها بالفعل.

أمثلة على القراءة التزايدية

القراءة التزايدية باستخدام حالة Keeper:

إعدادات على مستوى الاستعلام للقراءة التزايدية

الإعدادات التالية هي على مستوى الاستعلام (تُمرَّر عبر SELECT ... SETTINGS، وليس ضمن CREATE TABLE). وهي تتحكم في سلوك كل استعلام على حدة لعمليات القراءة التزايدية:
  • paimon_target_snapshot_id — يقرأ فقط التغييرات الخاصة باللقطة المحددة. لا تتقدّم العلامة المائية المُعتمدة في Keeper، لذا يمكن إعادة قراءة اللقطة نفسها أي عدد من المرات. القيمة الافتراضية: -1 (معطّل).
  • max_consume_snapshots — الحد الأقصى لعدد اللقطات التي يمكن استهلاكها في قراءة تزايدية واحدة. عندما يكون المصدر قد راكم عددًا كبيرًا من اللقطات غير المقروءة، يحدّ هذا الإعداد من عدد اللقطات التي تُستهلك في كل استعلام للتحكم في حجم الدفعة. 0 تعني عدم وجود حد. القيمة الافتراضية: 0.
قراءة لقطة مستهدفة — تُرجع دائمًا التغييرات الخاصة باللقطة 1، بغض النظر عن العلامة المائية الحالية:
تحديد عدد اللقطات في كل دفعة — إذا كانت هناك ثلاث لقطات جديدة قيد الانتظار، فلا تستهلك أكثر من اثنتين لكل استعلام:

من Paimon إلى MergeTree عبر عرض مادي قابل للتحديث

يمكنك إنشاء مسار متكامل من المصدر إلى الوجهة يزامن البيانات باستمرار من جدول Paimon إلى جدول MergeTree باستخدام عرض مادي قابل للتحديث في وضع APPEND. في كل دورة تحديث، لا تُقرأ من Paimon إلا البيانات التزايدية الجديدة، ثم تُلحَق بجدول الوجهة. الخطوة 1 — أنشئ جدول مصدر Paimon مع تمكين القراءة التزايدية وتحديث البيانات الوصفية. يستخدم المثال أدناه PaimonLocal. استبدل المحرك بـ PaimonS3 أو PaimonAzure أو PaimonHDFS أو المحرك Paimon الذي يكتشف الإعدادات تلقائيًا، بحسب ما يناسب الواجهة الخلفية للتخزين لديك:
يضبط paimon_metadata_refresh_interval_sec الفاصل الزمني لتحديث البيانات الوصفية في الخلفية، بالثواني. وعندما تكون قيمته أكبر من 0، تسحب مهمة تعمل في الخلفية أحدث لقطة ومخطط من تخزين الكائنات بشكل دوري، بحيث تتمكن دورة تحديث MV من رؤية البيانات المُعتمدة حديثًا دون انتظار أن يؤدّي استعلام إلى تشغيل تحديث البيانات الوصفية. القيمة الافتراضية هي 30. استخدمه بحذر عند التعامل مع عدد كبير من الجداول لتجنّب الإفراط في استخدام تخزين الكائنات وعمليات الإدخال/الإخراج الخاصة بـ Keeper. الخطوة 2 — أنشئ جدول الوجهة من نوع MergeTree (مع استنساخ المخطط من جدول Paimon):
الخطوة 3 — أنشئ العرض المادي القابل للتحديث:
كل 10 ثوانٍ، ينفّذ الـ MV الاستعلام SELECT * FROM paimon_mv_source، الذي يعيد فقط الصفوف المُضافة منذ آخر لقطة تم اعتمادها، ويضيفها إلى paimon_mv_dest. التنظيف:
أوقِف الـ MV قبل حذفها لمنع التحديث في الخلفية من تعطيل عمليات DDL.

القيود

  • تتطلب القراءة التزايدية تهيئة Keeper ‏(ZooKeeper).
  • تتطلب القراءة التزايدية ضبط paimon_keeper_path بحيث يكون فريدًا لكل جدول.
  • يجب أن يكون paimon_replica_name فريدًا لكل نسخة متماثلة ضمن مسار Keeper نفسه.
  • تستخدم القراءة التزايدية آلية تسليم من نوع at-most-once: إذ تُقدَّم اللقطة المعتمدة عند جمع ملفات البيانات، قبل استهلاك البيانات فعليًا. وإذا فشل الاستعلام بعد جمع الملفات، فلن تُعاد قراءة اللقطات التي تم تجاوزها عند إعادة المحاولة.
  • محرك الجدول للقراءة فقط؛ ولا يدعم تعديل البيانات.
  • لا تتعامل القراءة التزايدية مع حذف البيانات التاريخية من مصدر Paimon. إذا حُذفت بيانات Paimon من المصدر الأصلي أو جرى تحديثها، فلن تُزال تلقائيًا الصفوف المقابلة التي كُتبت بالفعل إلى جدول وجهة من نوع ClickHouse MergeTree. يجب عليك إصدار ALTER TABLE ... DELETE يدويًا على جدول MergeTree لتنظيف البيانات القديمة.
  • إذا أُسقِط جدول Paimon الأساسي ثم أُعيد إنشاؤه على مسار تخزين الكائنات نفسه (مثلًا عبر Flink أو Spark)، فيجب عليك تنفيذ DROP ثم إعادة CREATE لجدول ClickHouse المقابل. يكتشف ClickHouse إعادة الإنشاء عبر مقارنة الطابع الزمني لإنشاء schema-0 ويُصدر خطأً؛ ولا يمكن استخدام جدول ClickHouse القديم حتى يُعاد إنشاؤه.

الأسماء البديلة

يكتشف محرك الجدول Paimon تلقائيًا الواجهة الخلفية للتخزين من إعداد disk، ثم يوجّه إلى PaimonS3 أو PaimonAzure أو PaimonLocal وفقًا لذلك. وعند عدم تحديد disk، يُستخدَم PaimonS3 افتراضيًا.

الأعمدة الافتراضية

  • _path — مسار الملف. النوع: LowCardinality(String).
  • _file — اسم الملف. النوع: LowCardinality(String).
  • _size — حجم الملف بالبايت. النوع: Nullable(UInt64). إذا كان حجم الملف غير معروف، تكون القيمة NULL.
  • _time — وقت آخر تعديل للملف. النوع: Nullable(DateTime). إذا كان الوقت غير معروف، تكون القيمة NULL.
  • _etag — قيمة etag للملف. النوع: LowCardinality(String). إذا كانت قيمة etag غير معروفة، تكون القيمة NULL.

أنواع البيانات المدعومة

التقسيم المدعوم

أنواع البيانات المدعومة في مفاتيح التقسيم في Paimon:
  • CHAR
  • VARCHAR
  • BOOLEAN
  • DECIMAL
  • TINYINT
  • SMALLINT
  • INTEGER
  • DATE
  • TIME
  • TIMESTAMP
  • TIMESTAMP WITH LOCAL TIME ZONE
  • BIGINT
  • FLOAT
  • DOUBLE
آخر تعديل في ٢٣ يوليو ٢٠٢٦