数据块中的存储选项

Storage options in databricks

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

我有以下问题:

-mount 只是一个连接(link 到 s3/external 存储),没有存储在 DBFS 上,还是它实际上将数据存储在 DBFS 上?

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

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

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

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

谢谢!

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

mount 只是一个连接(link 到 s3/external 存储)没有存储在 DBFS 上,还是它实际上将数据存储在 DBFS 上?我在某处读到 DBFS 也是挂载的?我的理解是 DBFS 是数据块存储,我怎么知道 DBFS 可用的总存储量是多少?

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

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

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

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

数据库 table 存储在 DBFS 上,通常在 /FileStore/tables 路径下。阅读更多 here.

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

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

谢谢!

不客气!

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

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

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

Spark 支持对与 tables 关联的 parquet 文件进行分区。事实上,这是提高查询性能的关键策略。按查询中常用的谓词进行分区。这与内存中的分区是分开的。