메인 콘텐츠로 건너뛰기
이 엔진은 ClickHouse를 통해 HDFS의 데이터를 관리할 수 있게 하여 Apache Hadoop 에코시스템과 통합됩니다. 이 엔진은 FileURL 엔진과 유사하지만, Hadoop 전용 기능을 제공합니다. 이 기능은 ClickHouse 엔지니어가 지원하지 않으며, 품질도 다소 불안정한 것으로 알려져 있습니다. 문제가 발생하면 직접 수정하고 Pull Request를 제출하십시오.

사용법

ENGINE = HDFS(URI, format)
엔진 매개변수
  • URI - HDFS의 전체 파일 URI입니다. URI의 경로 부분에는 글롭 패턴이 포함될 수 있습니다. 이 경우 테이블은 읽기 전용이 됩니다.
  • format - 사용 가능한 파일 포맷 중 하나를 지정합니다. SELECT 쿼리를 실행하려면 해당 포맷이 입력을 지원해야 하며, INSERT 쿼리를 실행하려면 출력을 지원해야 합니다. 사용 가능한 포맷은 포맷 섹션에 나와 있습니다.
  • [PARTITION BY expr]

PARTITION BY

PARTITION BY — 선택 사항입니다. 대부분의 경우 파티션 키는 필요하지 않으며, 필요하더라도 보통 월 단위보다 더 세분화할 필요는 없습니다. 파티셔닝은 쿼리 속도를 높여 주지 않습니다(ORDER BY 표현식과는 다릅니다). 지나치게 세분화된 파티셔닝은 절대 사용하지 마십시오. 데이터를 클라이언트 식별자나 이름으로 파티셔닝하지 마십시오(대신 클라이언트 식별자 또는 이름을 ORDER BY 표현식의 첫 번째 컬럼으로 지정하십시오). 월 단위로 파티셔닝하려면 toYYYYMM(date_column) 표현식을 사용하십시오. 여기서 date_columnDate 타입의 날짜 컬럼입니다. 이 경우 파티션 이름은 "YYYYMM" 포맷을 사용합니다. 예시: 1. hdfs_engine_table 테이블을 설정합니다:
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
2. 파일을 작성하세요:
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
3. 데이터를 조회하세요:
SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

구현 세부 정보

  • 읽기와 쓰기는 병렬로 수행할 수 있습니다.
  • 지원되지 않습니다:
    • ALTERSELECT...SAMPLE 작업
    • 인덱스
    • Zero-copy 복제도 가능하지만 권장되지 않습니다.
zero-copy 복제는 운영 환경에서 사용할 준비가 되지 않았습니다ClickHouse 버전 22.8 이상에서는 zero-copy 복제가 기본적으로 비활성화되어 있습니다. 이 기능은 운영 환경에서 사용하는 것을 권장하지 않습니다.
경로의 글롭 패턴 여러 경로 구성 요소에 글롭 패턴을 사용할 수 있습니다. 파일이 처리되려면 해당 파일이 존재해야 하며 전체 경로 패턴과 일치해야 합니다. 파일 목록은 SELECT 시점에 결정되며(CREATE 시점이 아님).
  • * — 빈 문자열을 포함해 /를 제외한 임의의 문자를 0개 이상 대체합니다.
  • ? — 임의의 단일 문자를 대체합니다.
  • {some_string,another_string,yet_another_one}'some_string', 'another_string', 'yet_another_one' 중 하나의 문자열로 대체합니다.
  • {N..M} — N부터 M까지의 범위에 있는 임의의 숫자(양 끝값 포함)로 대체합니다.
{}를 사용하는 구문은 remote 테이블 함수와 유사합니다. 예시
  1. HDFS에 다음 URI를 가진 TSV 포맷의 파일이 여러 개 있다고 가정합니다:
    • ‘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. 이 6개 파일 전체로 구성된 테이블을 만드는 방법은 여러 가지가 있습니다:
CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV')
또 다른 방법:
CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV')
테이블은 두 디렉터리의 모든 파일로 구성됩니다(모든 파일은 쿼리에서 설명한 포맷과 스키마를 충족해야 합니다):
CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV')
파일 목록에 앞자리가 0인 숫자 범위가 포함된 경우, 각 자릿수별로 중괄호를 사용하는 구문이나 ?를 사용하십시오.
예시 file000, file001, … , file999라는 이름의 파일로 table을 생성합니다:
CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV')

구성

GraphiteMergeTree와 마찬가지로 HDFS 엔진은 ClickHouse 구성 파일을 사용한 확장 구성을 지원합니다. 사용할 수 있는 구성 키는 전역(hdfs)과 사용자 수준(hdfs_*)의 두 가지입니다. 먼저 전역 구성이 적용되고, 그다음 사용자 수준 구성이 적용됩니다(있는 경우).
<!-- 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>

<!-- "root" 사용자에 대한 특정 구성 -->
<hdfs_root>
  <hadoop_kerberos_principal>root@TEST.CLICKHOUSE.TECH</hadoop_kerberos_principal>
</hdfs_root>

구성 옵션

libhdfs3에서 지원되는 항목

매개변수기본값
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""
일부 매개변수에 대한 설명은 HDFS Configuration Reference를 참고하십시오.

ClickHouse 추가 설정

매개변수기본값
hadoop_kerberos_keytab""
hadoop_kerberos_principal""
libhdfs3_conf""

제한 사항

  • hadoop_security_kerberos_ticket_cache_pathlibhdfs3_conf는 사용자별이 아닌 전역으로만 설정할 수 있습니다

Kerberos 지원

hadoop_security_authentication 매개변수 값이 kerberos이면 ClickHouse는 Kerberos를 통해 인증합니다. 매개변수는 여기에서 확인할 수 있으며, 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_keytabhadoop_kerberos_principal은 필수입니다.

HDFS 네임노드 HA 지원

libhdfs3는 HDFS 네임노드 HA를 지원합니다.
  • HDFS 노드에서 hdfs-site.xml/etc/clickhouse-server/로 복사하십시오.
  • ClickHouse 구성 파일에 다음 내용을 추가하십시오.
  <hdfs>
    <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
  </hdfs>
  • 그런 다음 HDFS URI에서 네임노드 주소로 hdfs-site.xmldfs.nameservices 값를 사용합니다. 예를 들어 hdfs://appadmin@192.168.101.11:8020/abc/hdfs://appadmin@my_nameservice/abc/로 바꾸십시오.

가상 컬럼

  • _path — 파일 경로입니다. 유형: LowCardinality(String).
  • _file — 파일 이름입니다. 유형: LowCardinality(String).
  • _size — 파일 크기(바이트)입니다. 유형: Nullable(UInt64). 크기를 알 수 없으면 값은 NULL입니다.
  • _time — 파일의 마지막 수정 시각입니다. 유형: Nullable(DateTime). 시각을 알 수 없으면 값은 NULL입니다.

저장소 설정

  • hdfs_truncate_on_insert - 파일에 삽입하기 전에 해당 파일을 truncate할 수 있습니다. 기본적으로 비활성화되어 있습니다.
  • hdfs_create_new_file_on_insert - 포맷에 suffix가 있는 경우, 삽입할 때마다 새 파일을 생성할 수 있습니다. 기본적으로 비활성화되어 있습니다.
  • hdfs_skip_empty_files - 읽는 중 빈 파일을 건너뛸 수 있습니다. 기본적으로 비활성화되어 있습니다.
관련 항목
마지막 수정일 2026년 6월 10일