개요
wasm32-unknown-unknown)로 컴파일해야 합니다. 또한 기본 32비트 WebAssembly 대상만 지원됩니다(wasm64 확장은 지원되지 않음).
모듈은 ClickHouse와 상호작용하기 위해 지원되는 통신 프로토콜(ABI) 중 하나를 따라야 합니다.
컴파일이 완료되면 모듈의 바이너리 코드는 system.webassembly_modules 테이블에 삽입되어 ClickHouse에 로드됩니다.
그 후 CREATE FUNCTION ... LANGUAGE WASM 구문을 사용해 모듈이 내보낸 함수를 참조하는 UDF를 생성할 수 있습니다.
사전 요구 사항
빠른 시작
wat2wasm 또는 wasm-tools의 parse 명령을 사용할 수 있습니다.
FORMAT RawBlob을 사용해 ClickHouse client로 직접 파이프하여 system.webassembly_modules 테이블에 삽입합니다.
그런 다음 모듈이 내보내는 steps 함수를 참조하는 UDF를 정의합니다:
:: 뒤에는 모듈의 함수 이름을 지정한다는 점에 유의하십시오.
이제 쿼리에서 collatz_steps 함수를 사용할 수 있습니다:
number 컬럼은 UInt32로 명시적으로 CAST됩니다. 이는 WebAssembly 함수가 CREATE FUNCTION 문에 지정된 시그니처와 정확히 일치하는 타입을 요구하기 때문입니다.
그 결과, 1부터 100까지의 수에 대한 Collatz 단계 수열을 얻을 수 있으며, 이는 OEIS의 A006577 수열에 해당합니다.
시스템 테이블을 통해 WASM 모듈 관리
system.webassembly_modules 테이블에 저장됩니다:
- 컬럼
nameString — 모듈 이름입니다. 비어 있을 수 없으며, 영문자, 숫자, 밑줄 문자만 사용할 수 있습니다.codeString — 원시 바이너리 WASM 코드입니다. 쓰기 전용이며, 읽기 시 빈 문자열이 반환됩니다.hashUInt256 — 모듈 바이너리의 SHA256입니다(디스크에는 존재하지만 아직 로드되지 않은 경우 0).
모듈 삽입
모듈 목록 보기
모듈 삭제
DELETE FROM system.webassembly_modules WHERE name = '...' 문을 사용해 수행합니다.
프레디케이트는 정확한 일치에는 name = 'literal', 패턴과 일치하는 모든 모듈을 삭제할 때는 name LIKE 'pattern'여야 하며, 그 밖의 형태는 허용되지 않습니다.
WebAssembly UDF 생성하기
function_name: ClickHouse에서의 함수 이름입니다. 모듈의 내보낸 함수 이름과 다를 수 있습니다.FROM 'module_name' :: 'source_function_name': 사용할 로드된 WASM 모듈 이름과 WASM 모듈 내 함수 이름입니다(기본값은 function_name).ARGUMENTS: 인수 이름과 타입 목록입니다(이름은 선택 사항이며, 이름 있는 필드를 지원하는 직렬화 포맷에서 사용됩니다).ABI: Application Binary Interface 버전입니다.ROW_DIRECT: 직접 타입 매핑, 행 단위 처리BUFFERED_V1: 직렬화를 사용하는 블록 기반 처리
DETERMINISTIC: 함수를 결정적으로 선언합니다 — 동일한 입력에 대해 항상 동일한 출력을 반환합니다. 지정하면 모든 인수가 상수인 호출에 대해 ClickHouse가 상수 폴딩을 수행할 수 있습니다. 함수는 쿼리 분석 시점에 한 번 평가되며, 결과는 모든 행에 재사용됩니다.SHA256_HASH: 검증에 사용할 예상 모듈 해시입니다(생략하면 자동으로 채워짐). 서로 다른 레플리카에서 올바른 WASM 모듈이 로드되었는지 확인하는 데 사용할 수 있습니다.SETTINGS: 함수별 설정serialization_formatString — ABI에 필요할 때 사용하는 직렬화 포맷입니다. 기본값:MsgPack.
ABI 버전
ROW_DIRECT: 직접 타입 매핑(기본 타입Int32,UInt32,Int64,UInt64,Float32,Float64만 지원)BUFFERED_V1: 직렬화를 사용하는 복합 타입
ABI ROW_DIRECT
- 인수와 반환 타입은 숫자 타입
Int32/UInt32/Int64/UInt64/Float32/Float64/Int128/UInt128입니다. - 이 ABI에서는 문자열을 지원하지 않습니다.
- 시그니처는 WASM 내보내기(
i32/i64/f32/f64/v128)와 일치해야 합니다. - 모듈에서 내보내야 하는 지원 함수는 필요하지 않습니다.
ABI BUFFERED_V1
이 ABI는 실험적이며 향후 릴리스에서 변경될 수 있습니다.
i32 인수를 받아 하나의 i32 값을 반환합니다.
게스트 코드는 데이터를 처리한 후 직렬화된 결과 데이터가 들어 있는 결과 버퍼를 가리키는 포인터를 반환합니다.
게스트 코드는 이러한 버퍼를 생성하고 해제하는 두 개의 함수를 제공해야 합니다.
Rust로 UDF를 개발할 때 참고할 사항
clickhouse_create_buffer와 clickhouse_destroy_buffer 함수를 직접 구현할 필요 없이 크레이트를 의존성으로 추가하면 됩니다. 또한 일반적인 Rust 함수를 필요한 ABI 형식으로 감싸는 매크로 #[clickhouse_wasm_udf]도 제공합니다.
이 크레이트를 사용하면 다음과 같이 UDF를 작성할 수 있습니다:
serde를 사용해 직렬화/역직렬화를 자동으로 처리합니다.
모듈에서 사용할 수 있는 호스트 API
clickhouse_server_version() -> i64— ClickHouse 서버 버전을 정수로 반환합니다(예: v25.11.1.1은 25011001).clickhouse_throw(ptr: i32, size: i32)— 지정된 메시지로 오류를 발생시킵니다. 오류 메시지 문자열이 저장된 메모리 위치의 포인터와 문자열 크기를 인수로 받습니다.clickhouse_log(ptr: i32, size: i32)— 메시지를 ClickHouse 서버 텍스트 로그에 기록합니다.clickhouse_random(ptr: i32, size: i32)— 메모리를 무작위 바이트로 채웁니다.
설정
-
webassembly_udf_max_fuel— WebAssembly UDF 인스턴스 실행당 연료 한도입니다. 각 WebAssembly 명령어는 일정량의 연료를 소비합니다. 제한을 두지 않으려면 0으로 설정합니다. -
webassembly_udf_max_memory— WebAssembly UDF 인스턴스당 바이트 단위의 메모리 한도입니다. -
webassembly_udf_max_input_block_size— 단일 블록에서 WebAssembly UDF에 전달되는 최대 행 수입니다. 모든 행을 한 번에 처리하려면 0으로 설정합니다. -
webassembly_udf_max_instances— 함수별로 병렬 실행할 수 있는 WebAssembly UDF 인스턴스의 최대 개수입니다.