الصيغة
المعاملات
s3 وazureBlobStorage وHDFS وfile، على التوالي.
يشير format إلى تنسيق ملفات البيانات في جدول Iceberg.
بالنسبة إلى icebergS3، يمكن استخدام المعامل الاختياري extra_credentials لتمرير role_arn بغرض الوصول المستند إلى الدور في ClickHouse Cloud. راجع Secure S3 للاطلاع على خطوات الإعداد.
القيمة المُعادة
مثال
تعريف مجموعة مسماة
استخدام كتالوج بيانات
IcebergS3 ووفّر الإعدادات اللازمة.
على سبيل المثال، عند استخدام REST Catalog مع وحدة التخزين MinIO:
تطور المخطط
- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
استبعاد الأقسام
use_iceberg_partition_pruning = 1. لمزيد من المعلومات حول استبعاد أقسام Iceberg، راجع https://iceberg.apache.org/spec/#partitioning
السفر عبر الزمن
معالجة الجداول ذات الصفوف المحذوفة
- الحذف بالمساواة
- متجهات الحذف (أُضيفت في v3)
الاستخدام الأساسي
iceberg_timestamp_ms وiceberg_snapshot_id معًا في الاستعلام نفسه.
اعتبارات مهمة
- اللقطات تُنشأ عادةً عندما:
- تُكتب بيانات جديدة إلى الجدول
- يُجرى نوعٌ ما من عمليات دمج البيانات
- تغييرات المخطط لا تُنشئ لقطات عادةً - يؤدي ذلك إلى سلوكيات مهمة عند استخدام السفر عبر الزمن مع الجداول التي خضعت لتطوّر المخطط.
أمثلة على السيناريوهات
السيناريو 1: تغييرات المخطط من دون لقطات جديدة
- عند ts1 وts2: يظهر العمودان الأصليان فقط
- عند ts3: تظهر الأعمدة الثلاثة جميعها، وتكون قيمة السعر في الصف الأول NULL
السيناريو 2: الاختلافات بين المخطط التاريخي والمخطط الحالي
ALTER TABLE لا يُنشئ snapshot جديدة، ولكن بالنسبة إلى الجدول الحالي، يأخذ Spark قيمة schema_id من أحدث ملف metadata، وليس من snapshot.
السيناريو 3: اختلافات المخطط التاريخي والحالي
Select في ClickHouse بدلًا من استعلامات Select في Spark، وسيعمل الأمر بالطريقة نفسها.
تحديد ملف البيانات الوصفية
iceberg في ClickHouse، يحتاج النظام إلى تحديد ملف metadata.json الصحيح الذي يصف بنية جدول Iceberg. إليك كيف تتم عملية التحديد هذه:
البحث عن المرشحين (حسب ترتيب الأولوية)
- تحديد المسار مباشرةً:
*إذا عيّنت
iceberg_metadata_file_path، فسيستخدم النظام هذا المسار المحدد كما هو، من خلال دمجه مع مسار دليل جدول Iceberg.
- عند توفير هذا الإعداد، يتم تجاهل جميع إعدادات resolution الأخرى.
-
مطابقة UUID الجدول:
*إذا تم تحديد
iceberg_metadata_table_uuid، فسيقوم النظام بما يلي: *ينظر فقط إلى ملفات.metadata.jsonفي دليلmetadata*يُصفّي الملفات التي تحتوي على الحقلtable-uuidالمطابق لـ UUID الذي حددته (غير حساس لحالة الأحرف) -
البحث الافتراضي:
*إذا لم يتم توفير أيٍّ من الإعدادين أعلاه، تصبح جميع ملفات
.metadata.jsonفي دليلmetadataمرشحين
اختيار أحدث ملف
-
إذا كان
iceberg_recent_metadata_file_by_last_updated_ms_fieldمُمكّنًا: -
يُختار الملف ذو أكبر قيمة
last-updated-ms - بخلاف ذلك:
- يُختار الملف ذو أعلى رقم إصدار
-
(يظهر الإصدار بصيغة
Vفي أسماء الملفات المنسّقة على النحوV.metadata.jsonأوV-uuid.metadata.json)
iceberg في ClickHouse تفسّر مباشرةً الملفات المخزّنة في S3 على أنها جداول Iceberg، ولذلك من المهم فهم قواعد التحديد هذه.
ذاكرة التخزين المؤقت للبيانات الوصفية
Iceberg والدالة الجدولية ذاكرة تخزين مؤقت للبيانات الوصفية تُخزّن معلومات ملفات manifest وmanifest list وملف metadata json. تُخزَّن ذاكرة التخزين المؤقت هذه في الذاكرة. ويجري التحكم في هذه الميزة عبر الإعداد use_iceberg_metadata_files_cache، وهي مفعّلة افتراضيًا.
الأسماء البديلة
iceberg اسمًا بديلًا لـ icebergS3.
الأعمدة الافتراضية
_path— مسار الملف. النوع:LowCardinality(String)._file— اسم الملف. النوع:LowCardinality(String)._size— حجم الملف بالبايت. النوع:Nullable(UInt64). إذا كان حجم الملف غير معروف، فستكون القيمةNULL._time— وقت آخر تعديل للملف. النوع:Nullable(DateTime). إذا كان الوقت غير معروف، فستكون القيمةNULL._etag— قيمة etag للملف. النوع:LowCardinality(String). إذا كانت قيمة etag غير معروفة، فستكون القيمةNULL.
الكتابة في جدول Iceberg
إنشاء جدول
مثال
iceberg_use_version_hint.
إذا أردت ضغط ملف metadata.json، فحدِّد اسم خوارزمية الضغط في الإعداد iceberg_metadata_compression_method.
INSERT
مثال
DELETE
مثال
تطوّر المخطط
مثال
الدمج
حذف اللقطات منتهية الصلاحية
expire_snapshots اللقطات القديمة وينظّف ملفات البيانات التي لم تعد أي لقطة محتفَظ بها تُشير إليها.
الصياغة:
min-snapshots-to-keep وmax-snapshot-age-ms، وعمليات التجاوز لكل مرجع). عند تحديد snapshot_ids، يتم تخطي سياسة الاستبقاء ولا تُؤخذ في الاعتبار لانتهاء الصلاحية إلا اللقطات المُدرجة.
الوسيطات:
'timestamp'(موضعي) أوexpire_before = 'timestamp'— سلسلة DateTime (مثل'2024-06-01 00:00:00') تُفسَّر وفق المنطقة الزمنية للخادم. تعمل كآلية أمان: اللقطات التي تكون قيمةtimestamp-msالخاصة بها مساوية لهذه القيمة أو أحدث منها تكون محمية من انتهاء الصلاحية، حتى لو كانت سياسة الاستبقاء ستُنهي صلاحيتها بخلاف ذلك. ويمكن دمجها معsnapshot_ids، وفي هذه الحالة لا تنتهي صلاحية اللقطات المُدرجة التي تقع عند هذا الطابع الزمني أو بعده.retention_period = '<duration>'— يتجاوز قيمةhistory.expire.max-snapshot-age-msعلى مستوى الجدول لهذا الاستدعاء فقط. تصبح اللقطات الأقدم من هذه المدة (مقاسةً من الوقت الحالي) مرشحة لانتهاء الصلاحية. وتكون القيمة سلسلة مدة تتكوّن من زوج واحد أو أكثر من{number}{unit}متصلة معًا. الوحدات المدعومة:y(365 يومًا)،w(7 أيام)،d(24 ساعة)،h(60 دقيقة)،m(60 ثانية)،s(ثانية واحدة)،ms(1 ميلي ثانية). ويمكن دمج الوحدات، مثل'3d'و'12h'و'1d12h30m'و'500ms'.retain_last = N— يتجاوز قيمةhistory.expire.min-snapshots-to-keepعلى مستوى الجدول لهذا الاستدعاء فقط. ويُحتفَظ دائمًا بما لا يقل عنNمن اللقطات بغضّ النظر عن عمرها.snapshot_ids = [id1, id2, ...]— يُنهي صلاحية معرّفات اللقطات المُدرجة فقط (باستثناء اللقطات المشار إليها بواسطة اللقطة الحالية أو الفروع أو الوسوم). يتخطى هذا الوضع سياسة الاستبقاء بالكامل، ولا يمكن دمجه معretention_periodأوretain_last.dry_run = 1— يحسب ما الذي كان سينتهي صلاحيته ويُرجع المقاييس دون كتابة بيانات وصفية جديدة أو حذف ملفات.
يتجاوز
retention_period وretain_last فقط قيم الاستبقاء الافتراضية على مستوى الجدول. أما عمليات تجاوز الاستبقاء لكل مرجع (فرع/وسم) المُعدّة في خصائص جدول Iceberg (مثل refs.<branch>.min-snapshots-to-keep) فلا يتم تجاوزها مطلقًا — بل تسري دائمًا كما هي محددة في البيانات الوصفية للجدول.metric_name String, metric_value Int64) ويضم صفًا واحدًا لكل مقياس. وتتبع أسماء المقاييس مواصفة Iceberg:
ينفّذ الأمر الخطوات التالية:
- يقيّم سياسة الاحتفاظ (انظر أدناه) لتحديد اللقطات التي يجب الإبقاء عليها
- إذا تم توفير وسيطة طابع زمني، فإنه يحمي أيضًا جميع اللقطات عند ذلك الطابع الزمني أو الأحدث منه
- يُنهي صلاحية اللقطات التي لا تحتفظ بها السياسة ولا تشملها الحماية بالطابع الزمني
- يحسب الملفات المرتبطة حصريًا باللقطات منتهية الصلاحية
- في الوضع العادي: ينشئ بيانات وصفية جديدة من دون اللقطات منتهية الصلاحية
- في الوضع العادي: يحذف فعليًا قوائم البيان وملفات البيان وملفات البيانات التي لم يعد من الممكن الوصول إليها
- في وضع
dry_run = 1: يتخطى الخطوتين 5 و6 ويُرجع فقط المقاييس المحسوبة
سياسة الاحتفاظ باللقطات
expire_snapshots سياسة الاحتفاظ بلقطات Iceberg. يُضبط الاحتفاظ عبر خصائص جدول Iceberg وعمليات التجاوز على مستوى كل مرجع:
يمكن لكل مرجع لقطة (
refs في بيانات Iceberg الوصفية) تجاوز هذه القيم من خلال حقول خاصة بكل مرجع: min-snapshots-to-keep وmax-snapshot-age-ms وmax-ref-age-ms.
تقييم الاحتفاظ:
- لكل فرع (بما في ذلك
main): يُتتبَّع تسلسل الأسلاف بدءًا من رأس الفرع. ويُحتفَظ باللقطات ما دام أحد الشرطين التاليين متحققًا:- أن تكون اللقطة من أول
min-snapshots-to-keepفي التسلسل - أن يكون عمر اللقطة ضمن
max-snapshot-age-ms(أيnow - timestamp-ms <= max-snapshot-age-ms)
- أن تكون اللقطة من أول
- بالنسبة إلى
tags: يُحتفَظ باللقطة المشار إليها ما لم يكنtagقد تجاوزmax-ref-age-msالخاص به، وعندها يُزال مرجعtag - المراجع غير
mainالتي يتجاوز عمرهاmax-ref-age-msتُزال بالكامل (أما فرعmainفلا يُزال أبدًا) - المراجع المعلّقة التي تشير إلى لقطات غير موجودة تُزال مع تحذير
- تُحفَظ اللقطة الحالية دائمًا، بغض النظر عن إعدادات الاحتفاظ
ALTER TABLE EXECUTE مطلوب، وهو امتياز فرعي من ALTER TABLE في التسلسل الهرمي للتحكم في الوصول في ClickHouse. يمكنك منحه مباشرةً أو عبر الامتياز الأصل:
- لا تُدعَم إلا جداول Iceberg ذات تنسيق الإصدار 2 (إذ لا تضمن لقطات v1 وجود
manifest-list، وهو مطلوب لتحديد الملفات المراد تنظيفها بأمان) - تُحفَظ اللقطة الحالية دائمًا، حتى إذا كانت أقدم من الطابع الزمني المحدد
- يتطلب تمكين الإعداد
allow_insert_into_iceberg - يتطلب تمكين الإعداد
allow_experimental_expire_snapshots - يُطبَّق التفويض الخاص بـ catalog نفسه (مثل مصادقة REST catalog وAWS Glue IAM وغيرها) بشكل مستقل عندما يحدّث ClickHouse البيانات الوصفية
إزالة الملفات اليتيمة
remove_orphan_files هذه الملفات اليتيمة ويزيلها.
الصيغة:
أمثلة:
metric_name وmetric_value، ويعرض عدد الملفات المحذوفة (أو التي كان سيُحذفها في وضع dry_run) حسب الفئة. تُصنَّف فئات الملفات باستخدام أساليب استدلالية بأفضل جهد استنادًا إلى اصطلاحات تسمية الملفات؛ أما الملفات التي لا تطابق أي نمط محدد فتُدرج افتراضيًا ضمن deleted_data_files_count:
الإعدادات:
- يتطلب Iceberg format version 2 (أو أعلى). تُرفض جداول الإصدار 1 لأنها تفتقر إلى مؤشرات
manifest-listفي لقطات، وهي مطلوبة لتحديد مجموعة الملفات القابلة للوصول بأمان. ويؤدي تشغيل الأمر على جدول v1 إلى إرجاع خطأBAD_ARGUMENTS. - يتطلب تمكين كلٍّ من الإعدادين
allow_insert_into_icebergوallow_iceberg_remove_orphan_files - يُوصى بتشغيل
expire_snapshotsقبلremove_orphan_filesحتى تُنظَّف أولًا الملفات المشار إليها بشكل فريد من خلال لقطات منتهية الصلاحية - استخدم
dry_run = 1لمعاينة orphan files قبل حذفها - تحمي عتبة
older_thanمن حذف الملفات الناتجة عن عمليات كتابة لا تزال قيد التنفيذ — وتوفّر العتبة الافتراضية البالغة 3 أيام هامش أمان مريحًا