Skip to main content
يستفيد هذا الموصل من تحسينات خاصة بـ ClickHouse، مثل التقسيم المتقدم ودفع شروط التصفية، بهدف تحسين أداء الاستعلامات ومعالجة البيانات. ويعتمد هذا الموصل على موصل JDBC الرسمي لـ ClickHouse، كما يدير الكتالوج الخاص به. قبل Spark 3.0، لم يكن Spark يوفّر مفهوم كتالوج مضمّن، لذلك كان المستخدمون يعتمدون عادةً على أنظمة كتالوج خارجية مثل Hive Metastore أو AWS Glue. ومع هذه الحلول الخارجية، كان على المستخدمين تسجيل جداول مصدر البيانات الخاصة بهم يدويًا قبل أن يتمكنوا من الوصول إليها في Spark. لكن منذ أن قدّم Spark 3.0 مفهوم الكتالوج، أصبح بإمكان Spark الآن اكتشاف الجداول تلقائيًا من خلال تسجيل إضافات الكتالوج. الكتالوج الافتراضي في Spark هو spark_catalog، وتُعرَّف الجداول بالشكل {catalog name}.{database}.{table}. ومع ميزة الكتالوج الجديدة، أصبح من الممكن الآن إضافة عدة كتالوجات والعمل بها ضمن تطبيق Spark واحد.

المفاضلة بين Catalog API وTableProvider API

يدعم موصل ClickHouse Spark نمطين للوصول: Catalog API وTableProvider API (الوصول المستند إلى التنسيق). ويساعدك فهم الفروق بينهما على اختيار النهج الأنسب لحالة الاستخدام الخاصة بك.

Catalog API مقابل TableProvider API

المتطلبات

  • Java 8 أو 17 (يتطلب Spark 4.0 ‏Java 17 أو أحدث)
  • Scala 2.12 أو 2.13 (يدعم Spark 4.0 ‏Scala 2.13 فقط)
  • Apache Spark 3.3 أو 3.4 أو 3.5 أو 4.0

مصفوفة التوافق

التثبيت والإعداد

لدمج ClickHouse مع Spark، تتوفر عدة خيارات للتثبيت تناسب إعدادات المشاريع المختلفة. يمكنك إضافة موصل ClickHouse Spark كتبعية مباشرةً في ملف البناء الخاص بمشروعك (مثل pom.xml في Maven أو build.sbt في SBT). وبدلاً من ذلك، يمكنك وضع ملفات JAR المطلوبة في المجلد $SPARK_HOME/jars/، أو تمريرها مباشرةً إلى Spark باستخدام الخيار --jars في الأمر spark-submit. ويضمن كلا النهجين توفّر موصل ClickHouse في بيئة Spark لديك.

الاستيراد كتبعية

أضف المستودع التالي إذا كنت تريد استخدام إصدار SNAPSHOT.

نزّل المكتبة

نمط تسمية ملف JAR التنفيذي هو:
يمكنك العثور على جميع ملفات JAR المتاحة للإصدارات المنشورة في Maven Central Repository وجميع ملفات JAR اليومية من نوع SNAPSHOT في Sonatype OSS Snapshots Repository.
من الضروري تضمين clickhouse-jdbc JAR مع المُصنِّف “all”، لأن الموصل يعتمد على clickhouse-http وclickhouse-client، وكلاهما مضمَّن في clickhouse-jdbc:all. وبدلًا من ذلك، يمكنك إضافة clickhouse-client JAR وclickhouse-http كلٌّ على حدة إذا كنت تفضّل عدم استخدام حزمة JDBC الكاملة.في جميع الأحوال، تأكد من توافق إصدارات الحزم وفقًا لـ Compatibility Matrix.

سجّل الكتالوج (مطلوب)

للوصول إلى جداول ClickHouse الخاصة بك، يجب تهيئة كتالوج Spark جديد باستخدام إعدادات config التالية: يمكن ضبط هذه الإعدادات بإحدى الطرق التالية:
  • تعديل/إنشاء spark-defaults.conf.
  • تمرير الإعدادات إلى الأمر spark-submit (أو إلى أوامر CLI ‏spark-shell/spark-sql).
  • إضافة الإعدادات عند تهيئة السياق.
