数据块中的存储选项

5 amazon-s3 apache-spark apache-spark-sql pyspark databricks

我对 databricks 环境比较陌生。我的公司为我设置了一个 databricks 帐户,我在其中从 s3 存储桶中提取数据。我有传统关系数据库的背景,所以理解数据块对我来说有点困难。

我有以下问题:

- mount 只是一个连接(链接到 s3/外部存储),没有在 DBFS 上存储任何东西,还是它实际上将数据存储在 DBFS 上?

-我在某处读到 DBFS 也已挂载?我的理解是 DBFS 是 databricks 存储,我怎样才能看到 DBFS 可用的总存储量是多少?

-我们为公司中的不同团队提供不同的集群,我无法访问所有集群,从 s3 导出数据时,我是否必须在我的代码中设置一些东西,以确保我的数据框和表不属于我正在使用的集群的其他用户无法访问我在 databricks 中创建的内容。

- 数据库表存储在哪里?是在 DBFS 上吗?在存储选项方面,除了数据库、DBFS、外部(s3、azure、jdbc/odbc 等)之外,还有其他存储吗?

- 当我们加载表/数据框时,它们是否总是存储在内存中?有没有办法查看内存中文件大小的限制?

谢谢!

Rap*_*l K 9

好问题!我会尽力为您解答这些问题。

mount 只是一个连接(链接到 s3/外部存储),在 DBFS 上没有存储任何东西,还是它实际上将数据存储在 DBFS 上?我在某处读到 DBFS 也已挂载?我的理解是 DBFS 是 databricks 存储,我怎样才能看到 DBFS 可用的总存储量是多少?

DBFS 是 S3 之上的一个抽象层,让您可以像访问本地文件系统一样访问数据。默认情况下,当您部署 Databricks 时,您会创建一个用于存储并可通过 DBFS 访问的存储桶。挂载到 DBFS 时,实际上是将 S3 存储桶挂载到 DBFS 上的路径。更多细节在这里

我们为公司中的不同团队提供不同的集群,我无法访问所有集群,从 s3 导出数据时,我是否必须在我的代码中设置一些内容,以确保我所使用的数据框和表不属于我正在使用的集群的其他用户无法访问在 databricks 中创建。

将 S3 存储桶挂载到 DBFS 上的路径将使您的 Databricks 工作区中的其他人可以使用该数据。如果您想确保没有其他人可以访问数据,则必须采取两个步骤。首先,使用 IAM 角色而不是挂载,并将授予 S3 存储桶访问权限的 IAM 角色附加到您计划使用的集群。其次,限制对集群的访问仅限于可以访问数据的人。通过这种方式,您可以锁定哪些集群可以访问数据,哪些用户可以访问这些集群。

数据库表存储在哪里?是在 DBFS 上吗?在存储选项方面,除了数据库、DBFS、外部(s3、azure、jdbc/odbc 等)之外,还有其他存储吗?

数据库表存储在 DBFS 上,通常在/FileStore/tables路径下。在这里阅读更多。

当我们加载表/数据帧时,它们是否总是存储在内存中?有没有办法查看内存中文件大小的限制?

这取决于您的查询。如果您的查询结果为SELECT count(*) FROM tableyes,则整个表都会加载到内存中。如果您正在过滤,那么 Spark 将尝试提高效率,只读取执行查询所需的表部分。文件大小的限制与集群的大小成正比。Spark 将在整个集群的内存中对数据进行分区。如果您的内存仍然不足,那么通常是时候增加集群的大小或优化您的查询了。Databricks 上的自动缩放有助于前者。

谢谢!

别客气!

编辑:内存中是指 RAM,DBFS 不做任何处理。要查看可用空间,您必须登录 AWS/Azure 帐户并检查与 Databricks 关联的 S3/ADLS 存储。

如果您通过 Spark API 保存表,它们也会在FileStore/tables路径上。UI 利用相同的路径。

集群由驱动节点和工作节点组成。如果需要,您可以为驱动程序使用不同的 EC2 实例。这都是一个系统,该系统就是集群。

Spark 支持对与表关联的镶木地板文件进行分区。事实上,这是提高查询性能的关键策略。按您通常在查询中使用的谓词进行分区。这与内存中的分区是分开的。

  • 感谢拉斐尔的详细解释!非常感谢您的帮助。几个后续问题:- Q1。In-memory是指集群的RAM吗?我使用的集群具有 r5.4xlarge、128.0 GB 内存、16 核、3.6 DBU 配置。那么在这种情况下我的内存可以处理高达 128GB 的​​数据吗?如果数据为 200GB,那么剩余的 72GB 将在内存为 128GB 的​​ DBFS 上处理?Q2。有没有办法查看可用 DBFS 的大小与已用空间的大小? (2认同)