إنشاء جدول
من دون مخطط صريح، يجب أن يكون جدول Iceberg موجودًا بالفعل في التخزين. لإنشاء جدول Iceberg مستقل جديد على خلفية قابلة للكتابة، حدّد مخططه في عبارةCREATE TABLE.
وسيطات المحرك
وصف هذه الوسيطات مطابق لوصف الوسيطات في المحرّكاتS3 وAzureBlobStorage وHDFS وFile، على الترتيب.
يشير format إلى تنسيق ملفات البيانات في جدول Iceberg.
بالنسبة إلى IcebergS3، يمكن استخدام المعامل الاختياري extra_credentials لتمرير role_arn من أجل الوصول المستند إلى الأدوار في ClickHouse Cloud. راجع تأمين S3 للاطلاع على خطوات الإعداد.
يمكن تحديد معاملات المحرك باستخدام المجموعات المُسمّاة
مثال
الأسماء البديلة
يكتشف محرك الجدولIceberg خلفية التخزين تلقائيًا من إعداد disk، ثم يوجّه إلى IcebergS3 أو IcebergAzure أو IcebergLocal وفقًا لذلك. وعند عدم تحديد disk، يستخدم تنفيذ IcebergS3 افتراضيًا.
أنواع البيانات
يوضح الجدول التالي كيفية مطابقة أنواع بيانات Iceberg مع أنواع بيانات ClickHouse أثناء استنتاج المخطط (لأغراض القراءة).الأنواع الأولية
الأنواع المركبة
قيود توافق المخطط والكتابة
تنطبق تعيينات أنواع البيانات المذكورة أعلاه على عمليات القراءة. وتنطبق القيود التالية عند إنشاء ClickHouse لمخططات Iceberg أو تطويرها وكتابة البيانات:- لا يستطيع ClickHouse إنشاء مخطط Iceberg يحتوي على
BoolأوDecimalأوFixedStringأوInt8أوUInt8أوInt16أوUInt16، ولا إضافة عمود أو تعديل نوعه إلى أحد هذه الأنواع. تفشل العملية باستثناء نوع غير مدعوم. لا يمنع ذلك إدراج قيمBoolأوDecimalفي أعمدة Iceberg الموجودة. - عند إنشاء ClickHouse لمخطط Iceberg أو تطويره، فإنه يعيّن كل عمود من نوع
DateTimeوDateTime64إلى نوعtimestampفي Iceberg، الذي يتميز بدقة ميكروثانية ولا يتضمن منطقة زمنية. لا يستطيع ClickHouse إنشاء أنواع مخططاتtimestamptzأوtimestamp_nsأوtimestamptz_ns، لذا لا تُمثَّل الدقة الأعلى ودلالات المنطقة الزمنية في مخطط Iceberg. - لا يستطيع ClickHouse الكتابة إلى جدول Iceberg يستخدم عمودًا من نوع
decimalأوfixedأوtimestamp_nsأوtimestamptz_nsكحقل تقسيم مباشر. تفشل العملية باستثناء نوع غير مدعوم. - بالنسبة إلى ملفات البيانات التي تحتوي على أنواع لا يستطيع ClickHouse إجراء تسلسل لحدودها، بما في ذلك
BoolوDecimal، يحذف ClickHouse جميع الحدود الدنيا والعليا للأعمدة من إدخال بيان Iceberg. تظل أحجام الأعمدة وأعداد قيم null مضمنة، وتبقى البيانات صحيحة، لكن لا تستطيع القارئات استخدام تقليم min-max على مستوى البيان لهذه الملفات.
تطور المخطط
يدعم ClickHouse قراءة جداول Iceberg التي تطور مخططها بمرور الوقت. ويشمل ذلك الجداول التي أُضيفت إليها أعمدة أو أُزيلت منها أو أُعيد ترتيبها، وكذلك الأعمدة التي تغيّرت من required إلى Nullable. بالإضافة إلى ذلك، تكون تحويلات الأنواع التالية مدعومة:- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
تشذيب الأقسام
يدعم ClickHouse تشذيب الأقسام أثناء استعلامات SELECT على جداول Iceberg، مما يساعد على تحسين أداء الاستعلام من خلال تخطي ملفات البيانات غير ذات الصلة. لتمكين تشذيب الأقسام، اضبطuse_iceberg_partition_pruning = 1. لمزيد من المعلومات حول تشذيب أقسام Iceberg، راجع https://iceberg.apache.org/spec/#partitioning
السفر عبر الزمن
يدعم ClickHouse ميزة السفر عبر الزمن في جداول Iceberg، ما يتيح لك الاستعلام عن البيانات التاريخية باستخدام طابع زمني محدد أو معرّف لقطة.دمج ملفات البيان الوصفي
مع مرور الوقت، قد تؤدي عمليات الكتابة المتكررة على جدول Iceberg إلى تراكم عدد كبير من ملفات البيان الصغيرة في قائمة البيان الخاصة باللقطة الحالية. وتؤدي قائمة البيان الطويلة إلى إبطاء تخطيط الاستعلام، إذ يجب قراءة كل ملف بيان لاكتشاف ملفات البيانات. ويمكن لـ ClickHouse دمج ملفات البيان هذه في عدد أقل من الملفات الأكبر حجمًا باستخدام عبارةOPTIMIZE TABLE ... MANIFEST:
replace) تشير إلى ملفات البيانات نفسها من خلال مجموعة موحّدة من ملفات البيان. لا يُعاد كتابة أي ملفات بيانات، ولا تُضاف أي صفوف أو تُحذف أو تُزال ازدواجيتها — بل يُعاد فقط ترتيب طبقة البيان.
المتطلبات والسلوك
- هذه الميزة تجريبية، ولا تتاح إلا عند تفعيل الإعداد
allow_experimental_iceberg_compaction. وتُطلق العبارة استثناءً إذا لم يكن الإعداد مفعّلًا. - لا تتم محاولة الدمج إلا عندما يتجاوز عدد ملفات البيان في قائمة البيان الخاصة باللقطة الحالية العتبة التي يحددها الإعداد
iceberg_manifest_min_count_to_compact(القيمة الافتراضية100، وهي القيمة الافتراضية الموثّقة لخاصية جدول Icebergcommit.manifest.min-count-to-merge). وإذا كان العدد الحالي أقل من العتبة أو مساويًا لها، يُتخطى الدمج ولا تُنشأ لقطة جديدة. اضبط العتبة على قيمة أقل لإجراء الدمج بشكل أكثر سرعة. - لا يكون
OPTIMIZE TABLE ... MANIFESTمدعومًا إلا لجداول Iceberg. ويؤدي تشغيله على أي محرك الجدول آخر إلى إطلاق استثناء. - لا يكون
OPTIMIZE TABLE ... MANIFESTمدعومًا إلا لجداول Iceberg ذات format-version 2. ويؤدي تشغيله على جدول ذي format-version 1 إلى إطلاق استثناء، وكذلك تشغيله على جدول ذي format-version 3، لأن بياناتfirst_row_idالوصفية الخاصة بـ row-lineage في v3 لا تزال غير مدعومة بشكل صحيح عند إعادة كتابة manifest ذهابًا وإيابًا. - لا يكون
OPTIMIZE TABLE ... MANIFESTمدعومًا لجداول Iceberg المشفّرة التي تحتوي ملفات البيانات فيها علىkey_metadataلكل ملف. ولم يُنفَّذ بعد الحفاظ على بيانات التشفير الوصفية هذه عبر إعادة كتابة manifest، لذا تُطلق العبارة استثناءNOT_IMPLEMENTED.
معالجة الجداول ذات الصفوف المحذوفة
يدعم ClickHouse قراءة جداول Iceberg التي تستخدم طرق الحذف التالية:- الحذف بحسب الموضع
- الحذف بحسب المساواة (مدعوم بدءًا من الإصدار 25.8+)
- متجهات الحذف (أُضيفت في v3)
ALTER TABLE ... DELETE وALTER TABLE ... UPDATE لجداول Iceberg ذات إصدار الصيغة 3.
الاستخدام الأساسي
iceberg_timestamp_ms وiceberg_snapshot_id كمعاملَين في الاستعلام نفسه.
اعتبارات مهمة
-
تُنشأ اللقطات عادةً في الحالات التالية:
- عند كتابة بيانات جديدة إلى الجدول
- عند إجراء نوع من دمج البيانات
- لا تؤدي تغييرات المخطط عادةً إلى إنشاء لقطات - وهذا يترتب عليه سلوكيات مهمة عند استخدام السفر عبر الزمن مع الجداول التي خضعت لتطور المخطط.
سيناريوهات نموذجية
تستخدم هذه السيناريوهات Spark لتوضيح تغييرات المخطط التي يجريها كاتب Iceberg خارجي.السيناريو 1: تغييرات المخطط دون لقطات جديدة
ضع في اعتبارك تسلسل العمليات التالي:- عند ts1 وts2: لا يظهر سوى العمودين الأصليين
- عند ts3: تظهر الأعمدة الثلاثة كلها، وتكون قيمة السعر في الصف الأول NULL
السيناريو 2: الاختلافات بين المخطط التاريخي والمخطط الحالي
قد يُظهر استعلام السفر عبر الزمن في اللحظة الحالية مخططًا يختلف عن مخطط الجدول الحالي:ALTER TABLE لا يُنشئ لقطة جديدة، لكن بالنسبة إلى الجدول الحالي، يأخذ Spark قيمة schema_id من أحدث ملف البيانات الوصفية، وليس من لقطة.
السيناريو 3: الاختلافات بين المخطط التاريخي والمخططط الحالي
أما الحالة الثانية فهي أنه عند استخدام السفر عبر الزمن، لا يمكنك الوصول إلى حالة الجدول قبل كتابة أي بيانات فيه:تحديد موقع ملف metadata
عند استخدام محرك الجدولIceberg في ClickHouse، يحتاج النظام إلى تحديد موقع ملف metadata.json الصحيح الذي يصف بنية جدول Iceberg. وتعمل عملية التحديد هذه على النحو التالي:
البحث عن الملفات المرشحة
- تحديد المسار مباشرةً:
- إذا قمت بتعيين
iceberg_metadata_file_path، فسيستخدم النظام هذا المسار كما هو بدمجه مع مسار دليل جدول Iceberg. - عند توفير هذا الإعداد، يتم تجاهل جميع إعدادات الاستدلال الأخرى.
- مطابقة 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 ودالة الجدول التخزين المؤقت للبيانات، تمامًا مثل أنظمة التخزين S3 وAzureBlobStorage وHDFS. راجع هنا.
ذاكرة التخزين المؤقت للبيانات الوصفية
يدعم كلٌّ من محرك الجدول ودالة الجدولIceberg ذاكرةً مؤقتة للبيانات الوصفية تخزّن معلومات ملفات البيان وقائمة البيان وملف JSON للبيانات الوصفية. تُخزَّن هذه الذاكرة المؤقتة في الذاكرة. ويجري التحكّم في هذه الميزة عبر الإعداد use_iceberg_metadata_files_cache، وهو مفعّل افتراضيًا.
الجلب المسبق غير المتزامن للبيانات الوصفية
يمكن تمكين الجلب المسبق غير المتزامن للبيانات الوصفية عند إنشاء جدولIceberg من خلال ضبط iceberg_metadata_async_prefetch_period_ms. إذا ضُبطت هذه القيمة على 0 (الافتراضي)، أو إذا لم تكن ذاكرة التخزين المؤقت للبيانات الوصفية مُمكّنة، فسيُعطَّل الجلب المسبق غير المتزامن.
ولتمكين هذه الميزة، يجب تحديد قيمة غير صفرية بالميلي ثانية. وتمثل هذه القيمة الفاصل الزمني بين دورات الجلب المسبق.
إذا كانت هذه الميزة مُمكّنة، فسيشغّل الخادم عملية دورية في الخلفية لعرض الكتالوج البعيد واكتشاف إصدار جديد من البيانات الوصفية. ثم سيُحلّلها ويجتاز اللقطة بشكل تكراري، جالبًا ملفات manifest list النشطة وملفات manifest.
أما الملفات المتوفرة بالفعل في ذاكرة التخزين المؤقت للبيانات الوصفية، فلن يُعاد تنزيلها. وفي نهاية كل دورة جلب مسبق، تصبح أحدث لقطة للبيانات الوصفية متاحة في ذاكرة التخزين المؤقت للبيانات الوصفية.
iceberg_metadata_staleness_ms كمعلمة على مستوى الاستعلام أو الجلسة. افتراضيًا (0 - غير محددة)، وفي سياق كل استعلام، سيجلب الخادم أحدث البيانات الوصفية من الكتالوج البعيد.
ومن خلال تحديد مقدار التحمّل لتقادم البيانات الوصفية، يُسمح للخادم باستخدام النسخة المخزنة مؤقتًا من لقطة البيانات الوصفية من دون استدعاء الكتالوج البعيد. إذا توفرت نسخة من البيانات الوصفية في الذاكرة المؤقتة، وكانت قد نُزِّلت ضمن نافذة التقادم المحددة، فستُستخدم لمعالجة الاستعلام.
وإلا فسيتم جلب أحدث نسخة من الكتالوج البعيد.
ICEBERG_SCEDULE_POOL، وهي مجموعة مؤشرات ترابط على مستوى الخادم لعمليات الخلفية على جداول Iceberg النشطة. ويُتحكَّم في حجم مجموعة مؤشرات الترابط هذه بواسطة معلمة إعداد الخادم iceberg_background_schedule_pool_size (القيمة الافتراضية هي 10).
ملاحظة: التوقع الحالي هو أن يكون حجم ذاكرة التخزين المؤقت للبيانات الوصفية كافيًا للاحتفاظ بالكامل بأحدث لقطة للبيانات الوصفية لجميع الجداول النشطة، إذا كان الجلب المسبق غير المتزامن مُمكّنًا.