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