عند العمل مع ClickHouse عنقود، يجب تعيين اسم كتالوج فريد لكل instance. على سبيل المثال:
وبهذه الطريقة، ستتمكن من الوصول إلى جدول clickhouse1.<ck_db>.<ck_table> من Spark SQL باستخدام clickhouse1.<ck_db>.<ck_table>، وإلى جدول clickhouse2.<ck_db>.<ck_table> باستخدام clickhouse2.<ck_db>.<ck_table>.

استخدام واجهة برمجة تطبيقات TableProvider (الوصول المستند إلى التنسيق)

إلى جانب النهج المستند إلى كتالوج، يدعم موصل ClickHouse Spark نمط وصول مستندًا إلى التنسيق عبر واجهة برمجة تطبيقات TableProvider.

مثال على القراءة بأسلوب مستند إلى التنسيق

مثال على الكتابة المستندة إلى التنسيق

ميزات TableProvider API

توفّر TableProvider API عدة ميزات قوية:

الإنشاء التلقائي للجدول

عند الكتابة إلى جدول غير موجود، ينشئ الموصل الجدول تلقائيًا ببنية مناسبة. ويوفر الموصل إعدادات افتراضية ذكية:
  • المحرّك: تكون القيمة الافتراضية MergeTree() إذا لم يتم تحديده. يمكنك تحديد محرّك مختلف باستخدام الخيار engine (مثل ReplacingMergeTree(), SummingMergeTree(), وغيرها)
  • ORDER BY: مطلوب - يجب تحديد الخيار order_by صراحةً عند إنشاء جدول جديد. ويتحقق الموصل من أن جميع الأعمدة المحددة موجودة في البنية.
  • دعم المفاتيح القابلة لـ NULL: يضيف تلقائيًا settings.allow_nullable_key=1 إذا كانت عبارة ORDER BY تحتوي على أعمدة قابلة لـ NULL
ORDER BY مطلوب: الخيار order_by مطلوب عند إنشاء جدول جديد عبر TableProvider API. يجب تحديد الأعمدة التي ستُستخدم في عبارة ORDER BY صراحةً. ويتحقق الموصل من أن جميع الأعمدة المحددة موجودة في البنية، وسيُرجع خطأً إذا كانت أي أعمدة مفقودة.اختيار المحرّك: المحرّك الافتراضي هو MergeTree(), لكن يمكنك تحديد أي محرّك جدول في ClickHouse باستخدام الخيار engine (مثل ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree(), وغيرها).

خيارات اتصال TableProvider

عند استخدام واجهة برمجة التطبيقات المعتمدة على التنسيق، تتوفر خيارات الاتصال التالية:

خيارات الاتصال

خيارات إنشاء الجدول

تُستخدم هذه الخيارات عندما لا يكون الجدول موجودًا ويحتاج إلى إنشائه:
  • الخيار order_by مطلوب عند إنشاء جدول جديد. يجب أن تكون جميع الأعمدة المحددة موجودة في المخطط. ** يُضبط تلقائيًا على 1 إذا كان ORDER BY يحتوي على أعمدة تقبل NULL ولم يُحدَّد هذا الإعداد صراحةً.
أفضل الممارسات: في ClickHouse Cloud، عيّن settings.allow_nullable_key=1 صراحةً إذا كانت أعمدة ORDER BY قد تقبل NULL، لأن ClickHouse Cloud يتطلب هذا الإعداد.

أوضاع الكتابة

يدعم Spark connector (كلًّا من TableProvider API وCatalog API) أوضاع الكتابة التالية في Spark:
  • append: إضافة البيانات إلى جدول موجود
  • overwrite: استبدال جميع البيانات في الجدول (مع تفريغ الجدول)
الاستبدال على مستوى partition غير مدعوم: لا يدعم connector حاليًا عمليات الاستبدال على مستوى partition (مثل استخدام الوضع overwrite مع partitionBy). هذه الميزة قيد التنفيذ. راجع issue #34 على GitHub لمتابعة تقدم هذه الميزة.

تهيئة خيارات ClickHouse

