ClickhouseHouse问题汇总

标签: 无 分类: 未分类 创建时间:2020-02-17 11:22:58 更新时间:2025-01-17 10:39:22

1.Parameters start = 0, length = 100 are out of bound in ColumnVector::insertRangeFrom method (data.size() = 5). (version 20.1.3.7 (official build))

在执行下面的Mybatis语句时,出现了上面的错误。

1
2
3
4
5
6
7
8
SELECT * FROM lsmfhx.v_realtime WHERE SiteNo in
<foreach item="item" index="index" collection="SiteNos"
open="(" separator="," close=")">
#{item}
</foreach>
and parseDateTimeBestEffortOrNull(RecordTime) BETWEEN parseDateTimeBestEffortOrNull(#{startdate}) AND
parseDateTimeBestEffortOrNull(#{enddate}) AND MediumType = #{mediumtype} ORDER BY
#{order1} ${sort1},#{order2} ${sort2} LIMIT ${page},${size}

最后将#{order2}符号换成了${order2}符号,解决了问题。

1
2
3
4
5
6
7
8
9
10
<select id="searchHistoryBySiteNo" resultType="com.bibichuan.bigdata.Entity.VRealTime" >
SELECT * FROM lsmfhx.v_realtime WHERE SiteNo in
<foreach item="item" index="index" collection="SiteNos"
open="(" separator="," close=")">
#{item}
</foreach>
and parseDateTimeBestEffortOrNull(RecordTime) BETWEEN parseDateTimeBestEffortOrNull(#{startdate}) AND
parseDateTimeBestEffortOrNull(#{enddate}) AND MediumType = #{mediumtype} ORDER BY
${order1} ${sort1},${order2} ${sort2} LIMIT ${page},${size}
</select>

2.Exception: Cannot parse datetime 2016-09-20 13:46 (version 20.1.3.7 (official build)

当Clickhouse数据库中的字段是日期类型的时候,容易出现日期格式问题。比如下面用Mybatis写的SQL语句。

1
2
3
4
5
6
7
8
SELECT ${fieldlist},RecordTime,SiteNo FROM lsmfhx.v_realtime where RecordTime
BETWEEN '${startdate}' AND
'${enddate}' AND MediumType = ${mediumtype} and SiteNo in
<foreach item="item" index="index" collection="SiteNos"
open="(" separator="," close=")">
${item}
</foreach>
ORDER BY RecordTime

startdate和enddate变量传入的值,必须是”2010-02-02 09:02:00”这种样式,而不能是”2010-02-02 09:02”这样的样式,否则就会报错。

3.Max query size exceeded

在我使用in方式查询的时候,出现了上面的错误。

这其实是因为查询语句特别的大造成的(我的in()里面有5万多个id号),而默认的max_query_size最大是256 KiB。打开/etc/clickhouse-server/user.d/newuser.xml(我新建的自己的newuser.xml配置文件),也可以是其他的users.xml,其中有两个部分,一部分是profiles和quotas。profiles保存了用户的配置,quotas保存了用户的配额。配额使您可以限制一段时间内的资源使用,或仅跟踪资源的使用。像max_query_size这种配置,就需要在profiles部分中配置。

注意这里的单位是bytes(字节),我这里设置了102410241024=1,073,741,824,就解决问题了。

4.Code: 168, e.displayText() = DB::Exception: AST is too big. Maximum: 50000 (version 19.17.5.18 (official build))

解决了上面的max_query_size问题,再次执行语句,出现了AST太大了。

解决方法是在users.xml配置文件中添加

1
2
<max_ast_elements>10000000</max_ast_elements>
<max_expanded_ast_elements>10000000</max_expanded_ast_elements>

5.19.17 Method createColumn() is not implemented for data type Set.

我在一台机器上安装了19.17版本的clickhouse数据库。执行:

1
SELECT MediumType FROM lsmfhx.v_realtime where RecordTime BETWEEN '2016-09-20 13:00:00' AND  '2016-09-21 13:46:00' AND MediumType = 0 and (SiteNo in (1) ) ORDER BY RecordTime

总是报错:Method createColumn() is not implemented for data type Set。我尝试了将MediumType条件删掉,或者将SiteNo in删掉,都可以执行。后来通过升级了数据库版本,将版本从19.17升级到19.20就解决了相关的问题。(忘记截图了)

6.no further information

当我使用只读用户进行JDBC用户连接的时候,出现了no further information错误。

通过查看日志文件,发现原来是因为我的配置文件配置错误,导致服务器停止运行了。日志文件所在位置:/var/log/clickhouse-server

参考文章:
1.clickhouse设置密码登录以及只读账号
2.database - 无法启动Clickhouse服务,.. / data / default / 中的文件过多
3.clickhouse 安装 使用 (写了很多不常见的细节,比如错误日志的文件,比如mysql数据类型对比)

7.Cannot reserve 1.00 MiB, not enough space

这个问题,多半就是磁盘空间满了
(1) 我刚开始尝试,使用:set max_map_count to 1048576,不起作用。

(2) 然后我使用了:df -hl查看磁盘的剩余空间,发现真的是满了。

其中的/dev/mapper/cl-root使用了100%。当我使用vim编辑的时候,也是会出现:Can’t write viminfo file /root/.viminfo.tmp!这个问题

(3) 根据相关参考文章,我尝试使用下面的命令,查找大文件

1
2
3
4
5
6
7
8
9
10
11
## 查看磁盘剩余情况
df -hl

## 查找全局大文件
find / -xdev -size +100M -exec ls -l {} \;

## 进入文件目录,查看文件大小
du -sh *

## 使用rm 命令删除文件
rm -rf *
参考文章:
1.Cannot reserve 1.00 MiB, not enough space (这里说其实是因为磁盘的可用空间已经满了)
1.DB::ErrnoException: Allocator: Cannot malloc 1.00 MiB., errno: 12, strerror: Cannot allocate memory (这里有人说是设置set max_map_count to 1048576,但是我没有成功)
2.LFAlloc exhaust vma limit (vm.max_map_count)
3./dev/mapper/cl-root 100%满了 (查找大文件,然后进行删除)
4.Linux 查看文件夹大小,磁盘剩余空间(du/df) (查看磁盘空间)
5.centos /dev/mapper/cl-root 100% 解决方法 (查找大文件,然后进行删除)

8.service clickhouse-server status:clickhouse-server service is stopped

使用service clickhouse-server status命令查看clickhouse的运行状态,显示的是:clickhouse-server service is stopped,但是使用:clickhouse-client 命令进行连接,却显示已经连接上了。

先使用kill命令将clickhouse进程杀死,然后重新启动。

参考文章:
1.Centos/8: sysV vs systemd mess. Service status is ‘stopped’ although it is running
2.service clickhouse-server status returns clickhouse-server service is stopped despite it running (这是在docker中进行的安装,和我的真机运行有些差距)
3.Clickhouse常见问题 (这里有相关的log查看说明)
4.ClickHouse进程杀不掉 (进程杀不掉,其实是因为clickhouse有自动重启的机制)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。