s3 select - 介绍

gsalomon

s3select illustration

什么是 ceph/s3select?

2020年7月,s3select 被引入到 Ceph 上游,这是一个开源软件包。S3select 是另一个 S3 请求,它使客户端能够将 SQL 语句(根据 AWS 规范)推送到 Ceph 存储中。

我们需要它做什么?它有什么用?

为了回答这个问题,我们需要详细说明一下推断范式。推断范式是关于将操作移动(“推送”)到数据附近。这与通常的做法相反,即将数据移动到操作的“位置”。在大数据生态系统中,这会产生很大的影响。

为了执行

select sum( x + y) from s3object where a + b > c

这个 SQL 查询必须将整个对象提取到客户端,然后才能使用分析应用程序执行操作。使用推断 (s3-select),整个操作都在服务器端执行,并且仅将结果返回到客户端。

应该注意的是,将操作推到数据附近并不容易;存储通常是碎片化的,并分成随机的块。这使得在许多随机块上执行单个查询变得困难。此外,这些对象的类型在某些情况下可能是二进制的。

s3select 能做什么?

Ceph S3 select 是一个类似 SQL 的引擎。其属性可以在 此处 查看。

S3select 不会将 S3 存储变成数据库,但它大大提高了 SQL 处理的效率。

S3select 属性嵌入到 GetObject 模块中,这使其对于推断操作非常高效。

当 SQL 查询被推断时,对象被提取(与 GetObject 请求相同),并且对象的每个片段都由 s3select 模块处理。(对于 Parquet,对象不会被提取。稍后会解释)。

由于 S3select 嵌入到 S3 系统中,因此没有冗余的字节副本,对象会立即被处理,并且结果会发送回客户端。

用于 CSV、JSON 和 Parquet 的不同数据源读取器与 SQL 引擎分离,因此相同的 SQL 引擎正在处理这些不同的对象类型。这使得引入其他读取器(例如 ORC)更快。

为什么使用 SQL?

要问的问题是,机器学习需要什么?

SQL 是机器学习的查询语言,因为它是一种用于访问和操作数据的标准语言。

应该注意的是,SQL 是一种特定领域的语言(超过 40 年!)最初是为操作数据而设计的。

在机器学习工作流程中,数据是主要来源,其准确性和相关性对于成功的建模和模式检测至关重要。因此,确保数据以机器学习算法可以使用的适当格式化非常重要。

此外,在后续段落中,讨论了一种名为 Trino 的分析工具,它可以对 SQL 语句执行推断操作,从而将其作为 S3-select 请求执行。这大大减少了网络消耗并提高了整体性能。

鉴于它能够读取和处理常见数据源,如 CSV、JSON 和 Parquet,S3Select 是机器学习目的的宝贵工具。

为什么使用 S3 存储?

S3 存储可靠、高效、廉价、可扩展,并且已经包含 数万亿个对象。它包含许多 CSV、JSON 和 Parquet 对象,这些对象包含大量需要分析的数据。

典型的 Ceph 用户可能会随着时间的推移积累大量的对象。这些对象包含大量的结构化和非结构化数据,这些数据以“冷”状态存储。尽管这些数据具有潜在价值,但从存储中提取这些数据可能会在网络和 CPU 资源方面产生高昂的成本。

使用 s3select 可以大大降低这种成本。

我们的目标是将 CEPH 对象存储对分析操作更具吸引力,而不仅仅是存储数据。

Parquet 与 CSV 和 JSON

parquet illustration

Apache Parquet 是一种列式存储文件格式,专为大数据环境中的高效数据存储和处理而设计。Parquet 以列而不是行存储数据。

这意味着相同数据类型的数据存储在一起,这使得压缩和查询数据更容易。

每个列都分为行组,行组进一步分为页。这些页使用压缩算法进行压缩以节省存储空间。

处理 CSV 或 JSON 对象时,必须扫描整个对象。无法仅提取相关的列和行。

对于 Parquet 对象,情况不同。引擎会分析查询,并使用 s3-range-request 和 apache-parquet-reader 仅提取相关的列。

这样可以减少服务器端的读取操作量。

将 Trino 与 Ceph s3select 集成

最近我们一直在探索 Trino 应用程序以及将其与 Ceph/s3select 集成的好处。

Trino 的优点显而易见。

它是一个完整的 SQL 引擎。

它的引擎能够推断 s3select 请求;这一点值得进一步解释,在发出 SQL 语句时,Trino 引擎会识别哪些 SQL 语句部分在服务器端执行成本效益更高。

本质上,Trino 利用 Ceph/s3select 的优化规则来提高其性能。

通过利用 Ceph 的可扩展性,Trino 能够将原始对象分成多个相等的部分,为每个部分执行 s3select 请求,并合并结果。这种方法可以显着提高查询性能。

最近的 AWS/Trino 的出版物 表明,使用 Trino 与 Amazon EMR 上的 Amazon S3 Select 运行查询,性能提高了 9 倍。