精华 架构讨论帖: 老司机请进来

发布于 5 年前 作者 guzhenping 9075 次浏览 来自 实战经验

最近在看Clickhouse、Palo、TiDB,发现在架构上:Clickhouse缺少了一个query转发层以支持高并发。

Palo的SQL转发层: palo_sql.png

TiDB的SQL转发层: tidb_sql.png

这两个OLAP工具都具备支持多用户在线查询的能力,有一定负载能力。

相对的Clickhouse非常诡异。。我执行如下SQL(数据集结果较大):

SELECT
    contract_type,
    city_id,
    clue_id
FROM
(
    SELECT
        contract_type,
        city_id,
        clue_id
    FROM bi_contracts_all
)
ALL INNER JOIN
(
    SELECT city_id
    FROM bi_c2c_car_source_all
) USING (city_id)

就会报错:Memory limit。修改max_memory_usage的值(user.xml) 第一次报错:

Progress: 4.84 million rows, 42.70 MB (45.34 million rows/s., 399.59 MB/s.)  87%

Received exception from server:
Code: 241. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Memory limit (for query) exceeded: would use 12.15 GiB (attempt to allocate chunk of 4294967296 bytes), maximum: 9.31 GiB.

0 rows in set. Elapsed: 48.023 sec. Processed 4.84 million rows, 42.70 MB (100.89 thousand rows/s., 889.21 KB/s.)

内存由9g改为80g,继续报错:

Progress: 4.89 million rows, 43.81 MB (23.23 thousand rows/s., 208.09 KB/s.)  88%

Received exception from server:
Code: 241. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Memory limit (for query) exceeded: would use 80.15 GiB (attempt to allocate chunk of 17179869184 bytes), maximum: 74.51 GiB.

3668208133 rows in set. Elapsed: 235.536 sec. Processed 4.89 million rows, 43.81 MB (20.77 thousand rows/s., 186.00 KB/s.)

这个问题我实在不知道该如何解释。诚然,一个query是不可以用那么大的,工具不能这么用。但是如果我是10个用户同时查8G数据,Clickhouse会不会Kill掉一个查询,这不就蛋疼了嘛。

不知道姿势是否正确,clickhouse集群只能暴露一个host出去给程序\客户端用吗?特别想知道,该如何去构建这个SQL Query的转发层。

@jackpgao @theseusyang

4 回复

clickhouse支持多用户并发查询的。你这个问题是单个查询的中间数据集过大导致内存使用超限,确实会发生多个并发查询导致内存超限的问题,这个其实不太容易解决。

这是中间缓存所需的,取决于单个节点的内存,如像你所说结果集较大,在sql不变的情况下只能增大机器内存

我之前在使用的过程中确实也出现了这个问题,总的来说就是在查询过程中,如果要加载到内存的中间数据量过大的话,一旦超出了内存限制整个查询是无法进行的,再怎么说他也会把数据加载到内存计算,如果加载的过程都已经发生了内存溢出这种情况,除了增大机器内存或者限制查询(比如hive的严格模式),我感觉没有更好的办法了。

MK一下 楼主,请求转发的那一块是怎么做的

回到顶部