日记账导出输出于 QLDB - 亚马逊 Quantum Ledger 数据库(亚马逊QLDB)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

日记账导出输出于 QLDB

重要

终止支持通知:现有客户将能够使用亚马逊,QLDB直到 2025 年 7 月 31 日终止支持。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL e。

除了包含您的QLDB日记块的数据对象外,Amazon 日记导出任务还会写入两个清单文件。这些文件都保存在导出请求指定的 Amazon S3 存储桶中。以下章节介绍每个输出对象的格式和内容。

注意

如果您指定JSON导出任务的输出格式,则在导出的数据对象JSON中QLDB将 Amazon Ion 日志数据向下转换为。有关更多信息,请转至 向下转换为 JSON

清单文件

Amazon 在提供的 S3 存储桶中为每个导出请求QLDB创建两个清单文件。初始清单文件将在您提交导出请求后立即创建。最终清单文件是在导出完成后写入的。您可以使用这些文件来检查 Amazon S3 中导出作业的状态。

清单文件内容的格式与请求的导出输出格式相对应。

初始清单

初始清单表明您的导出作业已启动。它包含您传递给请求的输入参数。除了 Amazon S3 目标以及导出的开始和结束时间参数外,此文件还包含一个 exportIdexportId是QLDB分配给每个导出任务的唯一 ID。

文件命名约定如下。

s3://amzn-s3-demo-bucket/prefix/exportId.started.manifest

下面是 Ion 文本格式的初始清单文件及其内容示例。

s3://amzn-s3-demo-bucket/journalExport/8UyXulxccYLAsbN1aon7e4.started.manifest
{ ledgerName:"my-example-ledger", exportId:"8UyXulxccYLAsbN1aon7e4", inclusiveStartTime:2019-04-15T00:00:00.000Z, exclusiveEndTime:2019-04-15T22:00:00.000Z, bucket:"amzn-s3-demo-bucket", prefix:"journalExport", objectEncryptionType:"NO_ENCRYPTION", outputFormat:"ION_TEXT" }

outputFormat只有在导出请求中指定时,初始清单才会包含该清单。如果您没有指定输出格式,导出的数据将默认为 ION_TEXT

DescribeJournalS3Export API 操作和导出的 Amazon S3 对象的内容类型也表明了输出格式。

最终清单

最终清单表示特定日记账的导出作业已完成。导出作业为每个分支写入一个单独的最终清单文件。

注意

在 Amazon 中QLDB,分支是账本日记账的分区。QLDB目前仅支持单链日记。

最终清单包括导出期间写入的数据对象密钥的有序列表。文件命名约定如下。

s3://amzn-s3-demo-bucket/prefix/exportId.strandId.completed.manifest

strandId是QLDB分配给链的唯一 ID。下面是 Ion 文本格式的最终清单文件及其内容示例。

s3://amzn-s3-demo-bucket/journalExport/8UyXulxccYLAsbN1aon7e4.JdxjkR9bSYB5jMHWcI464T.completed.manifest
{ keys:[ "2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.1-4.ion", "2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.5-10.ion", "2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.11-12.ion", "2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.13-20.ion", "2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.21-21.ion" ] }

数据对象

Amazon 以 Amazon Ion 的文本或二进制格式或JSON行文本格式在提供的 Amazon S3 存储桶中QLDB写入日记数据对象。

在 Lin JSON es 格式中,导出的数据对象中的每个块都是由换行符分隔的有效JSON对象。您可以使用这种格式将JSON导出内容直接与分析工具集成,例如 Amazon Athena 和 AWS Glue 因为这些服务可以自动解析以换行符JSON分隔。有关格式的更多信息,请参阅JSON行

数据对象名称

日记账导出作业使用以下命名约定写入这些数据对象。

s3://amzn-s3-demo-bucket/prefix/yyyy/mm/dd/hh/strandId.startSn-endSn.ion|.json
  • 每个导出作业的输出数据都被分成多个块。

  • yyyy/mm/dd/hh— 您提交导出请求的日期和时间。在同一小时内导出的对象是按相同的 Amazon S3 前缀进行分组。

  • strandId— 包含要导出的日记账区块的特定链的唯一 ID。

  • startSn-endSn— 对象中包含的序列号范围。序列号指定区块在链中的位置。

例如,假设您指定以下路径。

s3://amzn-s3-demo-bucket/journalExport/

您的导出作业会创建一个类似于以下的 Amazon S3 数据对象。此示例显示了 Ion 格式的对象名称。

s3://amzn-s3-demo-bucket/journalExport/2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.1-5.ion

数据对象内容

每个数据对象都包含以下格式的日记账区块对象。

