最近尝试在Macbook上部署Clickhouse学习使用,在此记录下相关经验和问题
安装部署
Clickhouse主要针对Linux系统进行开发,尽管也有针对Mac OS的安装包,但官方文档中说不推荐使用。因此,为了最接近原生Linux版本的Clickhouse运行的效果,尝试使用Docker进行部署安装。
可以按照Clickhouse中Docker hub上的官方文档:clickhouse/clickhouse-server - Docker Image | Docker Hub执行docker run命令来进行安装。但为了避免输入一长串Docker容器的启动命令,同时方便之后修改容器相关配置,我个人更偏好使用Docker-compose启动容器。具体的docker-compose.yml文件内容为:
version: '2'
services:
clickhouse-server:
image: clickhouse/clickhouse-server
container_name: clickhouse-server
ulimits:
nofile:
soft: 262144
hard: 262144
ports:
- 8123:8123
- 9000:9000
- 9004:9004
volumes:
- /etc/localtime:/etc/localtime
- ./ch_data:/var/lib/clickhouse/
- ./ch_logs:/var/log/clickhouse-server/
- ./user:/root/data/
restart: always
mem_limit: 2048m
Docker-compose.yml参数分析
接下来一个个对参数进行分析:
- ulimits是用于控制shell程序的资源限制的命令,由于在官方Docker文档中的启动命令加了该参数,所以这里也加上了。个人理解去掉这个参数也问题不大
- 端口
- 8123端口是clickhouse提供的http协议端口,第三方的数据库管理工具如DBeaver在连接clickhouse时使用的就是该端口号
- 9000端口是clickhouse原生连接工具使用的TCP协议端口,理论上使用该端口进行数据库连接的性能应该优于8123端口,但目前官方并没有给出在该端口上规范的协议定义,因此实际上只有clickhouse自己的原生连接工具支持该端口。这里开放该端口的原因是,如果本地下载了官方提供的二进制包,可以在不启动服务端(clickhouse-server)的情况下,只使用里面的客户端工具(clickhouse-client)连接到Docker中的服务端。个人测试过直接使用clickhouse-client导入较大的csv数据时的速度优于在DBeaver中导入相同的数据,且clickhouse-client中可以在线读取一个较大数据集并导入(即官方文档中的英国房地产支付价格),且中途不会报超时,而我在DBeaver中执行相同的导入命令时,过了一会儿就报超时并且停止了导入操作。
- 9004端口是Clickhouse提供的模拟MySQL协议的端口,官方文档中声称可以使用在该端口上使用MySQL协议连接到Clickhouse数据库。开放该端口主要是测试一下是不是真的能实现用MySQL连接工具访问Clickhouse
- volumes
- /etc/localtime用于将本地时区和Docker内的时区同步,要不然可能会出现不可预料的错误
- /var/lib/clickhouse/是clickhouse存储数据的地方,挂载到宿主机后,即便容器被删除,下次重新启动里面的数据依然存在
- /var/log/clickhouse-server/是clickhouse存放日志文件的地方,可以查看其中的日志文件进行分析错误等操作
- 最后/root/data/是我自己为了方便Docker内读取宿主机文件创建的目录,只要直接把文件放在./user文件夹下,在Docker容器内就可以访问到
- restart:设置下次启动Docker时自动启动该容器
- mem_limit:给该容器分了2G内存。因为Clickhouse非常吃CPU和内存资源,而我只是学习使用,不太希望它占用过多的资源导致我其他应用运行不了,因此限制了内存使用量
测试数据导入和查询操作
在docker-compose.yml对应的目录下执行docker-compose up即可启动clickhouse容器。该clickhouse容器的默认用户名是default,密码为空。
为了测试clickhouse对数据的处理能力,我根据官方文档中提供的蜂窝信号塔数据使用方法,首先创建了相关表,之后下载了csv数据,并将它放到宿主机中和docker-compose.yml文件同个目录的./user目录下,再使用docker exec -it clickhouse-server bash
命令进入容器,到/root/data文件夹下执行命令:clickhouse-client --query "INSERT INTO cell_towers FORMAT CSVWithNames" < cell_towers.csv
。成功导入数据。
之后可以在clickhouse-client里面执行文档中后续的SQL语句查看结果,但为了更方便后续管理,我在DBeaver工具中执行查询语句。如查询各个移动国家代码(MCC)对应的蜂窝信号塔数量:
个人感觉查询速度确实非常快
测试使用MySQL协议访问
之后为了验证是否真的可以使用MySQL客户端工具来在9004端口上连接Clickhouse,我尝试了多种工具。
首先依然是DBeaver,尝试直接在9004端口上创建一个MySQL连接,但是报错了:
之后是MySQL官方的图形化管理工具MySQL Workbench,同样也报错:
这时候我感觉已经希望不大了,抱着最后试一试的心情,根据Clickhouse官方文档中的方法直接使用本地MySQL的命令行客户端连接:mysql --protocol tcp -u default -P 9004
。
结果竟然成功了:
这说明在使用特定工具的情况下用MySQL协议直接访问Clickhouse确实是可行的。
趁热打铁,我又使用pymysql工具尝试连接Clickhouse,代码如下:
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(host='localhost',
port=9004,
user='default',
password='',
database='default',
cursorclass=pymysql.cursors.DictCursor)
with connection:
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT avg(samples) FROM cell_towers"
cursor.execute(sql)
result = cursor.fetchone()
print(result)
结果是令人欣喜的,确实可以输出结果:
这表明可以在不添加额外工具的情况下,直接使用pymysql访问clichouse数据库进行数据分析操作
问题
在clickhouse的Docker hub文档中,提到可挂载的目录除了我在上面提到的,还包括:
/etc/clickhouse-server/config.d/*.xml
- files with server configuration adjustmenets 存服务端的配置文件/etc/clickhouse-server/users.d/*.xml
- files with user settings adjustmenets 存用户设置信息/docker-entrypoint-initdb.d/
- folder with database initialization scripts (see below). 存启动脚本
最后一个启动脚本我没试,因为我也不打算修改。我尝试挂载前面的配置文件目录和用户设置目录,具体方法是在docker-compose.yml的volumes部分增加配置项,变为:
volumes:
- /etc/localtime:/etc/localtime
- ./ch_data:/var/lib/clickhouse/
- ./ch_logs:/var/log/clickhouse-server/
- ./user:/root/data/
- ./ch_config:/etc/clickhouse-server/config.d/
- ./ch_usersetting:/etc/clickhouse-server/users.d/
但启动容器后在宿主机上查看对应的配置文件和用户设置目录里面内容都是空的,这导致我没法修改这些配置信息,只能使用clickhouse的默认配置。如果有大佬知道如何成功挂载这些配置文件并修改,还请多多指教,在此先谢谢了!