乐趣区

关于存储:通用数据保护条例的监管下你的数据湖断舍离了吗

通用数据保护条例 (GDPR) 是当今技术世界中的重要法规,也是泛滥在亚马逊云科技私有云当中建设解决方案的用户们所必须遵循的数据处理要求。GDPR 中提出一项“删除权”,或者叫“被忘记权”条款,要求通过施行相干解决方案保障删除特定用户的集体数据。

在亚马逊云科技大数据与剖析生态系统的背景之下,每一套架构,无论其面向怎么的指标,都须要应用 Amazon Simple Storage Service(Amazon S3) 作为外围存储服务。只管 Amazon S3 领有丰盛的性能选项与完整性,但却 短少一种开箱即用的机制将用户标识符同蕴含用户数据的 Amazon S3 对象映射起来

在本文中,咱们将介绍一套框架,帮忙革除您组织中的亚马逊云科技托管数据湖内的各特定用户数据 。此外,咱们还将独特理解一套由 多种不同亚马逊云科技存储层形成的剖析解决方案,以及针对 Amazon S3 的示例代码

  • Amazon Simple Storage Service
    https://aws.amazon.com/cn/s3/

📢  想要理解更多数据湖仓的相干常识?敬请关注亚马逊云科技中国峰会北京站的大数据与智能湖仓分论坛!更多最新技术公布和实际翻新的内容尽在 8.19-20 北京、9.15 深圳分会,快来点击图片报名吧~

参考架构

为了解决数据革除框架施行中的种种挑战,咱们在这里将问题简化为一个简略用例,即如何在应用亚马逊云科技作为数据管道的平台当中实现用户数据删除。下图阐明了用例的根本状况。

咱们引入了建设并保护索引元存储库的想法,该存储库可能跟踪每位用户的记录地位,帮忙咱们高效找出这些地位,从而放大搜寻空间。

您能够应用以下架构,在组织的亚马逊云科技数据湖内删除特定用户的数据。

对于此初始版本,咱们创立了三个用户流,这些用户流负责将各项任务与适合的亚马逊云科技服务映射起来:

用户流 1:实时元数据存储更新

Amazon S3 ObjectCreated 或 ObjectDelete 事件会触发一项 Amazon Lambda 函数,此函数将解析对象并执行增加 / 更新 / 删除操作,以使元数据索引放弃最新。您也能够为任意其余存储层建设相似的简略工作流,具体包含 Amazon Relational Database Service(RDS),Amazon AuroraAmazon Elasticsearch Service(ES)。在本示例中,咱们应用 Amazon DynamoDBAmazon RDS for PostgreSQL作为索引元数据存储选项,这里应用的具体方法宽泛实用于其余技术场景。

  • Amazon Relational Database Service
    https://aws.amazon.com/cn/rds/
  • Amazon Aurora
    https://aws.amazon.com/cn/rds…
  • Amazon Elasticsearch Service
    https://aws.amazon.com/cn/ela…
  • Amazon DynamoDB
    https://aws.amazon.com/cn/dyn…
  • Amazon RDS for PostgreSQL
    https://aws.amazon.com/cn/rds…

用户流 2:革除数据

当用户要求删除其数据时,咱们会通过 Amazon CloudWatch 触发一个 Amazon Step Functions 状态机来协调工作流。第一步是触发 Lambda 函数,由该函数查问元数据以辨认出蕴含用户记录的存储层,并将生成的报告保留在 Amazon S3 报告存储桶内。接下来,由基于 Lambda Node JS 的工作节点创立并获取 Amazon Step Functions 流动,并通过 Amazon Simple Email Service(SES) 将带有批准及回绝链接的电子邮件发送给审核人员。

  • Amazon Simple Email Service
    https://aws.amazon.com/cn/ses/

下图所示为亚马逊云科技管理控制台上显示的 Amazon Step Functions 状态机根本架构。

