Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Motor de tabla HDFS

No es compatible con ClickHouse Cloud

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.

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

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

<!-- 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>

Opciones de configuración

Compatible con libhdfs3

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

Opciones adicionales de ClickHouse

parámetro valor 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.
  • _etag — ETag del archivo. Tipo: LowCardinality(String). HDFS no tiene un ETag nativo, por lo que el valor se genera a partir de la hora de modificación y el tamaño del archivo como <mtime_seconds>_<size>. Dado que libhdfs3 expone la hora de modificación solo con precisión de un segundo, una reescritura dentro del mismo segundo que mantiene el mismo tamaño genera el mismo valor; por ese motivo, este ETag generado no se utiliza como clave de caché de contenido.

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

Navigation