相关 PR
https://github.com/ClickHouse/ClickHouse/pull/11058
什么是 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/s3Endpoint: http://192.168.25.144:9000 http://192.168.64.1:9000 http://127.0.0.1:9000RootUser: minioRootPass: miniostorageBrowser Access: http://192.168.25.144:9000 http://192.168.64.1:9000 http://127.0.0.1:9000Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide $ mc alias set myminio http://192.168.25.144:9000 minio miniostorageObject 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-guideIAM 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 miniostorageAdded `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
欢迎关注公众号


开发者小编补充:文章中提到的如何使用在 S3 上使用 ClickHouse,社区现在也有一个PR[1]大家也可以参考使用。
参考资料
PR: https://github.com/ClickHouse/ClickHouse/pull/11058