يدعم كلٌّ من Catalog API وTableProvider API تهيئة الخيارات الخاصة بـ ClickHouse (وليس خيارات الموصل). وتُمرَّر هذه الخيارات إلى ClickHouse عند إنشاء الجداول أو تنفيذ الاستعلامات. تتيح لك خيارات ClickHouse ضبط إعدادات خاصة به مثل allow_nullable_key وindex_granularity، بالإضافة إلى إعدادات أخرى على مستوى الجدول أو على مستوى الاستعلام. وهي تختلف عن خيارات الموصل (مثل host وdatabase وtable) التي تتحكم في كيفية اتصال الموصل بـ ClickHouse.

استخدام واجهة TableProvider API

مع واجهة TableProvider API، استخدم تنسيق الخيار settings.<key>:

استخدام Catalog API

باستخدام Catalog API، استخدم الصيغة spark.sql.catalog.<catalog_name>.option.<key> في إعدادات Spark:
أو اضبطها عند إنشاء الجداول باستخدام Spark SQL:

إعدادات ClickHouse Cloud

عند الاتصال بـ ClickHouse Cloud، تأكد من تمكين SSL وضبط وضع SSL المناسب. على سبيل المثال:

قراءة البيانات

كتابة البيانات

استبدال الأقسام غير مدعوم: لا تدعم واجهة برمجة تطبيقات Catalog حاليًا عمليات الاستبدال على مستوى التقسيم (مثل وضع overwrite مع partitionBy). هذه الميزة قيد التطوير حاليًا. راجع مشكلة GitHub رقم 34 لمتابعة هذه الميزة.

عمليات DDL

يمكنك تنفيذ عمليات DDL على مثيل ClickHouse لديك باستخدام Spark SQL، مع حفظ جميع التغييرات فورًا في ClickHouse. يتيح لك Spark SQL كتابة الاستعلامات تمامًا كما تفعل في ClickHouse، لذا يمكنك تنفيذ أوامر مثل CREATE TABLE وTRUNCATE وغيرها مباشرةً، من دون أي تعديل، على سبيل المثال:
عند استخدام Spark SQL، لا يمكن تنفيذ سوى statement واحدة في كل مرة.
توضح الأمثلة أعلاه استعلامات Spark SQL، ويمكنك تشغيلها داخل تطبيقك باستخدام أي واجهة برمجة تطبيقات، مثل Java أو Scala أو PySpark أو shell.

العمل مع VariantType

يتوفر دعم VariantType في Spark 4.0+، ويتطلب ClickHouse 25.3+ مع تمكين نوعَي JSON/Variant التجريبيين.
يدعم الموصل VariantType في Spark للعمل مع البيانات شبه المهيكلة. ويرتبط VariantType بالنوعين JSON وVariant في ClickHouse، ما يتيح لك تخزين البيانات ذات المخطط المرن والاستعلام عنها بكفاءة.
يركّز هذا القسم تحديدًا على ربط VariantType واستخدامه. للحصول على نظرة عامة كاملة على جميع أنواع البيانات المدعومة، راجع قسم أنواع البيانات المدعومة.

تعيين أنواع ClickHouse

قراءة بيانات VariantType

عند القراءة من ClickHouse، تُعيَّن الأعمدة JSON وVariant تلقائيًا إلى VariantType في Spark:

كتابة بيانات من النوع VariantType

يمكنك كتابة بيانات VariantType إلى ClickHouse باستخدام نوعَي الأعمدة JSON أو Variant:

إنشاء جداول من نوع VariantType باستخدام Spark SQL

يمكنك إنشاء جداول من نوع VariantType باستخدام عبارات DDL في Spark SQL:

إعداد أنواع Variant

عند إنشاء جداول تضم أعمدة من نوع VariantType، يمكنك تحديد أنواع ClickHouse التي تريد استخدامها:

نوع JSON (الافتراضي)

إذا لم تُحدَّد الخاصية variant_types، فسيستخدم العمود نوع JSON الافتراضي في ClickHouse، والذي لا يقبل إلا كائنات JSON:
ينشئ هذا استعلام ClickHouse التالي:

نوع Variant مع أنواع متعددة

