连接到 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 中数据的弃用模式
下面是已弃用的存储模式:
- Databricks 不再建议将外部数据位置装载到 Databricks 文件系统。 请参阅在 Azure Databricks 上装载云对象存储。
重要
- S3A 文件系统默认启用缓存,并在“FileSystem.close ()”上发布资源。 为了避免其他线程错误地使用对缓存文件系统的引用,请勿显式使用“FileSystem.close()”。
- 关闭输出流时,S3A 文件系统不会删除目录标记。 旧版应用程序基于不包括 HADOOP-13230 的 Hadoop 版本,会将目录标记误解为空目录(即使里面有文件)。