连接到 Amazon S3

本文介绍如何从 Azure Databricks 连接到 AWS S3。

使用 URI 和 AWS 密钥访问 S3 桶

可以设置 Spark 属性以配置 AWS 密钥,从而访问 S3。

Databricks 建议使用机密范围来存储所有凭据。 可以向工作区中的用户、服务主体和组授予读取机密范围的访问权限。 这将保护 AWS 密钥,同时允许用户访问 S3。 若要创建机密范围,请参阅机密范围

凭据范围可以限定为某个群集或笔记本。 将群集访问控制和笔记本访问控制一起使用,从而保护对 S3 的访问。 请参阅计算权限使用 Databricks 笔记本进行协作

若要设置 Spark 属性,请在群集的 Spark 配置中使用以下代码片段将机密范围中存储的 AWS 密钥设置为环境变量

AWS_SECRET_ACCESS_KEY={{secrets/scope/aws_secret_access_key}}
AWS_ACCESS_KEY_ID={{secrets/scope/aws_access_key_id}}

然后,可以使用以下命令从 S3 读取数据:

aws_bucket_name = "my-s3-bucket"

df = spark.read.load(f"s3a://{aws_bucket_name}/flowers/delta/")
display(df)
dbutils.fs.ls(f"s3a://{aws_bucket_name}/")

使用开源 Hadoop 选项访问 S3

Databricks Runtime 支持使用开源 Hadoop 选项配置 S3A 文件系统。 可以配置全局属性和每个桶的属性。

全局配置

# Global S3 configuration
spark.hadoop.fs.s3a.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.endpoint <aws-endpoint>
spark.hadoop.fs.s3a.server-side-encryption-algorithm SSE-KMS

每个桶的配置

使用语法 spark.hadoop.fs.s3a.bucket.<bucket-name>.<configuration-key> 配置每个桶的属性。 这样可以使用不同的凭据、终结点等设置桶。

例如,除了全局 S3 设置之外,还可以使用以下密钥单独配置每个桶:

# Set up authentication and endpoint for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.aws.credentials.provider <aws-credentials-provider-class>
spark.hadoop.fs.s3a.bucket.<bucket-name>.endpoint <aws-endpoint>

# Configure a different KMS encryption key for a specific bucket
spark.hadoop.fs.s3a.bucket.<bucket-name>.server-side-encryption.key <aws-kms-encryption-key>

用于存储和访问 Azure Databricks 中数据的弃用模式

下面是已弃用的存储模式:

重要

  • S3A 文件系统默认启用缓存,并在“FileSystem.close()”时释放资源。 为了避免其他线程错误地使用对缓存文件系统的引用,请勿显式使用“FileSystem.close()”。
  • 关闭输出流时,S3A 文件系统不会删除目录标记。 旧版应用程序基于不包括 HADOOP-13230 的 Hadoop 版本,会将目录标记误解为空目录(即使里面有文件)。