审核人员从两条链接中抉择其一,而后调用 Amazon API Gateway 端点,由该端点调用 Amazon Step Functions 以复原工作流。如果抉择批准链接,则 Amazon Step Functions 将触发一项 Lambda 函数,此函数将存储桶内的报告作为输出,据此删除存储层内的对象或记录,而后更新索引元存储库。在革除作业实现之后,Amazon Simple Notification Service(SNS)会向用户发送操作胜利或失败的告诉邮件。

  • Amazon Simple Notification Service
    https://aws.amazon.com/cn/sns…

下图所示,为革除流程胜利实现之后,管制台上的理论 Step Functions 执行流。

对于残缺代码库,请参阅 GitHub repo 中的 step-function-definition.json 文件。

  • step-function-definition.json
    https://github.com/aws-sample…

用户流 3:批量元数据存储更新

此用户流次要面向须要创立索引元存储的现有数据湖用例。您能够通过 Amazon Step Functions 进行流程编排,将历史数据作为输出并通过批处理作业更新元存储库。本文中的实现计划并不蕴含此用户流的示例脚本。

咱们的框架

当初,咱们将具体介绍实现过程中应用的两个用例:

  • 您在每个 Amazon S3 文件中存储有多条用户记录
  • 用户将各记录存储在同类 Amazon Web Service 存储层内

以这两种用例为根底,咱们将演示实现索引元数据存储的几种代替办法。

按 Amazon S3 URI 与行号建设索引

在此用例中,咱们能够应用收费的 Amazon RDS Postgres 实例实现索引存储。首先,应用以下代码创立一个简略表:

CREATE UNLOGGED TABLE IF NOT EXISTS user_objects (
                userid TEXT,
                s3path TEXT,
                recordline INTEGER
            );

您能够按 user_id 建设索引,借此优化查问性能。在上传对象时,您须要在 user_objects 表中插入用于标识用户 ID 的行、标识指标 Amazon S3 对象的 URI,以及对应的行记录。例如,当上传以下 JSON 输出时,请输出以下代码:

{"user_id":"V34qejxNsCbcgD8C0HVk-Q","body":"…"}
{"user_id":"ofKDkJKXSKZXu5xJNGiiBQ","body":"…"}
{"user_id":"UgMW8bLE0QMJDCkQ1Ax5Mg","body":"…"}

咱们将 Amazon S3 地位 s3://gdpr-demo/year=2018/month=2/day=26/input.json 元组信息插入到 user_objects 表中,详见以下代码:

