الانتقال إلى المحتوى الرئيسي
يوفّر هذا المحرّك تكاملًا مع منظومة Apache Hadoop من خلال إتاحة إدارة البيانات على HDFS عبر ClickHouse. يشبه هذا المحرّك محرّكي File وURL، لكنه يوفّر ميزات خاصة بـ Hadoop. هذه الميزة غير مدعومة من مهندسي ClickHouse، ومن المعروف أن جودتها متواضعة إلى حدٍّ ما. إذا واجهت أي مشكلات، فأصلحها بنفسك وقدّم طلب pull request.

الاستخدام

ENGINE = HDFS(URI, format)
معلمات المحرك
  • URI - معرّف URI الكامل للملف في HDFS. قد يحتوي جزء path من URI على أنماط glob. في هذه الحالة سيكون الجدول للقراءة فقط.
  • format - يحدّد أحد تنسيقات الملفات المتاحة. لتنفيذ استعلامات SELECT، يجب أن يكون التنسيق مدعومًا للإدخال، ولتنفيذ استعلامات INSERT — يجب أن يكون مدعومًا للإخراج. التنسيقات المتاحة مُدرجة في قسم التنسيقات.
  • [PARTITION BY expr]

PARTITION BY

PARTITION BY — اختياري. في معظم الحالات، لن تحتاج إلى مفتاح تقسيم، وحتى إذا احتجت إليه، فلن تحتاج عادةً إلى مفتاح تقسيم أكثر تفصيلاً من التقسيم الشهري. لا يؤدي التقسيم إلى تسريع الاستعلامات (على عكس تعبير ORDER BY). ويجب ألا تستخدم تقسيمًا مفرط التفصيل إطلاقًا. لا تقسّم بياناتك حسب معرّفات العملاء أو أسمائهم (واجعل بدلًا من ذلك معرّف العميل أو اسمه هو العمود الأول في تعبير ORDER BY). للتقسيم حسب الشهر، استخدم التعبير toYYYYMM(date_column)، حيث إن date_column عمود يحتوي على تاريخ من النوع Date. تكون أسماء الأقسام هنا بالتنسيق "YYYYMM". مثال: 1. أعدّ الجدول hdfs_engine_table:
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
2. املأ الملف:
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
3. نفِّذ استعلامًا على البيانات:
SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

تفاصيل التنفيذ

  • يمكن تنفيذ عمليتَي القراءة والكتابة بالتوازي.
  • غير مدعوم:
النسخ المتماثل بدون نسخ غير جاهز لبيئات الإنتاجيكون النسخ المتماثل بدون نسخ معطّلًا افتراضيًا في ClickHouse الإصدار 22.8 وما بعده. هذه الميزة غير موصى بها للاستخدام في بيئات الإنتاج.
أنماط glob في المسار يمكن أن يحتوي أكثر من مكوّن في المسار على أنماط glob. ولكي تتم معالجة الملف، يجب أن يكون موجودًا وأن يطابق نمط المسار بالكامل. ويُحدَّد سرد الملفات أثناء SELECT (وليس عند تنفيذ CREATE).
  • * — يستبدل أي عدد من المحارف باستثناء /، بما في ذلك السلسلة الفارغة.
  • ? — يستبدل أي محرف واحد.
  • {some_string,another_string,yet_another_one} — يستبدل أيًّا من السلاسل 'some_string', 'another_string', 'yet_another_one'.
  • {N..M} — يستبدل أي رقم في النطاق من N إلى M، شاملًا الحدّين.
التركيبات التي تحتوي على {} مشابهة للدالة الجدولية remote. مثال
  1. لنفترض أن لدينا عدة ملفات بتنسيق TSV مع معرّفات URI التالية على HDFS:
    • ‘hdfs://hdfs1:9000/some_dir/some_file_1’
    • ‘hdfs://hdfs1:9000/some_dir/some_file_2’
    • ‘hdfs://hdfs1:9000/some_dir/some_file_3’
    • ‘hdfs://hdfs1:9000/another_dir/some_file_1’
    • ‘hdfs://hdfs1:9000/another_dir/some_file_2’
    • ‘hdfs://hdfs1:9000/another_dir/some_file_3’
  2. توجد عدة طرق لإنشاء جدول يتكوّن من الملفات الستة جميعًا:
CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')
طريقة أخرى:
CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')
يتألف الجدول من جميع الملفات في كلا الدليلين (يجب أن تستوفي جميع الملفات التنسيق والمخطط المحددين في الاستعلام):
CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')
إذا كانت قائمة الملفات تتضمن نطاقات رقمية تبدأ بأصفار، فاستخدم الصيغة التي تعتمد على الأقواس المعقوفة لكل رقم على حدة، أو استخدم ?.
مثال أنشئ جدولًا بملفات تحمل الأسماء file000 وfile001 و… وfile999:
CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV')

الإعداد

على غرار GraphiteMergeTree، يدعم محرك HDFS الإعدادات الموسَّعة باستخدام ملف إعداد ClickHouse. هناك مفتاحا إعداد يمكنك استخدامهما: مفتاح عام (hdfs) وآخر على مستوى المستخدم (hdfs_*). يُطبَّق الإعداد العام أولًا، ثم يُطبَّق الإعداد على مستوى المستخدم (إن وُجد).
<!-- Global configuration options for HDFS engine type -->
<hdfs>
  <hadoop_kerberos_keytab>/tmp/keytab/clickhouse.keytab</hadoop_kerberos_keytab>
  <hadoop_kerberos_principal>clickuser@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
  <hadoop_security_authentication>kerberos</hadoop_security_authentication>
