clickhouse 内存不够

描述:插入表500+字段  50W数据可行!

100W数据报错

clickhouse 内存不够_第1张图片

 

填坑:修改users.xml配置文件之

set max_bytes_before_external_group_by=20000000000; #20G
set max_memory_usage=40000000000; #40G
参数解析:默认情况下,ClickHouse会限制group by使用的内存量(它使用 hash table来处理group by)。
这很容易解决 - 如果你有空闲的内存,增加这个参数:
如果你没有那么多的内存可用,ClickHouse可以通过设置这个“溢出”数据到磁盘:
 

 

max_memory_usage详解:该设置不考虑可用内存量或机器上的总内存量。该限制适用于单个服务器中的单个查询,限制总users,

 

也就是说如果你内存够大,调整SET max_memory_usage这个参数。如果内存不够,

那么就加上这个参数set max_bytes_before_external_group_by

原因是聚合需要分两个阶段进行:1.查询并且建立中间数据 2.合并中间数据。 

数据“溢出”到磁盘一般发生在第一个阶段,如果没有发生数据“溢出”,ClickHouse在阶段1和阶段2可能需要相同数量的内存

 

 

据官方文档,如果需要使用max_bytes_before_external_group_by,

建议将max_memory_usage设置为max_bytes_before_external_group_by大小的两倍。

 

或者min_insert_block_size_rows=8192, min_insert_block_size_bytes (待测)
 

配置在users.xml里面的会被当作默认参数。当你的client没有指定这些参数的时候会使用默认参数

 

system库里面的表都不是复制表 直接set只会在当前server生效

问:所以每个若server节点多的话 每个都得set一下

回答:distribution查询的时候会传递的,最终这些set其实全部保存在client端。。随着每个query走的

 

 

理解:修改了一个server端,那么client查询会默认将参数传递

你可能感兴趣的:(clickhouse)