好问题!我会尽力为您解答这些问题。
挂载只是一个连接(链接到 s3/外部存储),没有任何内容存储在 DBFS 上,还是实际上将数据存储在 DBFS 上?我在某处读到 DBFS 也已挂载?我的理解是 DBFS 是数据块存储,我怎样才能看到 DBFS 可用的总存储空间是多少?
DBFS 是 S3 之上的一个抽象层,让您可以像访问本地文件系统一样访问数据。默认情况下,当您部署 Databricks 时,您会创建一个用于存储并可通过 DBFS 访问的存储桶。当您挂载到 DBFS 时,您实际上是将 S3 存储桶挂载到 DBFS 上的路径。更多详情here.
我们为公司的不同团队提供不同的集群,我无法访问所有集群,在从 s3 导出数据时,我是否必须在我的代码中设置一些东西,以确保不属于我正在使用的集群的其他用户无法访问我在数据块中创建的数据框和表。
将 S3 存储桶挂载到 DBFS 上的路径将使您的 Databricks 工作区中的其他人可以使用该数据。如果要确保没有其他人可以访问数据,则必须采取两个步骤。首先,使用 IAM 角色而不是挂载,并将授予对 S3 存储桶的访问权限的 IAM 角色附加到您计划使用的集群。其次,将对集群的访问限制为只有那些可以访问数据的人。这样您就可以锁定哪些集群可以访问数据,以及哪些用户可以访问这些集群。
数据库表存储在哪里?它在 DBFS 上吗?在存储选项方面,除了数据库、DBFS、外部(s3、azure、jdbc/odbc 等)还有其他存储吗?
数据库表存储在 DBFS 上,通常在 /FileStore/tables 路径下。阅读更多here。
当我们加载表/数据框时,它们是否总是存储在内存中?有没有办法查看内存中文件大小的限制?
这取决于您的查询。如果您的查询是SELECT count(*) FROM table,那么是的,整个表被加载到内存中。如果您正在过滤,那么 Spark 将尝试提高效率,并且只读取执行查询所需的表的那些部分。文件大小的限制与集群的大小成正比。 Spark 将跨集群对内存中的数据进行分区。如果您的内存仍然不足,那么通常是时候增加集群的大小或优化您的查询了。 Databricks 上的自动缩放有助于前者。
谢谢!
不客气!
编辑:
在内存中指的是 RAM,DBFS 不做任何处理。要查看可用空间,您必须登录 AWS/Azure 帐户并检查与 Databricks 关联的 S3/ADLS 存储。
如果您通过 Spark API 保存表,它们也将位于 FileStore/tables 路径上。 UI 利用相同的路径。
集群由驱动节点和工作节点组成。如果需要,您可以为驱动程序使用不同的 EC2 实例。这是一个系统,该系统就是集群。
Spark 支持对与表关联的 parquet 文件进行分区。事实上,这是提高查询性能的关键策略。按您在查询中常用的谓词进行分区。这与内存中的分区是分开的。