写在前面
ClickHouse 目前支持两种磁盘,DiskLocal 和 DiskS3, 即本地磁盘和 S3 对象存储。前两天分别探讨了ClickHouse 和 S3 结合的三种方式,
今天介绍第四种方法,而且不仅仅支持 S3。
利用 Fuse 技术,可以让 Clickhouse 及其它应用轻松把数据存储在云端。本文初步测试了 3 款利用 Fuse 技术把云存储(包括 S3)虚拟为本地磁盘(Posix 文件系统)的软件。
测试环境
MinIO 运行在 macOS 主机上 ClickHouse 和三款被测软件均在 Ubuntu 上
s3fs[1]
S3fs 是基于 FUSE 的文件系统,允许 Linux 和 Mac Os X 挂载 S3 的存储桶在本地文件系统,S3fs 能够保持对象原来的格式。
详细使用可以参考, 利用 S3fs 在 Amazon EC2 Linux 实例上挂载 S3 存储桶[2]
因为测试结果不理想,步骤简化下,有兴趣的可以自行展开。
安装配置
$ sudo apt install s3fs
sudo mkdir /mnt/clickhouse
sudo chown -R clickhouse:clickhouse /mnt/clickhouse
echo minio:miniostorage> /etc/passwd-s3fs
chmod 600 /etc/passwd-s3fs
sudo chown clickhouse:clickhouse /etc/passwd-s3fs
sudo -u clickhouse s3fs s3fs /mnt/clickhouse \
-o passwd_file=/etc/passwd-s3fs \
-o url=http://192.168.25.144:9000/ \
-o use_path_request_style
测试
CREATE TABLE sales_s3fs
(
`Region` text,
`Country` text,
`Item Type` text NULL,
`Sales Channel` text NULL,
`Order Priority` text NULL,
`Order Date` DateTime NULL,
`Order ID` Int8 NULL,
`Ship Date` DateTime NULL,
`Units Sold` Int8 NULL,
`Unit Price` FLOAT NULL,
`Unit Cost` FLOAT NULL,
`Total Revenue` FLOAT NULL,
`Total Cost` FLOAT NULL,
`Total Profit` FLOAT NULL
)
ENGINE = MergeTree
PARTITION BY Region
ORDER BY Country;
zcat sales_5m.csv.gz \
|clickhouse-client -d default \
--format_csv_delimiter="," \
--date_time_input_format=best_effort \
-q 'INSERT into sales_s3fs FORMAT CSVWithNames'
当引擎为 MergeTree 时,导入失败,为 Log 的时候,导入成功。
测试失败,放弃。
JuiceFS[3]
支持更多的云服务 元数据(Metadata) 保存在 redis 数据存在云端
下载安装
juicefs 使用 redis 来存储元数据,因此需要安装 redis。
wget https://github.com/juicedata/juicefs/releases/download/v0.11.0/juicefs-0.11.0-linux-amd64.tar.gz
tar xf juicefs-0.11.0-linux-amd64.tar.gz
sudo apt install redis
格式化
./juicefs format --storage minio \
--bucket http://192.168.25.144:9000/jfs \
--access-key minio --secret-key=miniostorage \
localhost jfs
映射
sudo mkdir /mnt/jfs
sudo chown -R clickhouse:clickhouse /mnt/jfs
sudo -u clickhouse ./juicefs mount localhost /mnt/jfs
更新 config.xml 里 path 为 mnt/jfs 重启 ClickHouse Server 验证
SELECT
name,
path,
type
FROM system.disks;
┌─name────┬─path───────────────┬─type──┐
│ default │ /mnt/jfs/ │ local │
└─────────┴────────────────────┴───────┘
SELECT
policy_name,
volume_name,
volume_priority,
disks
FROM system.storage_policies;
┌─policy_name─┬─volume_name─┬─volume_priority─┬─disks───────┐
│ default │ default │ 1 │ ['default'] │
└─────────────┴─────────────┴─────────────────┴─────────────┘
测试
CREATE TABLE sales_jfs
(
`Region` text,
`Country` text,
`Item Type` text NULL,
`Sales Channel` text NULL,
`Order Priority` text NULL,
`Order Date` DateTime NULL,
`Order ID` Int8 NULL,
`Ship Date` DateTime NULL,
`Units Sold` Int8 NULL,
`Unit Price` FLOAT NULL,
`Unit Cost` FLOAT NULL,
`Total Revenue` FLOAT NULL,
`Total Cost` FLOAT NULL,
`Total Profit` FLOAT NULL
)
ENGINE = MergeTree
PARTITION BY Region
ORDER BY Country;
zcat sales_5m.csv.gz \
|clickhouse-client -d default \
--format_csv_delimiter="," \
--date_time_input_format=best_effort \
-q 'INSERT into sales_jfs FORMAT CSVWithNames'
SELECT
Region,
count(*) AS cnt
FROM sales_s3
GROUP BY Region;
┌─Region────────────────────────────┬─────cnt─┐
│ Europe │ 1296674 │
│ Asia │ 729864 │
│ North America │ 108131 │
│ Sub-Saharan Africa │ 1297687 │
│ Australia and Oceania │ 405577 │
│ Central America and the Caribbean │ 540528 │
│ Middle East and North Africa │ 621539 │
└───────────────────────────────────┴─────────┘
7 rows in set. Elapsed: 0.289 sec. Processed 5.00 million rows, 124.22 MB (17.30 million rows/s., 429.75 MB/s.)
Goofys[4]
支持多种云存储
准备工作 下载 goofys 安装 MinIO 或者使用 MinIO play,并创建 bucket 创建/mnt/goofy,并赋予 clickhouse 读写权限 设置 clickhouse 用户的默认 home 目录
clickhouse 目录默认没有自己的 home,但 goofys 默认从$HOME/.aws/credentials
读取账户信息。
sudo usermod -m -d /home/clickhouse clickhouse
并在/home/clickhouse/.aws/credentials
里写入如下信息,
play 部分是用于不想本地安装 MinIO 但仍想测试的,对应的 endpoint 是 play.min.io:9000 minio 是我在本地安装的 MinIO, 对应的 endpoint 是http://192.168.25.144:9000/
cat .aws/credentials
[play]
aws_access_key_id=Q3AM3UQ867SPQQA43P2F
aws_secret_access_key =zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
[minio]
aws_access_key_id=minio
aws_secret_access_key=miniostorage
运行 goofys
sudo -u clickhouse ./goofys \
--debug_fuse --profile minio \
--endpoint http://192.168.25.144:9000/ \
goofys /mnt/goofys
sudo -u clickhouse: 以 clickhouse 用户身份运行 goofys profile : minio(就是上面配置的 credentials) endpoint: http://192.168.25.144:9000/ bucket :goofys mountpoint:/mnt/goofys debug_fuse : 输出 fuse debug 信息
修改 clickhouse 的 config.xml
把默认的<path>/var/lib/clickhouse/</path>
改为<path>/mnt/goofys</path>
重启 clickhouse server
验证(略) 测试
与 JuiceFS 一样,成功,因为都是做本地盘使用,所以可以支持更多引擎
CREATE TABLE test(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)ENGINE = EmbeddedRocksDB PRIMARY KEY key
总结
结果如下,
s3fs(部分失败) Juicefs(成功) Goofys(成功)
目前只是做了初步尝试, 也为更多本地应用入云做个尝试。
参考资料
[1]
s3fs: https://github.com/s3fs-fuse/s3fs-fuse
[2]利用 S3fs 在 Amazon EC2 Linux 实例上挂载 S3 存储桶: https://aws.amazon.com/cn/blogs/china/s3fs-amazon-ec2-linux/
[3]JuiceFS: https://github.com/juicedata/juicefs
[4]Goofys: https://github.com/kahing/goofys
欢迎关注公众号

有兴趣加群讨论数据挖掘和分析的朋友可以加我微信(witwall),暗号:入群

也欢迎投稿!




