我在clickhouse中有一个事件表(MergeTree),并希望同时运行很多小插入.但是,服务器变得过载并且没有响应.而且,一些插入物丢失了.clickhouse错误日志中有很多记录:
01:43:01.668 [ 16 ] <Error> events (Merger): Part 201 61109_20161109_240760_266738_51 intersects previous part
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这些查询?我知道我可以使用批量插入来处理某些类型的事件.基本上,运行一个包含许多记录的插入,clickhouse处理得非常好.但是,某些事件(例如点击或打开)无法以这种方式处理.
另一个问题:为什么clickhouse决定存在类似的记录,何时不存在?插入时有类似的记录,它们与索引中的字段相同,但其他字段不同.
我不时也会收到以下错误:
Caused by: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, message: Connect to localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out, host: localhost, port: 8123; Connect to ip6-localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out
... 36 more
Run Code Online (Sandbox Code Playgroud)
主要是在项目构建期间运行针对clickhouse数据库的测试时.
小智 13
Clickhouse 为此提供了特殊类型的表 - Buffer。它存储在内存中,允许许多小的插入没有问题。我们每秒有近 200 个不同的插入 - 效果很好。
缓冲表:
CREATE TABLE logs.log_buffer (rid String, created DateTime, some String, d Date MATERIALIZED toDate(created))
ENGINE = Buffer('logs', 'log_main', 16, 5, 30, 1000, 10000, 1000000, 10000000);
Run Code Online (Sandbox Code Playgroud)
主表:
CREATE TABLE logs.log_main (rid String, created DateTime, some String, d Date)
ENGINE = MergeTree(d, sipHash128(rid), (created, sipHash128(rid)), 8192);
Run Code Online (Sandbox Code Playgroud)
手册中的详细信息:https : //clickhouse.yandex/docs/en/operations/table_engines/buffer/
在将大量小插入处理成(非复制的)MergeTree时,这是已知问题.
这是一个错误,我们需要调查和修复.
对于变通方法,您应按照建议大批量发送插入:大约每秒一批:https://clickhouse.yandex/reference_en.html#Performance%20on%20data%20insertion.
我也遇到过类似的问题,尽管还不算太糟糕-每秒执行约20次插入操作导致服务器达到很高的负载,内存消耗和CPU使用率。我创建了一个Buffer表,用于在内存中缓冲插入,然后将它们定期刷新到“真实”磁盘表中。就像魔术一样,一切都进行得很顺利:负载,内存和CPU使用率降至正常水平。令人高兴的是,您可以对缓冲区表运行查询,并从内存和磁盘中获取匹配的行-因此客户端不受缓冲的影响。参见https://clickhouse.yandex/docs/en/table_engines/buffer.html