ClickHouse与开源的Amazon S3对象存储
什么是 Amazon S3
Amazon Simple Storage Service (Amazon S3[1]) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种用例(如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的数据,容量不限。Amazon S3 提供了易于使用的管理功能,因此您可以组织数据并配置精细调整过的使用权限控制,从而满足特定的业务、组织和合规性要求。Amazon S3 可达到 99.999999999%(11 个 9)的持久性,并为全球各地的公司存储数百万个应用程序的数据。
另外什么是 Lakehouse(湖仓一体)里提到,
虽然
分布式文件系统
可以用于存储层,但对象存储
更常用在 Lakehouse 中。对象存储提供低成本、高可用性的存储,适合大规模并行读取——这是现代数据仓库的基本要求。
Amazon S3 开源方案
Amazon S3 是亚马逊最早推出的云服务之一,经过多年的发展,S3 协议在对象存储行业事实上已经成为标准,既然已经作为标准,肯定少不了开源实现,即使没有注册亚马逊云服务,一样可以体验 S3,如今天用安装(甚至可以不用安装)简单便捷的 MiniO Server 来体验下 S3。
MinIO[2] 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
它的服务端只有一个文件,minio,客户端也只有一个文件,mc。
官网提供了多种安装运行方式,最简单的莫过于直接下载运行。这里就不展开介绍 MinIO 的强大了
服务端
$ wget https://dl.min.io/server/minio/release/darwin-amd64/minio
$ chmod +x minio
$ ./minio server /data
我测试用的命令是,
$ MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=miniostorage minio server --address=:9000 /Users/steven/data/s3
Endpoint: http://192.168.25.144:9000 http://192.168.64.1:9000 http://127.0.0.1:9000
RootUser: minio
RootPass: miniostorage
Browser Access:
http://192.168.25.144:9000 http://192.168.64.1:9000 http://127.0.0.1:9000
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
$ mc alias set myminio http://192.168.25.144:9000 minio miniostorage
Object API (Amazon S3 compatible):
Go: https://docs.min.io/docs/golang-client-quickstart-guide
Java: https://docs.min.io/docs/java-client-quickstart-guide
Python: https://docs.min.io/docs/python-client-quickstart-guide
JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
.NET: https://docs.min.io/docs/dotnet-client-quickstart-guide
IAM initialization complete
服务起来后,浏览器访问http://127.0.0.1:9000,使用用户名(minio)和密码(miniostorage)登录后可以看到类似这样的页面(我截图的时候已经建了两个bucket,并推送了文件),
客户端
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc
$ ./mc --help
为了能访问刚起的 MinIO 服务, 按 Server 端提示执行,
#设置别名
$ mc alias set local http://192.168.25.144:9000 minio miniostorage
Added `myminio` successfully.
然后可以访问和操作 MinIO Server 了,
#创建 bucket, 名为iris
$ mc mb myminio/iris
# 从本地推送 iris.snappy.parquet 到bucket iris中
$ mc cp /Users/steven/data/iris/iris.snappy.parquet myminio/iris/
# 查看 bucket iris
$ mc ls myminio/iris
准备工作做好后,开始用 ClickHouse 访问 S3
ClickHouse 访问 S3
S3 Table Engine(S3 表引擎)
官方文档有误(也许因为版本太老的缘故)
正确的语法是,
ENGINE = S3(path, [aws_access_key_id, aws_secret_access_key,] format, [compression])
引擎参数
path
—带有文件路径的存储桶 URL。只读模式支持通配符[3]如:*
,?
,{abc,def}
和{N..M}
]。format
—文件格式[4]。compression
—压缩类型。支持的值:none,gzip / gz,brotli / br,xz / LZMA,zstd / zst。参数是可选的。默认情况下,它将通过文件扩展名自动检测压缩。
结合上面推送的 iris.snappy.parquet,一个完整的 Create Table 的例子,
CREATE TABLE iris (
Sepal_Length Float64
,Sepal_Width Float64
,Petal_Length Float64
,Petal_Width Float64
,Species String
) ENGINE = S3('http://192.168.25.144:9000/iris/*.parquet',
'minio', 'miniostorage', 'Parquet','auto')
select from iris limit 5;
┌─Sepal_Length─┬─Sepal_Width─┬─Petal_Length─┬─Petal_Width─┬─Species─┐
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ setosa │
│ 4.9 │ 3 │ 1.4 │ 0.2 │ setosa │
│ 4.7 │ 3.2 │ 1.3 │ 0.2 │ setosa │
│ 4.6 │ 3.1 │ 1.5 │ 0.2 │ setosa │
│ 5 │ 3.6 │ 1.4 │ 0.2 │ setosa │
└──────────────┴─────────────┴──────────────┴─────────────┴─────────┘
S3 Table Function(S3 表函数)
与 S3 表引擎相比,就是把 structure(表结构信息由 create table 移到了参数里),
select * from s3('http://192.168.25.144:9000/iris_csv/iris.csv'
, 'minio', 'miniostorage', 'CSVWithNames'
,'`Sepal.Length` Float64,`Sepal.Width` Float64,`Petal.Length` Float64,`Petal.Width` Float64,Species String','none')
limit 3;
┌─Sepal.Length─┬─Sepal.Width─┬─Petal.Length─┬─Petal.Width─┬─Species─┐
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ setosa │
│ 4.9 │ 3 │ 1.4 │ 0.2 │ setosa │
│ 4.7 │ 3.2 │ 1.3 │ 0.2 │ setosa │
└──────────────┴─────────────┴──────────────┴─────────────┴─────────┘
MinIO Play
如果你暂时不想安装 MinIO Server,可以试试免费的 MinIO Play,
MinIO Play 账户信息
"play": {
"url": "https://play.min.io",
"accessKey": "Q3AM3UQ867SPQQA43P2F",
"secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
"api": "S3v4",
"path": "auto"
}
创建一个 bucket
$ mc mb play/clickhouse
创建表
CREATE TABLE s3_play (name String, value UInt32)
ENGINE=S3('https://play.min.io/clickhouse/data.csv.gz'
,'Q3AM3UQ867SPQQA43P2F'
,'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG', 'CSV', 'gzip')
插入数据
INSERT INTO s3_play VALUES ('one', 1), ('two', 2), ('three', 3)
查询
S3 表引擎模式
select * from s3_play;
┌─name──┬─value─┐
│ one │ 1 │
│ two │ 2 │
│ three │ 3 │
└───────┴───────┘
s3 表函数模式,
select * from s3('https://play.min.io/clickhouse/data.csv.gz'
,'Q3AM3UQ867SPQQA43P2F'
,'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
, 'CSV','name String, value UInt32'
, 'gzip');
┌─name──┬─value─┐
│ one │ 1 │
│ two │ 2 │
│ three │ 3 │
└───────┴───────┘
删除数据
不支持
S3 做为 ClickHouse 数据的存储层
目前参照网上的资料还没有测试通过,待续。有兴趣的可以看看探索ClickHouse与Amazon S3结合使用的3种方法。
参考资料
Amazon S3: https://aws.amazon.com/cn/s3/
[2]MinIO: https://min.io/
[3]通配符: https://clickhouse.tech/docs/en/engines/table-engines/integrations/s3/#wildcards-in-path
[4]文件格式: https://clickhouse.tech/docs/en/interfaces/formats/#formats
欢迎关注公众号
有兴趣加群讨论数据挖掘和分析的朋友可以加我微信(witwall),暗号:入群
也欢迎投稿!