Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

محرك الجدول HDFS

غير مدعوم في ClickHouse Cloud

يوفّر هذا المحرّك تكاملًا مع منظومة 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 │
└──────┴───────┘

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

  • يمكن تنفيذ عمليتَي القراءة والكتابة بالتوازي.
  • غير مدعوم:

أنماط 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_tcpnodelay true
dfs_client_read_shortcircuit true
output_replace-datanode-on-failure true
input_notretry-another-node false
input_localread_mappedfile true
dfs_client_use_legacy_blockreader_local false
rpc_client_ping_interval 10 * 1000
rpc_client_connect_timeout 600 * 1000
rpc_client_read_timeout 3600 * 1000
rpc_client_write_timeout 3600 * 1000
rpc_client_socket_linger_timeout -1
rpc_client_connect_retry 10
rpc_client_timeout 3600 * 1000
dfs_default_replica 3
input_connect_timeout 600 * 1000
input_read_timeout 3600 * 1000
input_write_timeout 3600 * 1000
input_localread_default_buffersize 1 * 1024 * 1024
dfs_prefetchsize 10
input_read_getblockinfo_retry 3
input_localread_blockinfo_cachesize 1000
input_read_max_retry 60
output_default_chunksize 512
output_default_packetsize 64 * 1024
output_default_write_retry 10
output_connect_timeout 600 * 1000
output_read_timeout 3600 * 1000
output_write_timeout 3600 * 1000
output_close_timeout 3600 * 1000
output_packetpool_size 1024
output_heartbeat_interval 10 * 1000
dfs_client_failover_max_attempts 15
dfs_client_read_shortcircuit_streams_cache_size 256
dfs_client_socketcache_expiryMsec 3000
dfs_client_socketcache_capacity 16
dfs_default_blocksize 64 * 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.
  • _etag — علامة ETag للملف. النوع: LowCardinality(String). لا يوفّر HDFS علامة ETag أصلية، لذا تُولَّد القيمة من وقت تعديل الملف وحجمه بالتنسيق <mtime_seconds>_<size>. ولأن libhdfs3 لا يوفّر وقت التعديل إلا بدقة ثانية واحدة، فإن إعادة كتابة الملف خلال الثانية نفسها مع الحفاظ على الحجم نفسه تؤدي إلى القيمة نفسها؛ لذلك لا تُستخدم علامة ETag المُولَّدة هذه كمفتاح لذاكرة التخزين المؤقت للمحتوى.

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

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

انظر أيضًا

Navigation