(“V34qejxNsCbcgD8C0HVk-Q”,“s3://gdpr-demo/year=2018/month=2/day=26/input.json”, 0)
(“ofKDkJKXSKZXu5xJNGiiBQ”,“s3://gdpr-demo/year=2018/month=2/day=26/input.json”, 1)
(“UgMW8bLE0QMJDCkQ1Ax5Mg”,“s3://gdpr-demo/year=2018/month=2/day=26/input.json”, 2)

您能够在任意 Amazon S3 ObjectCreated 事件上触发 Lambda 函数,借此实现对索引的更新操作。

当咱们收到来自用户的删除申请时,则须要查问索引以获取对于数据存储地位的相干信息。具体请参见以下代码:

SELECT s3path,
                ARRAY_AGG(recordline)
                FROM user_objects
                WHERE userid =‘V34qejxNsCbcgD8C0HVk-Q’GROUP BY;

以上示例 SQL 查问将返回如下行:

(“s3://gdpr-review/year=2015/month=12/day=21/review-part-0.json“, {2102,529})

输入表明,Amazon S3 对象 s3://gdpr-review/year=2015/month=12/day=21/review-part-0.json 中的第 529 行与第 2102 行中蕴含申请的用户数据,须要革除。接下来,咱们须要下载对象、删除这些行,而后笼罩对象。对于实现此性能的 Lambda 函数的 Python 实现,请参阅 GitHub repo 中的deleteUserRecords.py

  • deleteUserRecords.py
    https://github.com/aws-sample…

可用记录行可能帮忙咱们以字节格局高效执行删除操作。为了简化施行过程,咱们应用空的 JSON 对象替换已删除的行,借此疾速实现行革除。此项操作只会带来大量存储开销,且打消了对索引内的后续元数据行进行更新的高老本操作需要。要打消空 JSON 对象,咱们能够采纳离线 vaccum 配合索引更新的形式。

按文件名索引,按索引键分组

在此用例中,咱们创立了一个 Amazon DynamoDB 表以存储索引信息。之所以抉择 Amazon DynamoDB,是因为其领有良好的易用性与可扩展性;您能够应用按需计费模型,因而无需猜想可能须要的具体容量单位。在将文件上传至数据湖后,Lambda 函数将解析文件名(例如 1001-.csv)以标记用户标识符,并据此填充 Amazon DynamoDB 元数据表。Userid 为分区键,每个不同存储层都领有本人的属性。例如,如果用户 1001 在 Amazon S3 及 Amazon RDS 中领有数据,则其记录将相似于以下模式:

{"userid:": 1001, "s3":{"s3://path1", "s3://path2"}, "RDS":{"db1.table1.column1"}}

对于此性能的 Python 实例示例,请参阅 GitHub repo 中的 update-dynamo-metadata.py。

  • update-dynamo-metadata.py
    https://github.com/aws-sample…

依据删除申请,咱们须要查问元数据存储表(即 Amazon DynamoDB)并生成革除报告,该报告中蕴含对于那些存储层内蕴含用户记录的详细信息,同时提供有助于放慢记录查找速度的其余提示信息。咱们将革除报告存储在 Amazon S3 当中。对于实现此逻辑的示例 Lambda 函数,请参阅 GitHub repo 中的generate-purge-report.py

  • generate-purge-report.py
    https://github.com/aws-sample…

在革除取得批准之后,咱们将应用革除报告作为输出,借此删除所有对应资源。对于 Lambda 函数的实现示例,请参阅 GitHub repo 中的gdpr-purge-data.py

  • gdpr-purge-data.py
    https://github.com/aws-sample…

实现与技术代替计划

咱们摸索并评估了多种实现计划,意识到不同的计划各有千秋、也都在某些方面有所斗争,包含实现形式的简略性、执行效率、要害数据合规性以及性能完整性等等:

扫描数据文件中的每条记录以创立索引—每次上传文件时,咱们都会遍历其记录并生成元组(蕴含 userid, s3Uri,row_number),而后将其插入至咱们的元数据存储层内。在删除申请时,咱们将获取所申请的用户 ID 的元数据记录,下载相应的 Amazon S3 对象,就地执行删除,而后从新上传通过更新的对象以笼罩现有对象。这是最为灵便的实现办法,因为其反对通过繁多对象存储多个用户的数据,也成为目前最为常见的广泛实现办法。但灵活性也有其代价,因为过程中须要下载并从新上传对象,因而删除操作往往会带来网络瓶颈。用户流动数据集(例如客户产品评论)就特地适宜应用此种办法,因为各个分区(例如日期分区)中简直很少呈现同一用户公布多条记录的状况,且最好是将多个用户的流动合并到繁多文件当中。参考按 Amazon S3 URI 与行号建设索引局部的阐明,您能够在 GitHub repo 当中找到相干示例代码。

  • GitHub repo
    https://github.com/aws-sample…

将元数据存储为文件名前缀—在按查问模式定义的不同分区之下,将用户 ID 设定为上传对象的名称前缀,可能帮忙咱们缩小删除申请所须要的搜寻操作。元数据处理实用程序可能从文件名中间接查找用户 ID,并相应执行索引保护操作。这种办法可能带来极高的资源革除效率,但每个对象只能对应一个用户,且要求咱们将用户 ID 存储在文件名当中,这有可能与信息安全要求相违反。这套计划特地适宜治理点击流数据,在此类数据流中,会话期间繁多日期分区上的繁多用户将产生多个点击事件。依据咱们之前在按文件名索引、按索引键分组局部的阐明,您能够从 GitHub rep 中下载相干代码库。

  • GitHub rep
    https://github.com/aws-sample…

应用元数据文件—除了上传新对象之外,咱们还能够上传可供索引工具应用的元数据文件,借此创立并保护最新索引。依据删除申请,咱们能够查问索引、借此将咱们指向须要革除的记录地位。此办法最适宜在上传新对象时,同步上传对应元数据文件的状况(例如上传多媒体数据)。在其余场景下,在每一次上传对象时都同时上传元数据文件,可能给资源容量带来惨重压力。

应用亚马逊云科技服务的标签性能—每当有新文件被上传至 Amazon S3 时,咱们都会应用 Put Object Tagging Amazon S3 操作为用户标识增加键值对。而每当呈现用户数据删除申请时,即可应用该标签获取对象并将其删除。应用现有 Amazon S3 API 即可轻松实现这套计划,整个过程相当轻松易行。但这套计划也面临着诸多限度,其假设 Amazon S3 对象与用户之间始终为 1:1 的关系(每个对象仅蕴含繁多用户的数据);此外,基于标签进行对象搜寻的办法效率不高,且将用户标识存储为标签模式的作法也可能有违组织内的信息安全要求。

应用 Apache Hudi—Apache Hudi 曾经成为 Amazon S3 之上实现记录层级数据删除性能的一种十分风行的抉择。Hudi 的最新版本仅限于 Amazon EMR 应用,因而只适宜从零开始构建数据湖的用户,即要求您在创立过程中将数据存储为 Hudi 数据集模式。Hudi 我的项目自身相当沉闷,预计其后续还将迎来更多功能,并与更多亚马逊云科技服务实现集成。

  • Amazon EMR
    http://aws.amazon.com/emr

在具体方法的抉择当中,咱们始终要求将数据存储层与元数据存储层辨别开来。因而,这里提出的各种设计方案具备良好的通用性,可能直接插入任何现有数据管道当中。与抉择数据存储层类似,大家在抉择存储索引计划时也须要思考到以下重要因素:

申请并发性—如果不打算同时插入过多申请,您甚至能够思考间接将 Amazon S3 这类简略存储计划作为初始索引选项。但如果须要面向泛滥用户解决多项并发写入,则最好抉择那些具备更强事务处理能力的服务。

思考团队的现有专业知识与基础设施 —在本文中,咱们演示了如何应用 Amazon DynamoDB 与 Amazon RDS Postgres 存储及查问元数据索引。如果您的团队在这方面没有任何教训,而且对 Amazon ES,Amazon DocumentDB(兼容 MongoDB) 或者其余存储层的成果根本称心,无妨间接应用。另外,如果您曾经领有一套具备冗余容量的 MySQL 数据库,也能够将其作为索引实现计划以节约经营老本。

  • Amazon DocumentDB (兼容 MongoDB)
    https://aws.amazon.com/cn/doc…

索引大小—元数据的体量往往要比理论数据低几个量级。然而,随着数据集规模的显著增长,您可能须要思考采纳具备弱小可扩大能力的分布式存储解决方案,借此替换传统的关系数据库管理系统。

总结

GDPR 的颁布给最佳实际带来重大影响,也为数据湖的设计与施行引入了一系列额定的技术挑战。心愿本文中提出的参考架构与脚本,可能帮忙大家以合乎 GDPR 要求的形式实现数据删除。

如果您有任何倡议或意见,包含您所在组织内领有更好的数据删除解决方案,请在评论区中与咱们分享。

本篇作者

George Komninos

亚马逊云科技

数据实验室解决方案架构师

他帮忙客户将创意灵感转化为可用于生产环境的数据产品。在退出亚马逊云科技之前,他在 Alexa Information Domain 公司负责数据工程师达 3 年之久。工作之余,George 青睐足球运动,也是希腊奥林匹亚科斯队的铁杆球迷。

Sakti Mishra

亚马逊云科技

数据实验室解决方案架构师

他帮忙客户设计数据分析解决方案,借此放慢客户的现代化转型之旅。在工作之余,Sakti 喜爱学习新技术、看电影和旅行。

退出移动版