对象业务的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

CEPH

Antlr4

Parquet

Elasticsearch

posted @ 2024-07-23 01:00  jackieathome  阅读(4)  评论(0编辑  收藏  举报