> ## 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.

> Ce moteur assure l’intégration avec l’écosystème Apache Hadoop en permettant de gérer les données sur HDFS via ClickHouse. Il est similaire aux moteurs File et URL, mais offre des fonctionnalités spécifiques à Hadoop.

# Moteur de table 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>
            Non pris en charge par ClickHouse Cloud
        </div>;
};

Ce moteur assure l’intégration avec l’écosystème [Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) en permettant de gérer des données sur [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) via ClickHouse. Il est similaire aux moteurs [File](/fr/reference/engines/table-engines/special/file) et [URL](/fr/reference/engines/table-engines/special/url), mais offre des fonctionnalités propres à Hadoop.

Cette fonctionnalité n’est pas prise en charge par les ingénieurs ClickHouse et sa qualité est réputée incertaine. En cas de problème, corrigez-le vous-même et soumettez une pull request.

<div id="usage">
  ## Utilisation
</div>

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

**Paramètres du moteur**

* `URI` - URI complète du fichier dans HDFS. La partie chemin de `URI` peut contenir des globs. Dans ce cas, la table sera en lecture seule.
* `format` - spécifie l’un des formats de fichier disponibles. Pour exécuter des requêtes `SELECT`,
  le format doit être pris en charge en entrée, et pour exécuter des
  requêtes `INSERT` – en sortie. Les formats disponibles sont répertoriés dans la
  section [Formats](/fr/reference/formats/index#formats-overview).
* \[PARTITION BY expr]

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

`PARTITION BY` — Facultatif. Dans la plupart des cas, vous n’avez pas besoin de clé de partition et, si c’est nécessaire, vous n’avez généralement pas besoin d’une clé de partition plus fine qu’un partitionnement mensuel. Le partitionnement n’accélère pas les requêtes (contrairement à l’expression ORDER BY). N’utilisez jamais un partitionnement trop fin. Ne partitionnez pas vos données par identifiant ou nom de client (faites plutôt de l’identifiant ou du nom du client la première colonne de l’expression ORDER BY).

Pour un partitionnement par mois, utilisez l’expression `toYYYYMM(date_column)`, où `date_column` est une colonne de type [Date](/fr/reference/data-types/date). Les noms de partition sont ici au format `"YYYYMM"`.

**Exemple :**

**1.** Configurez la table `hdfs_engine_table` :

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

**2.** Renseigner le fichier :

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

**3.** Interrogez les données :

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

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

<div id="implementation-details">
  ## Détails d’implémentation
</div>

* Les lectures et les écritures peuvent être parallèles.
* Non pris en charge :
  * les opérations `ALTER` et `SELECT...SAMPLE`.
  * les index.
  * La [réplication zero-copy](/fr/concepts/features/configuration/server-config/storing-data#zero-copy) est possible, mais n’est pas recommandée.

<Info>
  **La réplication zero-copy n’est pas prête pour la production**

  La réplication zero-copy est désactivée par défaut dans ClickHouse 22.8 et les versions ultérieures. Cette fonctionnalité n’est pas recommandée pour une utilisation en production.
</Info>

**Globs dans le chemin**

Plusieurs composants du chemin peuvent contenir des globs. Pour être traité, un fichier doit exister et correspondre à l’intégralité du motif de chemin. La liste des fichiers est établie lors du `SELECT` (et non au moment du `CREATE`).

* `*` — Remplace n’importe quel nombre de caractères, sauf `/`, y compris la chaîne vide.
* `?` — Remplace n’importe quel caractère unique.
* `{some_string,another_string,yet_another_one}` — Remplace l’une des chaînes `'some_string', 'another_string', 'yet_another_one'`.
* `{N..M}` — Remplace n’importe quel nombre dans l’intervalle de N à M, bornes incluses.

Les constructions avec `{}` sont similaires à la fonction de table [remote](/fr/reference/functions/table-functions/remote).

**Exemple**

1. Supposons que nous ayons plusieurs fichiers au format TSV avec les URI suivantes sur 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. Il existe plusieurs façons de créer une table constituée de ces six fichiers :

```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')
```

Autre méthode :

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

La table comprend tous les fichiers des deux répertoires (tous les fichiers doivent respecter le format et le schéma décrits dans la requête) :

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

<Note>
  Si la liste des fichiers contient des plages de nombres avec des zéros non significatifs, utilisez une construction avec des accolades pour chaque chiffre séparément, ou utilisez `?`.
</Note>

**Exemple**

Créer une table avec des fichiers nommés `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">
  ## Configuration
</div>

Comme GraphiteMergeTree, le moteur HDFS prend en charge une configuration étendue via le fichier de configuration de ClickHouse. Vous pouvez utiliser deux clés de configuration : une globale (`hdfs`) et une au niveau utilisateur (`hdfs_*`). La configuration globale est appliquée en premier, puis celle au niveau utilisateur est appliquée (si elle existe).

```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">
  ### Options de configuration
</div>

<div id="supported-by-libhdfs3">
  #### Pris en charge par libhdfs3
</div>

| **paramètre**                                         | **valeur par défaut**    |
| ----------------------------------------------------- | ------------------------ |
| 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                             | ""                       |

La [référence de configuration HDFS](https://hawq.apache.org/docs/userguide/2.3.0.0-incubating/reference/HDFSConfigurationParameterReference.html) peut fournir des explications sur certains paramètres.

<div id="clickhouse-extras">
  #### Options supplémentaires de ClickHouse
</div>

| **paramètre**               | **valeur par défaut** |
| --------------------------- | --------------------- |
| hadoop\_kerberos\_keytab    | ""                    |
| hadoop\_kerberos\_principal | ""                    |
| libhdfs3\_conf              | ""                    |

<div id="limitations">
  ### Limites
</div>

* `hadoop_security_kerberos_ticket_cache_path` et `libhdfs3_conf` ne peuvent être définis qu'au niveau global, et non au niveau de l'utilisateur

<div id="kerberos-support">
  ## Prise en charge de Kerberos
</div>

Si le paramètre `hadoop_security_authentication` a pour valeur `kerberos`, ClickHouse s’authentifie via Kerberos.
Les paramètres sont disponibles [ici](#clickhouse-extras), et `hadoop_security_kerberos_ticket_cache_path` peut s’avérer utile.
Notez qu’en raison des limitations de libhdfs3, seule l’approche traditionnelle est prise en charge :
les communications avec le datanode ne sont pas sécurisées par SASL (`HADOOP_SECURE_DN_USER` est un indicateur fiable de cette
approche de sécurité). Utilisez `tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.sh` comme référence.

Si `hadoop_kerberos_keytab`, `hadoop_kerberos_principal` ou `hadoop_security_kerberos_ticket_cache_path` sont spécifiés, l’authentification Kerberos sera utilisée. Dans ce cas, `hadoop_kerberos_keytab` et `hadoop_kerberos_principal` sont obligatoires.

<div id="namenode-ha">
  ## Prise en charge de la haute disponibilité du namenode HDFS
</div>

libhdfs3 prend en charge la haute disponibilité du namenode HDFS.

* Copiez `hdfs-site.xml` d’un nœud HDFS vers `/etc/clickhouse-server/`.
* Ajoutez l’extrait suivant au fichier de configuration de ClickHouse :

```xml theme={null}
  <hdfs>
    <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
  </hdfs>
```

* Utilisez ensuite la valeur de `dfs.nameservices` dans `hdfs-site.xml` comme adresse du namenode dans l’URI HDFS. Par exemple, remplacez `hdfs://appadmin@192.168.101.11:8020/abc/` par `hdfs://appadmin@my_nameservice/abc/`.

<div id="virtual-columns">
  ## Colonnes virtuelles
</div>

* `_path` — Chemin d’accès au fichier. Type : `LowCardinality(String)`.
* `_file` — Nom du fichier. Type : `LowCardinality(String)`.
* `_size` — Taille du fichier en octets. Type : `Nullable(UInt64)`. Si la taille est inconnue, la valeur est `NULL`.
* `_time` — Date et heure de la dernière modification du fichier. Type : `Nullable(DateTime)`. Si l’heure est inconnue, la valeur est `NULL`.

<div id="storage-settings">
  ## Paramètres de stockage
</div>

* [hdfs\_truncate\_on\_insert](/fr/reference/settings/session-settings#hdfs_truncate_on_insert) - permet de tronquer le fichier avant d’y insérer des données. Désactivé par défaut.
* [hdfs\_create\_new\_file\_on\_insert](/fr/reference/settings/session-settings#hdfs_create_new_file_on_insert) - permet de créer un nouveau fichier à chaque insertion si le format comporte un suffixe. Désactivé par défaut.
* [hdfs\_skip\_empty\_files](/fr/reference/settings/session-settings#hdfs_skip_empty_files) - permet d’ignorer les fichiers vides lors de la lecture. Désactivé par défaut.

**Voir aussi**

* [Colonnes virtuelles](/fr/reference/engines/table-engines/index#table_engines-virtual_columns)
