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 deURIpuede contener globs. En ese caso, la tabla sería de solo lectura.format- especifica uno de los formatos de archivo disponibles. Para realizar consultasSELECT, el formato debe admitir entrada, y para realizar consultasINSERT, 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
ALTERySELECT...SAMPLE. - Los índices.
- La replicación zero-copy es posible, pero no se recomienda.
- Las operaciones
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
-
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'
-
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_pathylibhdfs3_confsolo 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.xmldesde 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.nameservicesdehdfs-site.xmlcomo dirección del namenode en el URI de HDFS. Por ejemplo, sustituyehdfs://appadmin@192.168.101.11:8020/abc/porhdfs://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 esNULL._time— Fecha y hora de la última modificación del archivo. Tipo:Nullable(DateTime). Si se desconoce la hora, el valor esNULL._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 quelibhdfs3expone 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