{ blockAddress: { strandId: String, sequenceNo: Int }, transactionId: String, blockTimestamp: Datetime, blockHash: SHA256, entriesHash: SHA256, previousBlockHash: SHA256, entriesHashList: [ SHA256 ], transactionInfo: { statements: [ { //PartiQL statement object } ], documents: { //document-table-statement mapping object } }, revisions: [ { //document revision object } ] }

区块是在事务过程中提交到日记账的对象。区块包含事务元数据、以及代表事务中提交的文档修订版本条目、和提交这些修订的 PartiQL 语句。

以下是一个带有 Ion 文本格式样本数据的模块示例。有关块对象字段的更多信息,请参阅Amazon 中的期刊内容 QLDB

注意

数据块示例仅用于参考。显示的哈希值并非实际计算的哈希值。

{ blockAddress:{ strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:1234 }, transactionId:"D35qctdJRU1L1N2VhxbwSn", blockTimestamp:2019-10-25T17:20:21.009Z, blockHash:{{WYLOfZClk0lYWT3lUsSr0ONXh+Pw8MxxB+9zvTgSvlQ=}}, entriesHash:{{xN9X96atkMvhvF3nEy6jMSVQzKjHJfz1H3bsNeg8GMA=}}, previousBlockHash:{{IAfZ0h22ZjvcuHPSBCDy/6XNQTsqEmeY3GW0gBae8mg=}}, entriesHashList:[ {{F7rQIKCNn0vXVWPexilGfJn5+MCrtsSQqqVdlQxXpS4=}}, {{C+L8gRhkzVcxt3qRJpw8w6hVEqA5A6ImGne+E7iHizo=}} ], transactionInfo:{ statements:[ { statement:"CREATE TABLE VehicleRegistration", startTime:2019-10-25T17:20:20.496Z, statementDigest:{{3jeSdejOgp6spJ8huZxDRUtp2fRXRqpOMtG43V0nXg8=}} }, { statement:"CREATE INDEX ON VehicleRegistration (VIN)", startTime:2019-10-25T17:20:20.549Z, statementDigest:{{099D+5ZWDgA7r+aWeNUrWhc8ebBTXjgscq+mZ2dVibI=}} }, { statement:"CREATE INDEX ON VehicleRegistration (LicensePlateNumber)", startTime:2019-10-25T17:20:20.560Z, statementDigest:{{B73tVJzVyVXicnH4n96NzU2L2JFY8e9Tjg895suWMew=}} }, { statement:"INSERT INTO VehicleRegistration ?", startTime:2019-10-25T17:20:20.595Z, statementDigest:{{ggpon5qCXLo95K578YVhAD8ix0A0M5CcBx/W40Ey/Tk=}} } ], documents:{ '8F0TPCmdNQ6JTRpiLj2TmW':{ tableName:"VehicleRegistration", tableId:"BPxNiDQXCIB5l5F68KZoOz", statements:[3] } } }, revisions:[ { hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}} }, { blockAddress:{ strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:1234 }, hash:{{t8Hj6/VC4SBitxnvBqJbOmrGytF2XAA/1c0AoSq2NQY=}}, data:{ VIN:"1N4AL11D75C109151", LicensePlateNumber:"LEWISR261LL", State:"WA", City:"Seattle", PendingPenaltyTicketAmount:90.25, ValidFromDate:2017-08-21, ValidToDate:2020-05-11, Owners:{ PrimaryOwner:{ PersonId:"GddsXfIYfDlKCEprOLOwYt" }, SecondaryOwners:[] } }, metadata:{ id:"8F0TPCmdNQ6JTRpiLj2TmW", version:0, txTime:2019-10-25T17:20:20.618Z, txId:"D35qctdJRU1L1N2VhxbwSn" } } ] }

revisions字段中,某些修订版本对象可能只包含一个 hash 值而不包含其他属性。这是仅供内部使用的系统修订版,不包含用户数据。导出作业将这些修订包含在各自的区块中,因为这些修订的哈希值是日记完整哈希链的一部分。加密验证需要完整的哈希链。

向下转换为 JSON

如果您指定JSON导出任务的输出格式,则在导出的数据对象JSON中QLDB将 Amazon Ion 日志数据向下转换为。但是,在某些情况下,如果您的数据使用JSON的是中不存在的丰富离子类型,则将 Ion 转换为会有损失。JSON

有关 Ion 到JSON转换规则的详细信息,请参阅 A mazon Ion Cookbook JSON 中的向下转换为

导出处理器库(Java)

QLDB为 Java 提供了一个可扩展的框架,可简化 Amazon S3 中导出的处理。该框架库处理读取导出的输出并按顺序遍历导出的区块的工作。要使用此导出处理器,请参阅 GitHub 存储库 awslabs/-java amazon-qldb-export-processor