将 AWS S3 连接到 Databricks PySpark

Posted

技术标签:

【中文标题】将 AWS S3 连接到 Databricks PySpark【英文标题】:Connect AWS S3 to Databricks PySpark 【发布时间】:2019-11-04 14:02:18 【问题描述】:

我正在尝试使用 databricks pyspark 从 s3 存储桶连接和读取我的所有 csv 文件。当我使用具有管理员访问权限的存储桶时,它可以正常工作

data_path = 's3://mydata_path_with_adminaccess/'

但是当我尝试连接到一些需要 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 的存储桶时,它将无法工作并且访问被拒绝:

我试过了:

data_path = 's3://mydata_path_without_adminaccess/'

AWS_ACCESS_KEY_ID='my key'
AWS_SECRET_ACCESS_KEY='my key'

和:

data_path = ='s3://<MY_ACCESS_KEY_ID>:<My_SECRET_ACCESS_KEY>@mydata_path_without_adminaccess

【问题讨论】:

【参考方案1】:

我不确定您是否尝试过使用 secret 和 keys 将存储桶安装在数据块中,但值得尝试:

这是相同的代码:

ACCESS_KEY = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
SECRET_KEY = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")
ENCODED_SECRET_KEY = SECRET_KEY.replace("/", "%2F")
AWS_BUCKET_NAME = "<aws-bucket-name>"
MOUNT_NAME = "<mount-name>"

dbutils.fs.mount("s3a://%s:%s@%s" % (ACCESS_KEY, ENCODED_SECRET_KEY, AWS_BUCKET_NAME), "/mnt/%s" % MOUNT_NAME)
display(dbutils.fs.ls("/mnt/%s" % MOUNT_NAME))

然后您可以像访问本地文件一样访问 S3 存储桶中的文件:

df = spark.read.text("/mnt/%s/...." % MOUNT_NAME)

补充参考:

https://docs.databricks.com/data/data-sources/aws/amazon-s3.html

希望对你有帮助。

【讨论】:

谢谢。我也尝试安装,但收到错误“范围不存在秘密:aws 和密钥”。虽然我可以将我的 python 会话与该密钥连接起来!【参考方案2】:

要使用访问密钥将 S3 与数据块连接,您只需将 S3 挂载到数据块上即可。它在数据块中创建指向您的 S3 存储桶的指针。 如果您已经有一个秘密存储在数据块中,请按以下方式检索它:

access_key = dbutils.secrets.get(scope = "aws", key = "aws-access-key")
secret_key = dbutils.secrets.get(scope = "aws", key = "aws-secret-key")

如果您没有存储在 Databricks 中的秘密,请尝试下面的代码以避免“秘密不存在于范围内”错误

access_key = "your-access-key"
secret_key = "your-secret-key"

#Mount bucket on databricks
encoded_secret_key = secret_key.replace("/", "%2F")
aws_bucket_name = "s3-bucket-name"
mount_name = "Mount-Name"
dbutils.fs.mount("s3a://%s:%s@%s" % (access_key, encoded_secret_key, aws_bucket_name), "/mnt/%s" % mount_name)
display(dbutils.fs.ls("/mnt/%s" % mount_name))

如下访问您的 S3 数据

mount_name = "mount-name"
file_name="file name "
df = spark.read.text("/mnt/%s/%s" % (mount_name , file_name))
df.show()

【讨论】:

以上是关于将 AWS S3 连接到 Databricks PySpark的主要内容,如果未能解决你的问题,请参考以下文章

将外部域名连接到AWS S3网站

AWS s3bucket“只能将str(不是“NoneType”)连接到str”

将 Databricks 集群与本地计算机 (AWS) 连接

如何将 S3 托管的前端连接到 Elastic beanstalk 托管的后端?

将 DataBricks 连接到 Azure Blob 存储

我有一个连接到 S3 以存储图像的 Django Web 应用程序,不知道如何组合 python 代码