暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse与开源的Amazon S3对象存储

ClickHouse开发者 2021-04-01
1880

 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 Stringvalue 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种方法。

参考资料

[1]

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


欢迎关注公众号


关注 「 ClickHouse开发者 」 , 获取更多技术干货

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

参考资料

[1]

PR: https://github.com/ClickHouse/ClickHouse/pull/11058

文章转载自ClickHouse开发者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论