</hdfs>

<!-- Configuration specific for user "root" -->
<hdfs_root>
  <hadoop_kerberos_principal>root@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
</hdfs_root>

خيارات الإعداد

المعلمات التي يدعمها libhdfs3

المعلمةالقيمة الافتراضية
rpc_client_connect_tcpnodelaytrue
dfs_client_read_shortcircuittrue
output_replace-datanode-on-failuretrue
input_notretry-another-nodefalse
input_localread_mappedfiletrue
dfs_client_use_legacy_blockreader_localfalse
rpc_client_ping_interval10 * 1000
rpc_client_connect_timeout600 * 1000
rpc_client_read_timeout3600 * 1000
rpc_client_write_timeout3600 * 1000
rpc_client_socket_linger_timeout-1
rpc_client_connect_retry10
rpc_client_timeout3600 * 1000
dfs_default_replica3
input_connect_timeout600 * 1000
input_read_timeout3600 * 1000
input_write_timeout3600 * 1000
input_localread_default_buffersize1 * 1024 * 1024
dfs_prefetchsize10
input_read_getblockinfo_retry3
input_localread_blockinfo_cachesize1000
input_read_max_retry60
output_default_chunksize512
output_default_packetsize64 * 1024
output_default_write_retry10
output_connect_timeout600 * 1000
output_read_timeout3600 * 1000
output_write_timeout3600 * 1000
output_close_timeout3600 * 1000
output_packetpool_size1024
output_heartbeat_interval10 * 1000
dfs_client_failover_max_attempts15
dfs_client_read_shortcircuit_streams_cache_size256
dfs_client_socketcache_expiryMsec3000
dfs_client_socketcache_capacity16
dfs_default_blocksize64 * 1024 * 1024
dfs_default_uri”hdfs://localhost:9000”
hadoop_security_authentication”simple”
hadoop_security_kerberos_ticket_cache_path""
dfs_client_log_severity”INFO”
dfs_domain_socket_path""
قد يوضّح مرجع إعدادات HDFS بعض هذه المعلمات.

إضافات ClickHouse

معلمةالقيمة الافتراضية
hadoop_kerberos_keytab""
hadoop_kerberos_principal""
libhdfs3_conf""

القيود

  • لا يمكن أن يكون hadoop_security_kerberos_ticket_cache_path و libhdfs3_conf إلا على المستوى العام، وليس على مستوى المستخدم

دعم Kerberos

إذا كانت قيمة المعلَمة hadoop_security_authentication هي kerberos، فسيجري ClickHouse المصادقة عبر Kerberos. يمكن العثور على المعلَمات هنا، وقد يكون hadoop_security_kerberos_ticket_cache_path مفيدًا. لاحظ أنه بسبب قيود libhdfs3، لا يُدعَم سوى الأسلوب القديم، كما أن اتصالات datanode غير مؤمّنة بواسطة SASL (ويُعد HADOOP_SECURE_DN_USER مؤشرًا موثوقًا على هذا النهج الأمني). استخدم tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.sh كمرجع. إذا جرى تحديد hadoop_kerberos_keytab أو hadoop_kerberos_principal أو hadoop_security_kerberos_ticket_cache_path، فستُستخدم مصادقة Kerberos. وفي هذه الحالة، يكون كلٌّ من hadoop_kerberos_keytab وhadoop_kerberos_principal إلزاميًا.

دعم الإتاحة العالية لـ HDFS Namenode

يدعم libhdfs3 الإتاحة العالية لـ Namenode في HDFS.
  • انسخ hdfs-site.xml من إحدى عقد HDFS إلى /etc/clickhouse-server/.
  • أضف المقطع التالي إلى ملف إعداد ClickHouse:
  <hdfs>
    <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
  </hdfs>
  • ثم استخدم قيمة الوسم dfs.nameservices في ملف hdfs-site.xml كعنوان namenode في URI الخاص بـ HDFS. على سبيل المثال، استبدل hdfs://appadmin@192.168.101.11:8020/abc/ بـ hdfs://appadmin@my_nameservice/abc/.

الأعمدة الافتراضية

  • _path — مسار الملف. النوع: LowCardinality(String).
  • _file — اسم الملف. النوع: LowCardinality(String).
  • _size — حجم الملف بالبايت. النوع: Nullable(UInt64). إذا كان الحجم غير معروف، تكون القيمة NULL.
  • _time — وقت آخر تعديل للملف. النوع: Nullable(DateTime). إذا كان الوقت غير معروف، تكون القيمة NULL.

إعدادات التخزين

  • hdfs_truncate_on_insert - يسمح بتفريغ الملف قبل الإدراج فيه. يكون معطّلًا افتراضيًا.
  • hdfs_create_new_file_on_insert - يسمح بإنشاء ملف جديد عند كل عملية إدراج إذا كان للتنسيق لاحقة. يكون معطّلًا افتراضيًا.
  • hdfs_skip_empty_files - يسمح بتجاوز الملفات الفارغة أثناء القراءة. يكون معطّلًا افتراضيًا.
انظر أيضًا
آخر تعديل في ٢٩ يونيو ٢٠٢٦