The Linux Foundation Projects
Delta Lake

政府机构间使用 Delta Sharing 进行数据共享

作者:Li YuMubashir KaziaJon D. CeanfaglionePrabha RajendranPurushotam ShresthaShawn A. Benjamin

简介

Delta Sharing 是业界首个用于安全数据共享的开放协议,于 2021 年推出。Delta Sharing 简化了与其他组织的数据共享过程,无论他们使用何种计算平台。借助 Delta Sharing,组织可以轻松共享现有的 P 级别数据集,而无需不必要地复制数据。

数据共享已成为机器学习和数据分析最重要的组成部分之一。例如,政府机构的数据和机器学习团队经常需要使用来自其他机构的外部数据来丰富他们自己的数据集。在本博客中,我们将讨论 Delta Sharing 如何在美国公民及移民服务局 (USCIS) 部署和增强,以满足多项机构间数据共享要求。

架构概述

Delta Sharing 涉及两方:数据提供者和数据接收者。数据提供者生成 Delta Lake 表,可以利用 Delta Sharing 将其 Delta 表或表的特定版本共享给数据接收者。数据提供者可以配置他们可以共享的数据,并通过 Delta Sharing 服务器控制访问数据的权限。数据接收者可以从各种 Delta Sharing 客户端中选择连接并读取共享数据。

Delta Sharing 平台包括两个组件:客户端和服务器。Delta Sharing 服务器是开放 REST 协议的实现,它定义了 Delta 表如何根据客户端的请求共享数据。在该部署中,服务器是访问 Azure、GCP、AWS 中原始 Delta 文件并向客户端提供 预签名 S3 URL 的组件。它由数据提供者部署和管理。客户端由数据接收者调用,负责向服务器发出所有 REST 请求。客户端根据服务器提供的 S3 URL 创建 pandas 或 Apache Spark™ 数据帧。下图显示了部署概述。

在 USCIS 的实现中,Delta Sharing 服务器使用 EKS 集群进行部署。Delta Sharing 服务器位于 Apigee envoy sidecar 代理之后,该代理本身位于 Apigee 之后。Apigee 处理令牌管理。

  • 步骤 1:获取 JWT:数据接收者(客户端)需要向 Apigee 请求 JWT。JSON Web Token (JWT) 是一种开放标准,定义了如何在各方之间安全地传输信息作为 JSON 对象。

  • 步骤 2:从 Delta Sharing 服务器检索预签名 S3 URL:客户端将使用该令牌发送数据共享请求。部署的 Delta Sharing 服务器通过假定与 Pod 的服务帐户关联的 IAM 角色来访问底层云存储。共享服务器部署中没有硬编码的凭据和密钥。

  • 步骤 3:通过预签名 S3 URL 从 S3 检索文件:数据访问请求经过身份验证后,共享服务器将为请求的对象创建预签名文件 URL 列表,并将其作为响应发送回客户端。客户端将从检索到的 S3 URL 创建数据帧。

数据访问控制

前述步骤中生成的预签名 S3 URL 仅在短时间内有效,这确保了数据访问仅在 Apigee JWT 有效期间被允许。一旦预签名 URL 或 Apigee 令牌过期,数据接收者必须重新进行身份验证。共享服务器容器通过 Kubernetes 服务帐户承担 IAM 角色。下面是将 IAM 角色与 Kubernetes 服务帐户关联,然后在使用该服务帐户进行部署的示例

apiVersion: v1
kind: ServiceAccount
metadata:
 name: delta-sharing-server
 namespace: delta-share
 annotations:
   eks.amazonaws.com/role-arn: arn:aws:iam::111111111111:role/DeltaShareAssumeRoleWebIdentity
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deltashare
  labels:
    app.kubernetes.io/name: deltashare
    app.kubernetes.io/instance: deltashare
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: deltashare
      app.kubernetes.io/instance: deltashare
  template:
    metadata:
      labels:
        app.kubernetes.io/name: deltashare
        app.kubernetes.io/instance: deltashare
    spec:
      volumes:
        - name: config
          configMap:
            name: dss-config
      serviceAccountName: delta-share-server

共享服务器使用 Apache Hadoop 的 hadoop-aws 模块进行 AWS 集成。可以创建名为 core-site.xml 的 Hadoop 配置文件并将其添加到共享服务器的 conf 目录中。在 core-site.xml 文件中,凭证提供程序(即 fs.s3a.aws.credentials.provider)需要配置为 WebIdentityTokenCredentialsProvider

<?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
        <property>
          <name>fs.s3a.aws.credentials.provider</name>
          <value>com.amazonaws.auth.WebIdentityTokenCredentialsProvider</value>
        </property>
    </configuration>

为了打包身份提供程序的实现,需要将 aws-java-sdk-bundle 添加到 build.sbt 中。

"com.amazonaws" % "aws-java-sdk-bundle" % "1.11.1034"

完成上述配置后,将向客户端发送包含预签名 URL 的响应。预签名 URL 就像持有者令牌一样,任何拥有它们的人都将能够访问云存储上的数据。为了进一步限制访问,可以在存储桶策略中添加条件,要求请求只能来自特定的 VPC,如下面的代码片段所示。

statement {
	sid = "AccessToSpecificVPConly"
	actions = ["s3:*"]
	effect = "Deny"
	resources = ["arn:aws:s3:::${var.bucket_name}/${var.demo_folder_name}", "arn:aws:s3:::${var.bucket_name}/${var.demo_folder_name}/*"]
	condition {
  	test = "StringNotEquals"
  	variable = "aws:SourceVpc"
  	values = ["${var.source_vpc}"]
    }
  }

API 访问控制

对共享数据集的 API 调用由 Delta Sharing 服务器前面的 API 网关保护。在此示例中,Delta Sharing API 的调用者由 Apigee 授予唯一的 ID 和密钥,以获取短时 JWT。所有 API 调用都需要 JWT 才能向 Delta 共享服务进行身份验证。要使用 Delta Sharing Python 连接器读取共享数据,JWT 需要存储在共享 配置文件中。

这是一个共享配置文件的示例

{
  "shareCredentialsVersion": 1,
  "endpoint": "http://<sharing server ip>:<port>/delta-sharing/",
  "bearerToken": "<JWT>",
  "expirationTime": "2022-11-12T00:12:29.0Z"
}

Delta Sharing 服务器托管着一组要与数据接收者共享的 Delta 表。表集合在 Sharing 服务器的 server.yaml 文件中定义。server.yaml 文件的路径可以使用命令行选项 --config /config/delta-sharing-server.yaml 为共享服务器进行配置

Apigee 为开发者生成 API 密钥以访问 Delta Sharing 产品,其中 API 端点的访问由应用程序注册管理。开发者应用程序可以注册多个产品。如上图所示,“开发者应用程序 1”可以注册使用产品 1 和 2。对表集的精细用户访问权限在 Apigee 产品级别定义。

总结

在本博客中,我们描述了如何使用 Delta Sharing 技术将 Delta Sharing 服务器部署到生产环境中,以支持政府机构之间的数据共享。在本例中,Delta Sharing 服务器部署在 EKS 中。我们讨论了 Delta Sharing 服务器如何通过使用 Apigee 来保护请求。我们还提供了有关如何使用 IAM 角色保护底层数据以及如何从使用服务帐户的 Kubernetes Pod 中承担角色的详细信息。Delta Sharing 也可以扩展以支持非结构化数据。

如果您想立即试用 Delta Sharing,可以在此处找到本博客中提供的所有代码和配置文件。有兴趣成为 Delta Sharing 的贡献者吗?立即加入我们的公共 Slack 频道