HDFS 테이블 엔진
HDFS 테이블 엔진
ClickHouse를 통해 HDFS의 데이터를 관리할 수 있게 해줘 Apache Hadoop 생태계와의 통합을 제공하는 테이블 엔진이에요. File과 URL 엔진과 비슷하지만 Hadoop 특화 기능을 제공해요. 이 기능은 ClickHouse 엔지니어가 지원하지 않으며 품질이 불안정한 것으로 알려져 있어요.
출처: 문서
본문
이 엔진은 ClickHouse를 통해 HDFS의 데이터를 관리할 수 있게 해줘 Apache Hadoop 생태계와의 통합을 제공해요. 이 엔진은 File과 URL 엔진과 비슷하지만 Hadoop 특화 기능을 제공해요. 이 기능은 ClickHouse 엔지니어가 지원하지 않으며 품질이 불안정한 것으로 알려져 있어요. 문제가 있으면 스스로 고치고 pull request를 제출해 주세요.
사용 (Usage)
ENGINE = HDFS(URI, format)
엔진 매개변수 (Engine Parameters)
URI— HDFS의 전체 파일 URI.URI의 경로 부분은 glob을 포함할 수 있어요. 이 경우 테이블은 읽기 전용이 돼요.format— 사용 가능한 파일 형식 중 하나를 지정해요.SELECT쿼리를 수행하려면 형식이 입력을 지원해야 하고,INSERT쿼리를 수행하려면 출력을 지원해야 해요. 사용 가능한 형식은 Formats 섹션에 나열돼 있어요.- [PARTITION BY expr]
PARTITION BY
PARTITION BY — 선택 사항. 대부분의 경우 파티션 키가 필요 없고, 필요하다면 일반적으로 월 단위보다 세밀한 파티션 키는 필요 없어요. 파티셔닝은 쿼리를 빠르게 하지 않아요(ORDER BY 표현식과 대조적으로). 너무 세밀한 파티셔닝은 절대 사용하지 마세요. 클라이언트 식별자나 이름으로 데이터를 파티셔닝하지 마세요(대신 클라이언트 식별자나 이름을 ORDER BY 표현식의 첫 번째 컬럼으로 만들어요). 월 단위 파티셔닝에는 toYYYYMM(date_column) 표현식을 사용해요. 여기서 date_column은 Date 타입의 날짜 컬럼이에요. 여기 파티션 이름은 "YYYYMM" 형식이에요.
예시 (Example):
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 │
└──────┴───────┘
구현 세부사항 (Implementation details)
- 읽기와 쓰기는 병렬일 수 있어요.
- 지원되지 않음:
ALTER와SELECT...SAMPLE연산.- 인덱스.
- Zero-copy 복제는 가능하지만 권장되지 않아요.
Zero-copy 복제는 ClickHouse 22.8 이상에서 기본적으로 꺼져 있어요. 이 기능은 프로덕션 사용에 권장되지 않아요.
경로의 Globs
여러 경로 구성 요소가 glob을 가질 수 있어요. 처리되려면 파일이 존재하고 전체 경로 패턴과 일치해야 해요. 파일 목록화는 SELECT 중에 결정돼요(CREATE 시점이 아님).
*—/를 제외한 모든 문자 수(빈 문자열 포함)를 대체해요.?— 단일 문자를 대체해요.{some_string,another_string,yet_another_one}— 문자열'some_string','another_string','yet_another_one'중 하나를 대체해요.{N..M}— N부터 M까지(두 경계 포함) 범위의 어떤 숫자든 대체해요.
{}가 있는 구성은 remote 테이블 함수와 비슷해요.
예시 (Example)
-
HDFS에 TSV 형식의 여러 파일과 다음 URI가 있다고 가정해요.
-
여섯 파일 모두로 구성된 테이블을 만드는 여러 방법이 있어요.
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이 있는 숫자 범위를 포함하면 각 자릿수에 대해 중괄호 구성을 사용하거나 ?를 사용해요.
예시 (Example)
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')
구성 (Configuration)
GraphiteMergeTree와 유사하게 HDFS 엔진은 ClickHouse 설정 파일을 사용한 확장 구성을 지원해요. 사용할 수 있는 설정 키가 두 가지 있어요: 전역(hdfs)과 사용자 수준(hdfs_*). 전역 구성이 먼저 적용되고, 그 다음 사용자 수준 구성이 적용돼요(존재하는 경우).
<!-- Global configuration options for HDFS engine type -->
<hdfs>
<hadoop_kerberos_keytab>/tmp/keytab/clickhouse.keytab</hadoop_kerberos_keytab>
<hadoop_kerberos_principal>[email protected]</hadoop_kerberos_principal>
<hadoop_security_authentication>kerberos</hadoop_security_authentication>
</hdfs>
<!-- Configuration specific for user "root" -->
<hdfs_root>
<hadoop_kerberos_principal>[email protected]</hadoop_kerberos_principal>
</hdfs_root>
구성 옵션 (Configuration options)
libhdfs3 지원
| 매개변수 | 기본값 |
|---|---|
| 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 | "" |
HDFS 구성 참조가 일부 매개변수를 설명할 수 있어요.
ClickHouse 추가 (ClickHouse extras)
| 매개변수 | 기본값 |
|---|---|
| hadoop_kerberos_keytab | "" |
| hadoop_kerberos_principal | "" |
| libhdfs3_conf | "" |
제한 (Limitations)
hadoop_security_kerberos_ticket_cache_path와libhdfs3_conf는 전역으로만 설정할 수 있고 사용자 특정으로는 안 돼요.
Kerberos 지원 (Kerberos support)
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_keytab과 hadoop_kerberos_principal이 필수예요.
HDFS Namenode HA 지원 (HDFS Namenode HA support)
libhdfs3는 HDFS namenode HA를 지원해요.
- HDFS 노드에서
/etc/clickhouse-server/로hdfs-site.xml을 복사해요. - ClickHouse 설정 파일에 다음 부분을 추가해요.
<hdfs>
<libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
</hdfs>
- 그런 다음
hdfs-site.xml의dfs.nameservices태그 값을 HDFS URI의 namenode 주소로 사용해요. 예를 들어hdfs://[email protected]:8020/abc/를hdfs://appadmin@my_nameservice/abc/로 대체해요.
가상 컬럼 (Virtual columns)
_path— 파일 경로. 타입:LowCardinality(String)._file— 파일 이름. 타입:LowCardinality(String)._size— 바이트 단위의 파일 크기. 타입:Nullable(UInt64). 크기를 알 수 없으면NULL이에요._time— 파일의 마지막 수정 시간. 타입:Nullable(DateTime). 시간을 알 수 없으면NULL이에요._etag— 파일의 ETag. 타입:LowCardinality(String). HDFS에는 네이티브 ETag가 없으므로 값이 파일의 수정 시간과 크기에서<mtime_seconds>_<size>로 합성돼요.libhdfs3가 수정 시간을 1초 정밀도로만 노출하므로, 같은 초 안에 같은 크기로 다시 쓰면 같은 값이 나와요. 그래서 이 합성 ETag는 콘텐츠 캐시 키로 사용되지 않아요.
스토리지 설정 (Storage settings)
- hdfs_truncate_on_insert — insert 전에 파일을 자르는 것을 허용해요. 기본적으로 꺼져 있어요.
- hdfs_create_new_file_on_insert — 형식에 접미사가 있으면 각 insert에 새 파일을 만드는 것을 허용해요. 기본적으로 꺼져 있어요.
- hdfs_skip_empty_files — 읽는 동안 빈 파일을 건너뛰는 것을 허용해요. 기본적으로 꺼져 있어요.