مثال
إنشاء جدول
معلمات المحرك
path— عنوان URL لـ حاوية مع مسار الملف. يدعم أحرف البدل التالية في وضعreadonly:*,**,?,{abc,def}و{N..M}، حيث إنNوM— أرقام، و'abc'و'def'— سلاسل نصية. لمزيد من المعلومات، راجع أدناه.NOSIGN- إذا جرى توفير هذه الكلمة المفتاحية بدلًا من بيانات الاعتماد، فلن تُوقَّع أي من الطلبات.format— تنسيق الملف.aws_access_key_id,aws_secret_access_key- بيانات اعتماد طويلة الأجل لمستخدم حساب AWS. يمكنك استخدامها لمصادقة طلباتك. هذه المعلمة اختيارية. إذا لم يتم تحديد بيانات الاعتماد، فستُستخدم من ملف التهيئة. لمزيد من المعلومات، راجع استخدام S3 لتخزين البيانات.compression— نوع الضغط. القيم المدعومة:none,gzip/gz,brotli/br,xz/LZMA,zstd/zst. هذه المعلمة اختيارية. افتراضيًا، سيُكتشف نوع الضغط تلقائيًا من امتداد الملف.partition_strategy– الخيارات:WILDCARDأوHIVE. يتطلبWILDCARDوجود{_partition_id}في المسار، ويُستبدل بمفتاح التقسيم. لا يسمحHIVEبأحرف البدل، ويفترض أن المسار هو جذر الجدول، ويُنشئ أدلة تقسيم بنمط Hive مع Snowflake IDs كأسماء ملفات وتنسيق الملف كامتداد. تكون القيمة الافتراضية هي الإعدادfile_like_engine_default_partition_strategy(WILDCARDضمن إعداداتcompatibilityالأقدم من26.6، وHIVEبخلاف ذلك).partition_columns_in_data_file- يُستخدم فقط مع استراتيجية التقسيمHIVE. ويُخبر ClickHouse ما إذا كان ينبغي توقع كتابة أعمدة التقسيم في ملف البيانات. القيمة الافتراضيةfalse.storage_class_name- الخيارات:STANDARDأوINTELLIGENT_TIERING، وتسمح بتحديد AWS S3 Intelligent Tiering.extra_credentials- اختياري. يُستخدم لتمريرrole_arnمن أجل الوصول المستند إلى الأدوار في ClickHouse Cloud. راجع تأمين S3 لمعرفة خطوات الإعداد.
ذاكرة التخزين المؤقت للبيانات
S3 التخزين المؤقت للبيانات على القرص المحلي.
راجع خيارات تهيئة ذاكرة التخزين المؤقت لنظام الملفات وكيفية استخدامها في هذا القسم.
يتم التخزين المؤقت استنادًا إلى المسار وETag لكائن التخزين، لذلك لن يقرأ ClickHouse إصدارًا قديماً من ذاكرة التخزين المؤقت.
لتمكين التخزين المؤقت، استخدم الإعداد filesystem_cache_name = '<name>' وenable_filesystem_cache = 1.
- أضف القسم التالي إلى ملف تهيئة ClickHouse:
- أعد استخدام إعدادات cache (وبالتالي مساحة تخزين cache) من قسم
storage_configurationفي ClickHouse، كما هو موضّح هنا
PARTITION BY
PARTITION BY — اختياري. في معظم الحالات، لا تحتاج إلى مفتاح تقسيم، وحتى إذا احتجت إليه، فعادةً لا تحتاج إلى مفتاح تقسيم أكثر دقة من التقسيم حسب الشهر. لا يؤدي التقسيم إلى تسريع الاستعلامات (على عكس تعبير ORDER BY). يجب ألّا تستخدم تقسيمًا مفرط الدقة إطلاقًا. لا تقسّم بياناتك حسب معرّفات العملاء أو أسمائهم (وبدلًا من ذلك، اجعل معرّف العميل أو اسمه هو العمود الأول في تعبير ORDER BY).
للتقسيم حسب الشهر، استخدم التعبير toYYYYMM(date_column)، حيث إن date_column هو عمود يحتوي على تاريخ من النوع Date. تكون أسماء الأقسام هنا بالتنسيق "YYYYMM".
استراتيجية التقسيم
WILDCARD: يستبدل الرمز البديل {_partition_id} في مسار الملف بمفتاح التقسيم الفعلي. القراءة غير مدعومة. يُحدَّد افتراضيًا فقط ضمن إعدادات compatibility الأقدم من 26.6؛ وإلا تكون القيمة الافتراضية هي HIVE (راجع الإعداد file_like_engine_default_partition_strategy).
يطبّق HIVE التقسيم بنمط Hive لعمليات القراءة والكتابة. وتُنفَّذ القراءة باستخدام glob pattern تكراري، وهو مكافئ لـ SELECT * FROM s3('table_root/**.parquet').
وتُنشئ الكتابة ملفات بالتنسيق التالي: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>.
ملاحظة: عند استخدام استراتيجية التقسيم HIVE، لا يكون للإعداد use_hive_partitioning أي تأثير.
مثال على استراتيجية التقسيم HIVE:
الاستعلام عن البيانات المُقسَّمة إلى أقسام
ENGINE يستخدم رمز المعلمة {_partition_id} كجزء من كائن S3 (اسم الملف)، وأن استعلامات SELECT تُنفَّذ على أسماء الكائنات الناتجة تلك (مثل test_3.csv).
كما هو موضح في المثال، فإن الاستعلام من جداول S3 المُقسَّمة إلى أقسام
غير مدعوم مباشرةً في الوقت الحالي، لكن يمكن تحقيق ذلك عبر الاستعلام عن الأقسام الفردية
باستخدام S3 table function.تتمثل حالة الاستخدام الأساسية لكتابة
البيانات المُقسَّمة إلى أقسام في S3 في تمكين نقل هذه البيانات إلى نظام
ClickHouse آخر (على سبيل المثال، الانتقال من البيئات المحلية إلى ClickHouse
Cloud). ونظرًا إلى أن مجموعات بيانات ClickHouse تكون غالبًا كبيرة جدًا، وأن
موثوقية الشبكة قد لا تكون مثالية دائمًا، فمن المنطقي نقل مجموعات البيانات
على شكل مجموعات فرعية، ومن هنا تأتي فائدة الكتابة المُقسَّمة إلى أقسام.
إنشاء الجدول
إدراج البيانات
الاستعلام من القسم 3
الاستعلام من التقسيم 1
الاستعلام من القسم 45
قيد
Select * from p، لكن كما ذُكر أعلاه، سيفشل هذا الاستعلام؛ استخدم الاستعلام المذكور سابقًا.
إدراج البيانات
s3_truncate_on_insert وs3_create_new_file_on_insert. راجع مزيدًا من التفاصيل هنا.
الأعمدة الافتراضية
_path— مسار الملف. النوع:LowCardinality(String)._file— اسم الملف. النوع:LowCardinality(String)._size— حجم الملف بالبايت. النوع:Nullable(UInt64). إذا كان الحجم غير معروف، فستكون القيمةNULL._time— وقت آخر تعديل للملف. النوع:Nullable(DateTime). إذا كان الوقت غير معروف، فستكون القيمةNULL._etag— قيمة ETag للملف. النوع:LowCardinality(String). إذا كانت قيمة etag غير معروفة، فستكون القيمةNULL._tags— وسوم الملف. النوع:Map(String, String). إذا لم تكن هناك وسوم، فستكون القيمة خريطة فارغة `’.
تفاصيل التنفيذ
- يمكن إجراء عمليات القراءة والكتابة بالتوازي
- غير مدعوم:
- عمليات
ALTERوSELECT...SAMPLE. - الفهارس.
- يمكن استخدام النسخ المتماثل دون نسخ لكنه غير مدعوم.
- عمليات
النسخ المتماثل دون نسخ غير جاهز لبيئة الإنتاجيكون النسخ المتماثل دون نسخ معطّلًا افتراضيًا في ClickHouse الإصدار 22.8 والإصدارات الأحدث. لا يُنصح باستخدام هذه الميزة في بيئة الإنتاج.
أحرف البدل في المسار
path تحديد عدة ملفات باستخدام أحرف بدل شبيهة بتلك المستخدمة في bash. ولكي يُعالَج الملف، يجب أن يكون موجودًا وأن يطابق نمط المسار بالكامل. ويُحدَّد تعداد الملفات أثناء SELECT (وليس عند CREATE).
*— يستبدل أي عدد من المحارف، باستثناء/، بما في ذلك السلسلة الفارغة.**— يستبدل أي عدد من المحارف، بما في ذلك/، بما في ذلك السلسلة الفارغة.?— يستبدل أي محرف واحد.{some_string,another_string,yet_another_one}— يستبدل أيًّا من السلاسل'some_string', 'another_string', 'yet_another_one'.{N..M}— يستبدل أي عدد ضمن النطاق من N إلى M، شاملًا الحدّين. ويمكن أن تحتوي N وM على أصفار بادئة، مثل000..078.
{} مشابهة لدالة الجدول remote.
إذا كان تعداد الملفات يتضمن نطاقات أرقام بأصفار بادئة، فاستخدم البنية ذات الأقواس المعقوفة لكل رقم على حدة أو استخدم
?.file-000.csv, file-001.csv, … , file-999.csv:
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv'
- حدِّد نطاق لواحق الملفات:
- خذ جميع الملفات التي تبدأ بالبادئة
some_file_(يجب ألا توجد أي ملفات إضافية بهذه البادئة في كلا المجلدين):
- خذ جميع الملفات في كلا المجلدين (يجب أن تستوفي جميع الملفات التنسيق والمخطط الموضحين في الاستعلام):
إعدادات التخزين
- s3_truncate_on_insert - يسمح بتفريغ الملف قبل الإدراج فيه. يكون مُعطّلًا افتراضيًا.
- s3_create_new_file_on_insert - يسمح بإنشاء ملف جديد عند كل عملية إدراج إذا كان التنسيق يتضمن لاحقة. يكون مُعطّلًا افتراضيًا.
- s3_skip_empty_files - يسمح بتخطي الملفات الفارغة أثناء القراءة. يكون مُفعّلًا افتراضيًا.
الإعدادات المتعلقة بـ S3
s3_max_single_part_upload_size— الحد الأقصى لحجم الكائن الذي يمكن رفعه إلى S3 باستخدام رفع أحادي الجزء. القيمة الافتراضية هي32Mb.s3_min_upload_part_size— الحد الأدنى لحجم الجزء المطلوب رفعه أثناء الرفع متعدد الأجزاء إلى S3 Multipart upload. القيمة الافتراضية هي16Mb.s3_max_redirects— الحد الأقصى لعدد قفزات إعادة التوجيه المسموح بها في S3. القيمة الافتراضية هي10.s3_single_read_retries— الحد الأقصى لعدد المحاولات أثناء القراءة الواحدة. القيمة الافتراضية هي4.s3_max_put_rps— الحد الأقصى لمعدل طلبات PUT في الثانية قبل تطبيق تقييد المعدل. القيمة الافتراضية هي0(غير محدود).s3_max_put_burst— الحد الأقصى لعدد الطلبات التي يمكن إصدارها بالتزامن قبل بلوغ حد الطلبات في الثانية. افتراضيًا (عند القيمة0) يساويs3_max_put_rps.s3_max_get_rps— الحد الأقصى لمعدل طلبات GET في الثانية قبل تطبيق تقييد المعدل. القيمة الافتراضية هي0(غير محدود).s3_max_get_burst— الحد الأقصى لعدد الطلبات التي يمكن إصدارها بالتزامن قبل بلوغ حد الطلبات في الثانية. افتراضيًا (عند القيمة0) يساويs3_max_get_rps.s3_upload_part_size_multiply_factor- يُضرَبs3_min_upload_part_sizeفي هذا العامل في كل مرة يتم فيها رفعs3_multiply_parts_count_thresholdجزءًا من عملية كتابة واحدة إلى S3. القيمة الافتراضية هي2.s3_upload_part_size_multiply_parts_count_threshold- في كل مرة يُرفع فيها هذا العدد من الأجزاء إلى S3، يُضرَبs3_min_upload_part_sizeفيs3_upload_part_size_multiply_factor. القيمة الافتراضية هي500.s3_max_inflight_parts_for_one_file- يقيّد عدد طلبات PUT التي يمكن تنفيذها بالتزامن لكائن واحد. ينبغي أن يكون هذا العدد محدودًا. تعني القيمة0عدم وجود حد. القيمة الافتراضية هي20. لكل جزء قيد النقل مخزن مؤقت بحجمs3_min_upload_part_sizeلأولs3_upload_part_size_multiply_factorجزءًا، ويزداد الحجم عندما يكون الملف كبيرًا بما يكفي؛ راجعupload_part_size_multiply_factor. باستخدام الإعدادات الافتراضية، لا يستهلك الملف المرفوع أكثر من320Mbللملف الذي يقل حجمه عن8G. ويزداد الاستهلاك للملفات الأكبر حجمًا.
s3_max_redirects إلى صفر لتجنب هجمات SSRF؛ أو بدلًا من ذلك، يجب تحديد remote_host_filter في إعدادات الخادم.
الإعدادات المستندة إلى endpoint
endpoint— يحدد بادئة الـ endpoint. إلزامي.access_key_idوsecret_access_key— يحددان credentials للاستخدام مع الـ endpoint المحدد. اختياري.use_environment_credentials— إذا كانت القيمةtrue، سيحاول S3 client الحصول على credentials من متغيرات البيئة ومن Amazon EC2 metadata للـ endpoint المحدد. اختياري، والقيمة الافتراضية هيfalse.region— يحدد اسم S3 region. اختياري.use_insecure_imds_request— إذا كانت القيمةtrue، سيستخدم S3 client طلب IMDS غير آمن عند الحصول على credentials من Amazon EC2 metadata. اختياري، والقيمة الافتراضية هيfalse.expiration_window_seconds— فترة سماح للتحقق من انتهاء صلاحية credentials المستندة إلى وقت الانتهاء. اختياري، والقيمة الافتراضية هي120.no_sign_request- تجاهل جميع credentials بحيث لا تُوقَّع الطلبات. مفيد للوصول إلى Public حاويات.header— يضيف HTTP header محدداً إلى الطلبات الموجَّهة للـ endpoint المحدد. اختياري، ويمكن تحديده أكثر من مرة.access_header- يضيف HTTP header محدداً إلى الطلبات الموجَّهة للـ endpoint المحدد، في الحالات التي لا تتوفر فيها credentials أخرى من أي source آخر.server_side_encryption_customer_key_base64— عند تحديده، تُضبط headers المطلوبة للوصول إلى كائنات S3 باستخدام تشفير SSE-C. اختياري.server_side_encryption_kms_key_id- عند تحديده، تُضبط headers المطلوبة للوصول إلى كائنات S3 باستخدام تشفير SSE-KMS. وإذا تم تحديد سلسلة نصية فارغة، سيُستخدم مفتاح S3 المُدار من AWS. اختياري.server_side_encryption_kms_encryption_context- عند تحديده إلى جانبserver_side_encryption_kms_key_id، يُضبط header سياق التشفير المحدد لـ SSE-KMS. اختياري.server_side_encryption_kms_bucket_key_enabled- عند تحديده إلى جانبserver_side_encryption_kms_key_id، يُضبط header تفعيل مفاتيح حاوية S3 لـ SSE-KMS. اختياري، يمكن أن تكون قيمتهtrueأوfalse، ويُعدّ غير محدد افتراضياً (يطابق الإعداد على مستوى الـ حاوية).max_single_read_retries— الحد الأقصى لعدد المحاولات خلال عملية قراءة واحدة. القيمة الافتراضية هي4. اختياري.max_put_rpsوmax_put_burstوmax_get_rpsوmax_get_burst- إعدادات throttling (انظر الوصف أعلاه) لاستخدامها مع endpoint محدد بدلاً من تطبيقها على كل query. اختياري.
العمل مع ملفات الأرشيف
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
url أو في الجزء الذي يلي :: (وهو المسؤول عن اسم الملف داخل الأرشيف).
يدعم ClickHouse ثلاثة تنسيقات للأرشيف:
ZIP
TAR
7Z
وبينما يمكن الوصول إلى أرشيفات ZIP وTAR من أي موقع تخزين مدعوم، فلا يمكن قراءة أرشيفات 7Z إلا من نظام الملفات المحلي المثبّت عليه ClickHouse.
الوصول إلى الحاويات العامة
403.
يمكن تجنب هذه المشكلة باستخدام الكلمة المفتاحية NOSIGN، ما يفرض على العميل تجاهل جميع بيانات الاعتماد وعدم توقيع الطلبات.
تحسين الأداء
s3، راجع دليلنا المفصّل.
التحكم في الوصول المستند إلى الأدوار
roleARN عبر المعلمة extra_credentials:
external_id اختياريًا إلى جانب role_arn. ويُمرَّر بوصفه المعلَمة ExternalId في استدعاء AWS STS AssumeRole، مما يتيح لسياسة الثقة الخاصة بالدور اشتراط سرٍّ مشترك للتخفيف من مشكلة الوكيل المُربَك: