Superset查询会丢数据问题排查
刘梦凯 Lv3

Superset版本 1.3.0

查询结果会比正确结果少两条数据

首先我先讲述我是如何发现这个问题的,准确的说是运营如何发现这个问题的。

数据有四列,分别是’Time’ ‘pid’ ‘eid’ ‘cnt’ ,首先我们在clickhouse客户端进行操作,其中我限定pid=’609’,然后eid进行group by 操作,然后sum(cnt),可以看到数据有三条

我从superset进行同样的操作,需要注意的是我上面在clickhouse客户端操作的SQL就是在superset上操作view sql生成的SQL语句,所以他们肯定是相同的操作。

可以看到superset只有一条结果返回,经过我监控query_log日志中的SQL语句发现superset请求的SQL语句确实没有什么问题,但是他在接收到结果之后进行了一些操作会导致数据少两条。

经过多方排查以及询问,发现最后是superset连接clickhouse使用的协议导致的,首先superset连接clickhouse使用的是开源的第三方的库叫做 clickhouse-sqlalchemy ,它支持两种连接clickhouse的协议,分别是http以及native(TCP)协议其中我们默认使用的是http协议,反映出来的url就是这么写 :

clickhouse://bigdata:XXXXXXXXXX@127.0.0.1:8123/default

还有一种native(TCP)协议,它的url是这么写,需要注意的是必须要去掉端口号,加上端口号superset不能正常解析。

clickhouse+native://bigdata:XXXXXXXXXX@127.0.0.1/default

而第一种协议需要我们在执行底层查询的时候指定查询结果的format,否则返回的结果就是不正确的。

https://github.com/xzkostyan/clickhouse-sqlalchemy/issues/14#issuecomment-390755088

改用第二种native的形式并且去掉端口号之和superset返回的数据和clickhouse客户端一致了。

参考连接:

https://github.com/apache/superset/issues/15190

https://github.com/xzkostyan/clickhouse-sqlalchemy/issues/14

  • Post title:Superset查询会丢数据问题排查
  • Post author:刘梦凯
  • Create time:2021-10-18 20:22:01
  • Post link:https://liumengkai.github.io/2021/10/18/Superset查询会丢数据问题排查/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.