Saltar al contenido principal
Este motor proporciona integración con el ecosistema de Apache Hadoop al permitir gestionar datos en HDFS a través de ClickHouse. Este motor es similar a los motores File y URL, pero ofrece funcionalidades específicas de Hadoop. Esta funcionalidad no cuenta con soporte de los ingenieros de ClickHouse y se sabe que su calidad es irregular. Si surge algún problema, tendrás que solucionarlo por tu cuenta y enviar un pull request.

Uso

ENGINE = HDFS(URI, format)
Parámetros del motor
  • URI - URI completa del archivo en HDFS. La parte de la ruta de URI puede contener globs. En ese caso, la tabla sería de solo lectura.
  • format - especifica uno de los formatos de archivo disponibles. Para realizar consultas SELECT, el formato debe admitir entrada, y para realizar consultas INSERT, salida. Los formatos disponibles se enumeran en la sección Formatos.
  • [PARTITION BY expr]

PARTITION BY

PARTITION BY — Opcional. En la mayoría de los casos, no se necesita una clave de partición y, si hace falta, por lo general no debe ser más granular que por mes. La partición no acelera las consultas (a diferencia de la expresión ORDER BY). Nunca debe usar una partición demasiado granular. No particione sus datos por identificadores o nombres de clientes (en su lugar, haga que el identificador o el nombre del cliente sea la primera columna de la expresión ORDER BY). Para particionar por mes, use la expresión toYYYYMM(date_column), donde date_column es una columna con una fecha del tipo Date. Aquí, los nombres de las particiones tienen el formato "YYYYMM". Ejemplo: 1. Configure la tabla hdfs_engine_table:
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
2. Complete el archivo:
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
3. Consulta los datos:
SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

Detalles de implementación

  • Las lecturas y escrituras pueden ser paralelas.
  • No se admiten:
    • Las operaciones ALTER y SELECT...SAMPLE.
    • Los índices.
    • La replicación zero-copy es posible, pero no se recomienda.
La replicación zero-copy no está lista para producciónLa replicación zero-copy está deshabilitada de forma predeterminada en ClickHouse versión 22.8 y posteriores. Esta función no se recomienda para uso en producción.
Globs en la ruta Varios componentes de la ruta pueden contener globs. Para que un archivo se procese, debe existir y coincidir con el patrón completo de la ruta. La lista de archivos se determina durante SELECT (no en el momento de CREATE).
  • * — Sustituye cualquier cantidad de caracteres, excepto /, incluida la cadena vacía.
  • ? — Sustituye cualquier carácter individual.
  • {some_string,another_string,yet_another_one} — Sustituye cualquiera de las cadenas 'some_string', 'another_string', 'yet_another_one'.
  • {N..M} — Sustituye cualquier número en el intervalo de N a M, incluidos ambos extremos.
Las construcciones con {} son similares a la función de tabla remote. Ejemplo
  1. Supongamos que tenemos varios archivos en formato TSV con los siguientes URI en 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. Hay varias formas de crear una tabla compuesta por los seis archivos:
CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')
Otra forma:
CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')
La tabla se compone de todos los archivos de ambos directorios (todos los archivos deben cumplir el formato y el esquema descritos en la consulta):
CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')
Si la lista de archivos contiene rangos numéricos con ceros a la izquierda, use la sintaxis con llaves para cada dígito por separado o use ?.
Ejemplo Cree una tabla con archivos llamados 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')

Configuración

Al igual que GraphiteMergeTree, el motor HDFS admite una configuración ampliada mediante el archivo de configuración de ClickHouse. Puede usar dos claves de configuración: una global (hdfs) y otra a nivel de usuario (hdfs_*). Primero se aplica la configuración global y, después, la configuración a nivel de usuario (si existe).
<!-- Opciones de configuración global para el tipo de motor HDFS -->
<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>

<!-- Configuración específica para el usuario "root" -->
<hdfs_root>
  <hadoop_kerberos_principal>root@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
</hdfs_root>

Opciones de configuración

Compatible con libhdfs3

parámetrovalor predeterminado
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""
La referencia de configuración de HDFS puede aclarar algunos parámetros.

Opciones adicionales de ClickHouse

parámetrovalor predeterminado
hadoop_kerberos_keytab""
hadoop_kerberos_principal""
libhdfs3_conf""

Limitaciones

  • hadoop_security_kerberos_ticket_cache_path y libhdfs3_conf solo pueden ser globales, no específicos para cada usuario

Compatibilidad con Kerberos

Si el parámetro hadoop_security_authentication tiene el valor kerberos, ClickHouse se autentica mediante Kerberos. Los parámetros están aquí, y hadoop_security_kerberos_ticket_cache_path puede ser útil. Tenga en cuenta que, debido a las limitaciones de libhdfs3, solo se admite el enfoque tradicional; las comunicaciones del datanode no están protegidas mediante SASL (HADOOP_SECURE_DN_USER es un indicador fiable de este enfoque de seguridad). Use tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.sh como referencia. Si se especifican hadoop_kerberos_keytab, hadoop_kerberos_principal o hadoop_security_kerberos_ticket_cache_path, se utilizará la autenticación de Kerberos. En este caso, hadoop_kerberos_keytab y hadoop_kerberos_principal son obligatorios.

Compatibilidad con HDFS NameNode HA

libhdfs3 admite HA para el NameNode de HDFS.
  • Copie hdfs-site.xml desde un nodo de HDFS a /etc/clickhouse-server/.
  • Agregue la siguiente sección al archivo de configuración de ClickHouse:
  <hdfs>
    <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
  </hdfs>
  • Luego, usa el valor de la etiqueta dfs.nameservices de hdfs-site.xml como dirección del namenode en el URI de HDFS. Por ejemplo, sustituye hdfs://appadmin@192.168.101.11:8020/abc/ por hdfs://appadmin@my_nameservice/abc/.

Columnas virtuales

  • _path — Ruta del archivo. Tipo: LowCardinality(String).
  • _file — Nombre del archivo. Tipo: LowCardinality(String).
  • _size — Tamaño del archivo en bytes. Tipo: Nullable(UInt64). Si se desconoce el tamaño, el valor es NULL.
  • _time — Fecha y hora de la última modificación del archivo. Tipo: Nullable(DateTime). Si se desconoce la hora, el valor es NULL.

Configuración de almacenamiento

  • hdfs_truncate_on_insert - permite truncar el archivo antes de insertar datos en él. Deshabilitado de forma predeterminada.
  • hdfs_create_new_file_on_insert - permite crear un archivo nuevo en cada inserción si el formato tiene un sufijo. Deshabilitado de forma predeterminada.
  • hdfs_skip_empty_files - permite omitir archivos vacíos durante la lectura. Deshabilitado de forma predeterminada.
Véase también
Última modificación el 10 de junio de 2026