يوفّر هذا المحرّك تكاملًا مع منظومة 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 │
└──────┴───────┘تفاصيل التنفيذ
- يمكن تنفيذ عمليتَي القراءة والكتابة بالتوازي.
- غير مدعوم:
- عمليتا
ALTERوSELECT...SAMPLE. - الفهارس.
- يمكن استخدام النسخ المتماثل بدون نسخ، لكنه غير موصى به.
- عمليتا
أنماط glob في المسار
يمكن أن يحتوي أكثر من مكوّن في المسار على أنماط glob. ولكي تتم معالجة الملف، يجب أن يكون موجودًا وأن يطابق نمط المسار بالكامل. ويُحدَّد سرد الملفات أثناء SELECT (وليس عند تنفيذ CREATE).
*— يستبدل أي عدد من المحارف باستثناء/، بما في ذلك السلسلة الفارغة.?— يستبدل أي محرف واحد.{some_string,another_string,yet_another_one}— يستبدل أيًّا من السلاسل'some_string', 'another_string', 'yet_another_one'.{N..M}— يستبدل أي رقم في النطاق من N إلى M، شاملًا الحدّين.
التركيبات التي تحتوي على {} مشابهة للدالة الجدولية remote.
مثال
-
لنفترض أن لدينا عدة ملفات بتنسيق 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'
-
توجد عدة طرق لإنشاء جدول يتكوّن من الملفات الستة جميعًا:
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 - يسمح بتجاوز الملفات الفارغة أثناء القراءة. يكون معطّلًا افتراضيًا.
انظر أيضًا