2016-11-14 167 views
3

我在clickhouse中有一个事件表(MergeTree),并且想要同时运行很多小插入。但是,服务器变得过载并且没有响应。而且,一些插入物丢失了。 clickhouse错误日志中有很多记录:clickhouse中的多个小插入

01:43:01.668 [ 16 ] <Error> events (Merger): Part 201 61109_20161109_240760_266738_51 intersects previous part 

有没有一种方法来优化这种查询?我知道我可以使用批量插入来处理某些类型的事件。基本上,运行一个插入与许多记录,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 

天色项目建设期间,当对clickhouse数据库测试中运行。

回答

3

该处理大量的小插入物的成(非复制的)MergeTree时是已知的问题。

这是一个错误,我们需要研究和解决。

对于解决方法,你应该在大批量发送的插入,建议:大约一批次每秒:https://clickhouse.yandex/reference_en.html#Performance%20on%20data%20insertion

+0

我们有过的基础上产生的事件。将它们分批插入CH,意味着我们需要为它们建立一个临时区域,可能是一个队列或其他临时的地方。这是我们必须做的帽子吗,还是有另一种推荐的插入单行的方法? 第二个后续问题:文档指出:“为了提高性能,可以并行执行多个INSERT查询......”。这是否意味着我们可以运行并行进程/线程,每次都插入,但每个进程需要每秒并行执行一个批处理? – ipolevoy

+0

是的,您需要在某个队列或服务的进程内缓冲区中累积事件,然后分批插入。 – uYSIZfoz

+0

您可以并行执行多个INSERT;所有线程总共推荐每秒一个批次。 – uYSIZfoz

2

我也有过类似的问题,虽然不是那么糟糕 - 决策〜每秒20个将引起达到高loadavg,内存消耗和CPU使用的服务器。我创建了一个缓冲区表,将插入缓冲区存储在内存中,然后将它们定期刷新到“真正的”磁盘表上。就像魔术一样,一切都非常顺利:loadavg,内存和CPU使用率降至正常水平。好处是您可以对缓冲区表执行查询,并从内存和磁盘中获取匹配的行 - 因此客户端不受缓冲区的影响。见https://clickhouse.yandex/docs/en/table_engines/buffer.html