对象业务的select接口
AWS S3
官方文档
API
实现方案
接口定义
请求消息的格式,参照SelectObjectContent,如下:
POST /{Key+}?select&select-type=2 HTTP/1.1
Host: Bucket.s3.amazonaws.com
x-amz-server-side-encryption-customer-algorithm: SSECustomerAlgorithm
x-amz-server-side-encryption-customer-key: SSECustomerKey
x-amz-server-side-encryption-customer-key-MD5: SSECustomerKeyMD5
x-amz-expected-bucket-owner: ExpectedBucketOwner
<?xml version="1.0" encoding="UTF-8"?>
<SelectObjectContentRequest xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Expression>string</Expression>
<ExpressionType>string</ExpressionType>
<RequestProgress>
<Enabled>boolean</Enabled>
</RequestProgress>
<InputSerialization>
<CompressionType>string</CompressionType>
<CSV>
<AllowQuotedRecordDelimiter>boolean</AllowQuotedRecordDelimiter>
<Comments>string</Comments>
<FieldDelimiter>string</FieldDelimiter>
<FileHeaderInfo>string</FileHeaderInfo>
<QuoteCharacter>string</QuoteCharacter>
<QuoteEscapeCharacter>string</QuoteEscapeCharacter>
<RecordDelimiter>string</RecordDelimiter>
</CSV>
<JSON>
<Type>string</Type>
</JSON>
<Parquet>
</Parquet>
</InputSerialization>
<OutputSerialization>
<CSV>
<FieldDelimiter>string</FieldDelimiter>
<QuoteCharacter>string</QuoteCharacter>
<QuoteEscapeCharacter>string</QuoteEscapeCharacter>
<QuoteFields>string</QuoteFields>
<RecordDelimiter>string</RecordDelimiter>
</CSV>
<JSON>
<RecordDelimiter>string</RecordDelimiter>
</JSON>
</OutputSerialization>
<ScanRange>
<End>long</End>
<Start>long</Start>
</ScanRange>
</SelectObjectContentRequest>
响应消息的格式,参照SelectObjectContent,如下:
HTTP/1.1 200
<?xml version="1.0" encoding="UTF-8"?>
<Payload>
<Records>
<Payload>blob</Payload>
</Records>
<Stats>
<Details>
<BytesProcessed>long</BytesProcessed>
<BytesReturned>long</BytesReturned>
<BytesScanned>long</BytesScanned>
</Details>
</Stats>
<Progress>
<Details>
<BytesProcessed>long</BytesProcessed>
<BytesReturned>long</BytesReturned>
<BytesScanned>long</BytesScanned>
</Details>
</Progress>
<Cont>
</Cont>
<End>
</End>
</Payload>
接口规格
- 对象的数据格式,支持
- CSV
- JSON
- Parquet
- 支持检索压缩过的对象,支持的压缩算法
- GZIP
- BZIP2
- 数据的字符集,支持
UTF-8
。 - 支持使用SSE-C加密的对象。
- 输出检索结果时,支持
- CSV
- JSON
- 对象的大小,与现有规格保持一致。
- 使用PUT上传的对象,5GiB。
- 使用多段方式上传的对象,5TiB。
SQL的规格
- SQL子句,支持
SELECT
FROM
WHERE
LIMIT
- 数据类型,支持
- 布尔
- 整型
- 字符串
- 浮点数
- 时间戳
- 逻辑类操作符,支持
AND
NOT
OR
- 比较类操作符,支持
>
>=
<>
!=
<
<=
between
in
- 模式匹配类操作符,支持
LIKE
_
%
- 一元操作符,支持
IS NULL
IS NOT NULL
- 算术操作符,支持
+
-
*
/
%
- 关键字,参见Reserved keywords。
- 函数
- 聚合函数,支持
AVG
COUNT
MAX
MIN
SUM
- 条件函数,支持
CASE
COALESCE
NULLIF
- 类型转换函数,支持
CAST
- 日期、时间函数,支持
DATE_ADD
DATE_DIFF
EXTRACT
TO_STRING
TO_TIMESTAMP
UTCNOW
- 聚合函数,支持
业务流程
- 对象有效性校验
- 对象是否存在
- 访问权限
- 对象的格式
- 对象的加密参数
- 对象的大小
- 对象的压缩格式
- 对象的数据的字符集
- 请求消息体校验
- SQL的解析和校验
- 缓存中提取检索结果
- 缓存中提取SQL的解析结果
- 执行SQL
- 封装返回结果
技术点
- SQL解析
- 语法校验
- 转换为语法树
- 执行语法树
- SQL语法树的维护
- 缓存语法树
- 检索语法树
- 老化语法树
- 对象数据预处理
- 解密文件
- 解压缩文件
- 解析JSON格式
- 解析CSV格式
- 解析Parquet格式
- 转换为检索格式
- 检索处理
- 从检索格式的数据中提取满足要求的数据
- 缓存检索结果
- 从缓存中提取检索结果
- 老化缓存中的数据
- 查询结果返回
- 打包为CSV格式
- 打包为JSON格式
技术方案
整体方案,可以参考竞品MINIO和CEPH现有的实现方案。
SQL的解析、语法树的生成,可以基于ANTLR4实现。
对象的数据转换为检索结构,可以暂存在ElasticSearch中,支撑检索的实现。
维护缓存的算法,可以参考LRU。
对于大规格的对象,需要考虑使用并行任务框架,同步执行处理,提高处理效率。
技术规格
- 对于解压缩后的对象
- 单个对象的原始数据,占用空间的规格。
- 单个对象的原始数据,暂存的保留时长。
- 对象的原始数据占用空间的总的规格。
- 对象的数据转换为适于检索的格式后
- 单个对象的检索格式的数据,暂存的保留时长。
- 检索格式的数据,占用空间的总的规格。
- SQL解析结构
- 缓存时长。
- 占用空间的规格。
- 检索结果
- 缓存时长。
- 占用空间的规格。
参考资料
MINIO
- S3 API Compatibility
- Python Quickstart Guide
- Introducing Spark-Select for MinIO Data Lakes
- minio对象存储系统的S3 Select 实现的分析
- minio select api 试用
CEPH
Antlr4
Parquet
Elasticsearch
本文来自博客园,作者:jackieathome,转载请注明原文链接:https://www.cnblogs.com/jackieathome/p/18317377