使用本地文件加载Maxmind数据到Clickhouse字典的路径报错问题
问题核心原因
ClickHouse 字典的 SOURCE(File) 配置读取的是 ClickHouse 服务端节点的本地文件系统路径,而非你运行 clickhouse-client 的客户端机器路径,你将CSV文件存放在运行客户端的远程机器上,ClickHouse 服务端自然无法访问到该文件。
可行解决方案
- 方案1:将CSV文件同步到所有ClickHouse服务端节点的对应路径下
- 先修正路径拼写:你报错日志中出现了
\home的反斜杠路径,Linux系统路径需使用正斜杠/,先确认字典定义中的路径为/home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv - 给ClickHouse运行用户(默认是
clickhouse)授予文件及上层目录的读取权限,执行命令:
chown -R clickhouse:clickhouse /home/ubuntu/maxmind_csv/ - 先修正路径拼写:你报错日志中出现了
- 方案2:使用HTTP源替代本地文件源
把CSV文件上传到所有ClickHouse服务端节点都可访问的内部静态文件服务上,修改字典的SOURCE配置即可:
该方案无需在每个服务节点存储文件,更适合集群部署场景。SOURCE(HTTP( url 'http://你的内部文件服务地址/GeoLite2-City-Locations-en.csv' format 'CSVWithNames')) - 方案3:先导入数据到ClickHouse内部表,再关联字典
如果你不想调整服务端文件或部署文件服务,可以先把客户端本地数据导入ClickHouse普通表,再将字典的数据源指向该内部表:- 提前创建结构匹配的普通表,再从客户端执行导入命令:
clickhouse-client --query "INSERT INTO 你的库.你的表名 FORMAT CSVWithNames" < /home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv- 修改字典的SOURCE配置:
SOURCE(CLICKHOUSE( TABLE '你的表名' DB '你的库名' ))
额外排查项
如果已经将文件放到服务端仍报错,可登录到对应服务端节点,切换到clickhouse用户后执行以下命令,验证是否有权限访问文件:
sudo -u clickhouse ls /home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv
若提示无权限,需逐层调整上层目录的访问权限。
内容的提问来源于stack exchange,提问作者ewcvis
相关产品推荐
相关产品推荐

