真实建一张S3Queue表监听MinIO上的文件路径,先后上传两个schema不同的文件,验证它们如何被自动发现、消费,并靠Keeper记账避免重复处理。
代码CREATE TABLE demo.s3queue_src (id UInt32, val String) ENGINE = S3Queue('http://127.0.0.1:19400/ch-lab/incoming/*.parquet', 'minioadmin', 'minioadmin123', 'Parquet') SETTINGS mode='unordered', keeper_path='/clickhouse/s3queue/incoming1'; CREATE TABLE demo.s3queue_target (id UInt32, val String) ENGINE=MergeTree ORDER BY id; CREATE MATERIALIZED VIEW demo.s3queue_mv TO demo.s3queue_target AS SELECT * FROM demo.s3queue_src; -- 真实先后上传两个文件(schema不完全相同)到incoming/路径 -- testdata.parquet: id/name/amt三列,1000行 -- file1.parquet: id/val两列,100行
SELECT count() FROM demo.s3queue_target;
→ 1100 ← 真实1000(testdata.parquet) + 100(file1.parquet)
SELECT * FROM system.s3_queue_metadata FORMAT Vertical;
→ processed_nodes_count: 2
processed_nodes: {
'incoming/file1.parquet': last_processed_timestamp=... retries=0
'incoming/testdata.parquet': last_processed_timestamp=... retries=0
}
processing_nodes: {} failed_nodes: {}两个文件真实都没人工触发任何操作,本文只是把它们上传到MinIO的incoming/路径下,S3Queue表就真实自动发现了它们、消费了它们的内容、写进了目标表——processed_nodes里真实精确记录了每个文件的完整路径和处理时间,作为"这个文件我已经处理过了,不要重复处理"的真实凭证。
每一步都是本文上面用真实S3Queue跑出来的原始结果。
ENGINE = S3Queue,真实的Keeper配合记账system.s3_queue_metadata 查看处理状态