> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> يوفّر هذا المحرك تكاملًا مع النظام البيئي لـ Apache Hadoop، إذ يتيح إدارة البيانات على HDFS عبر ClickHouse. يشبه هذا المحرك محركَي File وURL، لكنه يوفّر ميزات خاصة بـ Hadoop.

# محرك الجدول HDFS

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            غير مدعوم في ClickHouse Cloud
        </div>;
};

يوفّر هذا المحرّك تكاملًا مع منظومة [Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) من خلال إتاحة إدارة البيانات على [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) عبر ClickHouse. يشبه هذا المحرّك محرّكي [File](/ar/reference/engines/table-engines/special/file) و[URL](/ar/reference/engines/table-engines/special/url)، لكنه يوفّر ميزات خاصة بـ Hadoop.

هذه الميزة غير مدعومة من مهندسي ClickHouse، ومن المعروف أن جودتها متواضعة إلى حدٍّ ما. إذا واجهت أي مشكلات، فأصلحها بنفسك وقدّم طلب pull request.

<div id="usage">
  ## الاستخدام
</div>

```sql theme={null}
ENGINE = HDFS(URI, format)
```

**معلمات المحرك**

* `URI` - معرّف URI الكامل للملف في HDFS. قد يحتوي جزء `path` من `URI` على أنماط glob. في هذه الحالة سيكون الجدول للقراءة فقط.
* `format` - يحدّد أحد تنسيقات الملفات المتاحة. لتنفيذ استعلامات
  `SELECT`، يجب أن يكون التنسيق مدعومًا للإدخال، ولتنفيذ استعلامات
  `INSERT` — يجب أن يكون مدعومًا للإخراج. التنسيقات المتاحة مُدرجة في قسم
  [التنسيقات](/ar/reference/formats/index#formats-overview).
* \[PARTITION BY expr]

<div id="partition-by">
  ### PARTITION BY
</div>

`PARTITION BY` — اختياري. في معظم الحالات، لن تحتاج إلى مفتاح تقسيم، وحتى إذا احتجت إليه، فلن تحتاج عادةً إلى مفتاح تقسيم أكثر تفصيلاً من التقسيم الشهري. لا يؤدي التقسيم إلى تسريع الاستعلامات (على عكس تعبير ORDER BY). ويجب ألا تستخدم تقسيمًا مفرط التفصيل إطلاقًا. لا تقسّم بياناتك حسب معرّفات العملاء أو أسمائهم (واجعل بدلًا من ذلك معرّف العميل أو اسمه هو العمود الأول في تعبير ORDER BY).

للتقسيم حسب الشهر، استخدم التعبير `toYYYYMM(date_column)`، حيث إن `date_column` عمود يحتوي على تاريخ من النوع [Date](/ar/reference/data-types/date). تكون أسماء الأقسام هنا بالتنسيق `"YYYYMM"`.

**مثال:**

**1.** أعدّ الجدول `hdfs_engine_table`:

```sql theme={null}
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
```

**2.** املأ الملف:

```sql theme={null}
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
```

**3.** نفِّذ استعلامًا على البيانات:

```sql theme={null}
SELECT * FROM hdfs_engine_table LIMIT 2
```

```text theme={null}
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘
```

<div id="implementation-details">
  ## تفاصيل التنفيذ
</div>

* يمكن تنفيذ عمليتَي القراءة والكتابة بالتوازي.
* غير مدعوم:
  * عمليتا `ALTER` و`SELECT...SAMPLE`.
  * الفهارس.
  * يمكن استخدام [النسخ المتماثل بدون نسخ](/ar/concepts/features/configuration/server-config/storing-data#zero-copy)، لكنه غير موصى به.

<Info>
  **النسخ المتماثل بدون نسخ غير جاهز لبيئات الإنتاج**

  يكون النسخ المتماثل بدون نسخ معطّلًا افتراضيًا في ClickHouse الإصدار 22.8 وما بعده. هذه الميزة غير موصى بها للاستخدام في بيئات الإنتاج.
</Info>

**أنماط glob في المسار**

يمكن أن يحتوي أكثر من مكوّن في المسار على أنماط glob. ولكي تتم معالجة الملف، يجب أن يكون موجودًا وأن يطابق نمط المسار بالكامل. ويُحدَّد سرد الملفات أثناء `SELECT` (وليس عند تنفيذ `CREATE`).

* `*` — يستبدل أي عدد من المحارف باستثناء `/`، بما في ذلك السلسلة الفارغة.
* `?` — يستبدل أي محرف واحد.
* `{some_string,another_string,yet_another_one}` — يستبدل أيًّا من السلاسل `'some_string', 'another_string', 'yet_another_one'`.
* `{N..M}` — يستبدل أي رقم في النطاق من N إلى M، شاملًا الحدّين.

التركيبات التي تحتوي على `{}` مشابهة للدالة الجدولية [remote](/ar/reference/functions/table-functions/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. توجد عدة طرق لإنشاء جدول يتكوّن من الملفات الستة جميعًا:

```sql theme={null}
CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')
```

طريقة أخرى:

```sql theme={null}
CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')
```

يتألف الجدول من جميع الملفات في كلا الدليلين (يجب أن تستوفي جميع الملفات التنسيق والمخطط المحددين في الاستعلام):

```sql theme={null}
CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')
```

<Note>
  إذا كانت قائمة الملفات تتضمن نطاقات رقمية تبدأ بأصفار، فاستخدم الصيغة التي تعتمد على الأقواس المعقوفة لكل رقم على حدة، أو استخدم `?`.
</Note>

**مثال**

أنشئ جدولًا بملفات تحمل الأسماء `file000` و`file001` و... و`file999`:

```sql theme={null}
CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV')
```

<div id="configuration">
  ## الإعداد
</div>

على غرار GraphiteMergeTree، يدعم محرك HDFS الإعدادات الموسَّعة باستخدام ملف إعداد ClickHouse. هناك مفتاحا إعداد يمكنك استخدامهما: مفتاح عام (`hdfs`) وآخر على مستوى المستخدم (`hdfs_*`). يُطبَّق الإعداد العام أولًا، ثم يُطبَّق الإعداد على مستوى المستخدم (إن وُجد).

```xml theme={null}
<!-- 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>
```

<div id="configuration-options">
  ### خيارات الإعداد
</div>

<div id="supported-by-libhdfs3">
  #### المعلمات التي يدعمها libhdfs3
</div>

| **المعلمة**                                           | **القيمة الافتراضية**    |
| ----------------------------------------------------- | ------------------------ |
| 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](https://hawq.apache.org/docs/userguide/2.3.0.0-incubating/reference/HDFSConfigurationParameterReference.html) بعض هذه المعلمات.

<div id="clickhouse-extras">
  #### إضافات ClickHouse
</div>

| **معلمة**                   | **القيمة الافتراضية** |
| --------------------------- | --------------------- |
| hadoop\_kerberos\_keytab    | ""                    |
| hadoop\_kerberos\_principal | ""                    |
| libhdfs3\_conf              | ""                    |

<div id="limitations">
  ### القيود
</div>

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

<div id="kerberos-support">
  ## دعم Kerberos
</div>

إذا كانت قيمة المعلَمة `hadoop_security_authentication` هي `kerberos`، فسيجري ClickHouse المصادقة عبر Kerberos.
يمكن العثور على المعلَمات [هنا](#clickhouse-extras)، وقد يكون `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` إلزاميًا.

<div id="namenode-ha">
  ## دعم الإتاحة العالية لـ HDFS Namenode
</div>

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

* انسخ `hdfs-site.xml` من إحدى عقد HDFS إلى `/etc/clickhouse-server/`.
* أضف المقطع التالي إلى ملف إعداد ClickHouse:

```xml theme={null}
  <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/`.

<div id="virtual-columns">
  ## الأعمدة الافتراضية
</div>

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

<div id="storage-settings">
  ## إعدادات التخزين
</div>

* [hdfs\_truncate\_on\_insert](/ar/reference/settings/session-settings#hdfs_truncate_on_insert) - يسمح بتفريغ الملف قبل الإدراج فيه. يكون معطّلًا افتراضيًا.
* [hdfs\_create\_new\_file\_on\_insert](/ar/reference/settings/session-settings#hdfs_create_new_file_on_insert) - يسمح بإنشاء ملف جديد عند كل عملية إدراج إذا كان للتنسيق لاحقة. يكون معطّلًا افتراضيًا.
* [hdfs\_skip\_empty\_files](/ar/reference/settings/session-settings#hdfs_skip_empty_files) - يسمح بتجاوز الملفات الفارغة أثناء القراءة. يكون معطّلًا افتراضيًا.

**انظر أيضًا**

* [الأعمدة الافتراضية](/ar/reference/engines/table-engines/index#table_engines-virtual_columns)
