介绍
- ClickHouse可能更适合流式或批次入库的时序数据。ClickHouse不应该被用作通用数据库
- ClickHouse是一个超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询更快,因此通常情况下在MySQL上进行聚合。
- ClickHouse是一个数据分析的数据库,那么存储的数据应当是最终成型的结果
CH的一些限制
- 不支持真正的删除/更新支持 不支持事务(与Spark和大部分大数据系统一样)
- 不支持二级索引(和Spark和大部分大数据系统一样)自己的协议(不支持MySQL协议)
- 有限的SQL支持,join实现与众不同。如果需要在从MySQL或Spark进行迁移,则可能必须重新编写包含联接的所有查询。
- 不支持窗口功能
单机安装及运行
ubuntu安装
centos7 安装
- 需要以rpm包的形式进行安装
- 下载地址:https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/ https://repo.yandex.ru/clickhouse/ ,下载完成后手动安装每个包
安装顺序
1.clickhouse-server-common-18.12.17-1.el7.x86_64.rpm
2.clickhouse-common-static-18.12.17-1.el7.x86_64.rpm
# 这一步会提示缺少依赖
# libicudata.so.50()(64bit) 被 clickhouse-common-static-18.12.17-1.el7.x86_64 需要
# libicui18n.so.50()(64bit) 被 clickhouse-common-static-18.12.17-1.el7.x86_64 需要
# libicuuc.so.50()(64bit) 被 clickhouse-common-static-18.12.17-1.el7.x86_64 需要
# 通过 yum install *libicudata* 安装后解决
3.clickhouse-server-18.12.17-1.el7.x86_64.rpm
4.clickhouse-client-18.12.17-1.el7.x86_64.rpm
- 安装过程中,可能会提示需要依赖,参考以下解决
- 如果上述方式解决不了,暴力方式
yum install *libicudata*
,我以此方式解决问题 - Linux rpm安装到指定的目录:
运行
-
sudo service clickhouse-server start
可能无法启动,原因是权限问题,根据提示修改权限即可 - 日志所在位置
/var/log/clickhouse-server/ directory
- 配置文件所在位置
/etc/clickhouse-server/config.xml
- 如果要执行有换行的格式化的sql语句,需要使用
clickhouse-client --multiline
(简写 -m) 才可以
测试过程中发现的注意事项
- Date类型,如果是从csv文件导入,那么csv中的时间有无双引号不影响插入数据
- Decimal类型的数据,需要在建表前设置全局可用 在clickhouse-client内执行
set allow_experimental_decimal_type=1;
,不需要设置Decimal128,Decimal64等,直接使用Decimal ( 38, 6 )
也就是直接用Decimal替换了oracle中的NUMBER类型 - 执行sql语句时,字符串不能是双引号,只能是单引号
mysql类型和clickhouse数据类型的对应关系
tinyint UInt8 / Int8
smallint UInt16 / Int16
int / mediumint UInt32 / Int32
bigint UInt64 / Int64
float Float32
double Float64
date Date 似乎不能为空 有可以表达的范围差异
datetime DateTime 有可以表达的范围差异
timestamp DateTime
binaryFixed String
除上述以外 String
- kettle导出csv文件的处理,时间为null时,因为不知道如何处理clickhouse中时间为空的情况,因此将其全部替换成了0000-00-00(此为官方文档中写明最小值)
- 经测试直接从mysql导入数据,会自动将空的时间填充为0000-00-00,和上述方式一致,猜测Date类型不能为空,字符串类型不存在此问题
- 注意kettle导出csv文件时,设置字符集为utf-8
# 从mysql导入数据至clickhouse中
CREATE TABLE company
ENGINE = MergeTree
ORDER by id as
select *
from mysql('192.168.3.191:3306', 'ganji', 'company', 'root', 'abcd34')
配置远程访问
vim /etc/clickhouse-server/config.xml
解除以下两项的注释并修改第二项为本机ip
<listen_host>::1</listen_host> # ipv6访问
<listen_host>本机ip</listen_host> # ipv4访问
配置完成,即可通过浏览器远程访问http端口了,默认是8123端口
http接口测试
- http接口可以执行select create insert drop等等命令
http://192.168.3.191:8123 - 可以使用get和post请求均可,由于get请求url长度限制,使用post请求
- 主要参数:
- query:此参数值为要执行的sql语句,注意sql语句中不要有双引号
- database:此参数用来指定默认数据库,如default ,system,也可以在sql语句中表名前使用点指定数据库
- compress:指定此参数为1,则服务器会压缩数据返回,暂未测试出有什么用
- decompress:指定此参数为1,服务器会解压缩post请求中携带的数据,未测试
以上两种压缩与解压缩,以什么格式进行压缩和解压缩不清楚 - user:用户名,默认名是default
- password:密码,默认密码是空
- session_id:任意字符串
- 使用标准的基于gzip的http压缩
- 要发送使用gzip压缩的POST请求,请附加请求标头Content-Encoding:gzip。
- 为了让ClickHouse使用gzip压缩响应,您必须将Accept-Encoding:gzip附加到请求标头,并启用ClickHouse的setting中的
enable_http_compression
。 - 还可以在参数中携带设置setting内容的参数
用户及密码设置
- 配置用户名及密码在
/etc/clickhouse-server/users.xml
中,配置方法文件内有说明,或参考 ,关于sha256加密的生成使用python来生成,文件内提供的shell方式,生成的密码是随机值,不清楚如何指定 - 使用用户名密码进入客户端:
clickhouse-client -u username -h 192.168.0.10 --password mc1lF9cI
- sha256加密后:abcd@1234 = ‘345616f307c62eaf232f2d5e25c430958023c91436d2ef2caebb5b866b07ecd1’
- 自设用户名为root,密码abcd@1234,使用default数据库,权限和default用户雷同
<root>
<password_sha256_hex>345616f307c62eaf232f2d5e25c430958023c91436d2ef2caebb5b866b07ecd1</password_sha256_hex>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<allow_databases>
<database>default</database>
</allow_databases>
</root>
卸载后重新安装
卸载
- rpm安装,注意使用rpm卸载
提示冲突
- rpm conflicts with file from package
原因:因为之前安装过
解决:rpm -ivh --force RPM包名
docker官方镜像
kettle迁移oracle至mysql
基本操作
kettle大数据量读写mysql性能优化