إنشاء جدول
Paimon* تفعيل allow_experimental_paimon_storage_engine (وهو معطّل افتراضيًا)، لذا قم بتمكينه قبل تشغيل CREATE TABLE.
وسائط المحرك
S3 وAzureBlobStorage وHDFS وFile، كلٌّ بحسبه.
يشير format إلى تنسيق ملفات البيانات في جدول Paimon.
يمكن تحديد معلمات المحرك باستخدام المجموعات المسماة
مثال
الإمكانات
- تتم عمليات قراءة اللقطات من أحدث لقطة للجدول.
- تتم عمليات القراءة التزايدية استنادًا إلى معرّف اللقطة المُعتمدة عند تفعيلها.
- استبعاد الأقسام عند تمكين
use_paimon_partition_pruning. - تحديث اختياري للبيانات الوصفية في الخلفية عند ضبطه.
- معرّف UUID ثابت للجدول عند استخدام قواعد بيانات Atomic/Replicated، مما يتيح وحدات الماكرو
{uuid}في مسارات Keeper.
الإعدادات
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}.
دورة حياة
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، ويسري مفعوله فورًا حتى على الجداول التي جرت تهيئتها بالفعل.أمثلة على القراءة التزايدية
إعدادات على مستوى الاستعلام للقراءة التزايدية
SELECT ... SETTINGS، وليس ضمن CREATE TABLE). وهي تتحكم في سلوك كل استعلام على حدة لعمليات القراءة التزايدية:
paimon_target_snapshot_id— يقرأ فقط التغييرات الخاصة باللقطة المحددة. لا تتقدّم العلامة المائية المُعتمدة في Keeper، لذا يمكن إعادة قراءة اللقطة نفسها أي عدد من المرات. القيمة الافتراضية:-1(معطّل).max_consume_snapshots— الحد الأقصى لعدد اللقطات التي يمكن استهلاكها في قراءة تزايدية واحدة. عندما يكون المصدر قد راكم عددًا كبيرًا من اللقطات غير المقروءة، يحدّ هذا الإعداد من عدد اللقطات التي تُستهلك في كل استعلام للتحكم في حجم الدفعة.0تعني عدم وجود حد. القيمة الافتراضية:0.
من Paimon إلى MergeTree عبر عرض مادي قابل للتحديث
APPEND. في كل دورة تحديث، لا تُقرأ من Paimon إلا البيانات التزايدية الجديدة، ثم تُلحَق بجدول الوجهة.
الخطوة 1 — أنشئ جدول مصدر Paimon مع تمكين القراءة التزايدية وتحديث البيانات الوصفية.
يستخدم المثال أدناه PaimonLocal. استبدل المحرك بـ PaimonS3 أو PaimonAzure أو PaimonHDFS أو المحرك Paimon الذي يكتشف الإعدادات تلقائيًا، بحسب ما يناسب الواجهة الخلفية للتخزين لديك:
paimon_metadata_refresh_interval_sec الفاصل الزمني لتحديث البيانات الوصفية في الخلفية، بالثواني. وعندما تكون قيمته أكبر من 0، تسحب مهمة تعمل في الخلفية أحدث لقطة ومخطط من تخزين الكائنات بشكل دوري، بحيث تتمكن دورة تحديث MV من رؤية البيانات المُعتمدة حديثًا دون انتظار أن يؤدّي استعلام إلى تشغيل تحديث البيانات الوصفية. القيمة الافتراضية هي 30. استخدمه بحذر عند التعامل مع عدد كبير من الجداول لتجنّب الإفراط في استخدام تخزين الكائنات وعمليات الإدخال/الإخراج الخاصة بـ Keeper.
الخطوة 2 — أنشئ جدول الوجهة من نوع MergeTree (مع استنساخ المخطط من جدول Paimon):
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.
أنواع البيانات المدعومة
التقسيم المدعوم
CHARVARCHARBOOLEANDECIMALTINYINTSMALLINTINTEGERDATETIMETIMESTAMPTIMESTAMP WITH LOCAL TIME ZONEBIGINTFLOATDOUBLE