لدعم الأنواع الأولية والمصفوفات وكائنات JSON، حدِّد الأنواع في الخاصية variant_types:
ينشئ هذا استعلام ClickHouse التالي:

أنواع Variant المدعومة

يمكن استخدام أنواع ClickHouse التالية في Variant():
  • الأنواع الأساسية: String وInt8 وInt16 وInt32 وInt64 وUInt8 وUInt16 وUInt32 وUInt64 وFloat32 وFloat64 وBool
  • المصفوفات: Array(T)، حيث يكون T أي نوع مدعوم، بما في ذلك المصفوفات المتداخلة
  • JSON: JSON لتخزين كائنات JSON

إعداد تنسيق القراءة

بشكل افتراضي، تُقرأ أعمدة JSON وVariant على أنها VariantType. يمكنك تجاوز هذا السلوك وقراءتها كسلاسل نصية:

دعم صيغ الكتابة

يختلف دعم الكتابة لـ VariantType باختلاف الصيغة: اضبط صيغة الكتابة:
إذا احتجت إلى الكتابة إلى نوع Variant في ClickHouse، فاستخدم تنسيق JSON. أما تنسيق Arrow فلا يدعم إلا الكتابة إلى النوع JSON.

أفضل الممارسات

  1. استخدم نوع JSON للبيانات التي تحتوي على JSON فقط: إذا كنت تخزّن كائنات JSON فقط، فاستخدم نوع JSON الافتراضي (من دون الخاصية variant_types)
  2. حدّد الأنواع صراحةً: عند استخدام Variant()، اذكر صراحةً جميع الأنواع التي تنوي تخزينها
  3. فعّل الميزات التجريبية: تأكد من تفعيل allow_experimental_json_type = 1 في ClickHouse
  4. استخدم تنسيق JSON لعمليات الكتابة: يُوصى باستخدام تنسيق JSON لبيانات VariantType لتحقيق توافق أفضل
  5. ضع أنماط الاستعلام في الاعتبار: تدعم أنواع JSON/Variant استعلامات مسار JSON في ClickHouse لتصفية أكثر كفاءة
  6. تلميحات الأعمدة لتحسين الأداء: عند استخدام حقول JSON في ClickHouse، يؤدي إضافة تلميحات الأعمدة إلى تحسين أداء الاستعلامات. لا تتوفر حاليًا إمكانية إضافة تلميحات الأعمدة عبر Spark. راجع GitHub issue #497 لمتابعة هذه الميزة.

مثال: سير عمل متكامل

الإعدادات

فيما يلي الإعدادات القابلة للتعديل المتاحة في الموصّل.
استخدام الإعدادات: هذه خيارات إعداد على مستوى Spark وتنطبق على كلٍّ من واجهة برمجة تطبيقات Catalog وTableProvider API. ويمكن ضبطها بإحدى الطريقتين التاليتين:
  1. إعداد Spark العام (ينطبق على جميع العمليات):
  2. تجاوز على مستوى العملية (في TableProvider API فقط — يمكنه تجاوز الإعدادات العامة):
بدلاً من ذلك، يمكنك ضبطها في spark-defaults.conf أو عند إنشاء جلسة Spark.

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

يوضح هذا القسم كيفية توافق أنواع البيانات بين Spark وClickHouse. وتوفر الجداول أدناه مراجع سريعة لتحويل أنواع البيانات عند قراءتها من ClickHouse إلى Spark، وعند إدراجها من Spark في ClickHouse.

قراءة البيانات من ClickHouse إلى Spark

إدراج البيانات من Spark إلى ClickHouse

المساهمة والدعم

إذا كنت ترغب في المساهمة في المشروع أو الإبلاغ عن أي مشكلات، فنحن نرحب بمشاركتك! زُر مستودع GitHub الخاص بنا لفتح مشكلة، أو اقتراح تحسينات، أو إرسال طلب سحب. نرحب بالمساهمات! يُرجى مراجعة إرشادات المساهمة في المستودع قبل البدء. شكرًا لمساعدتك في تحسين ClickHouse Spark connector الخاص بنا!
آخر تعديل في ٣ يوليو ٢٠٢٦