Azure Databricks 的成本管理。这图像是用 DALL-E 生成的。
前言:企业中的 DatabricksDatabricks 可以是一个非常好的平台,用于开发各种数据工程、数据科学和分析解决方案。它简化了自行部署的 Spark 环境所需的繁重基础设施任务,并提供了比单纯执行 Python、Scala、R 或 SQL 代码更多的功能。
个人项目方面,创建Databricks实例,搭建集群并直接开始开发非常容易。
然而,在企业环境中,还有很多额外的领域对于获得使用Databricks的权限,并有效利用它非常重要。
从2019年开始与Azure和Databricks合作以来,我很享受在这两个平台上构建解决方案的过程,并也很乐意指导他人如何操作。
在这个系列中,我将分享我的学习体会,以结构化的方式整理文档内容,并指明公司需要注意的关键点。
从一开始,不得不说成本管理的理论在Databricks和Microsoft的文档中解释得很到位,因为他们很清楚这是一个他们必须处理好的问题。
因此,本文的目的 不是 再次赘述相同的信息。如果你想了解更多关于集群策略、成本计算、不同运行时以及自动扩展等信息,可以在下方的参考资料和资源部分找到相关文档和官方视频链接。
相反,我想分享9个基于我的经验的考虑、想法和特点等,这些可能不是很明显,但影响重大。这也考虑到了商业、组织以及可能的人类因素。
1. 不要用DBU来计算成本Databricks的成本包括三个(或四个)部分:使用量、云基础架构和存储。另外还有其他与Databricks相关的自定义云服务,比如私有端点和防火墙,也可能导致总成本增加。
在 Databricks 中的消耗是用 DBU(Databricks 单位) 来衡量的,你可能会想说:“哦,只有 4 DBU,差不多 2 美元。”
不过,相同DBU的成本会根据你运行的工作负载有极大的不同。如图所示,在标准层里,Jobs Compute每小时一个DBU的成本为0.15美元/小时,而Serverless SQL计算每小时一个DBU的成本为0.91美元/小时!
西欧地区DBU价格(DBU价格)截至2024年7月4日
这是一个六倍的差距,我很少看到有人提到。这就是为什么用DBU简单计算成本实际上很难实现;你需要根据不同的工作负载类型调整DBU的数量。
使用 Unity Catalog,我们现在有了系统表,从而可以轻松查看 DBU 消费。结合价格列表,我们现在可以实际计算出我们的真实成本,并根据这些数据制作详细的报告。
Azure Databricks 的系统管理表(System Tables)
要查看您的定价层级如第一张图所示,高级版和标准版Databricks实例之间的差异很明显。对于大多数企业来说,来说,在实际操作中,如果想要满足网络和治理要求,同时利用Databricks提供的最新功能,在生产工作负载中使用高级实例来处理生产工作负载是不可避免的。
Databricks 提供的标准层基本上只是一个不包含许多最新功能(例如 SQL 仓库、Delta Live Tables 或 Unity Catalog)的托管 Spark 环境。此外,标准层不支持其他高级的基础设施和安全功能,比如私有连接。然而,对于某些工作负载,如果允许的话,实际上可以将两者结合起来,在开发时使用标准层,在生产中使用高级层。
Databricks 工作区创建及定价层级选择
3. 不要使用DBFS,这是Databricks文件系统除了Databricks建议不要将生产数据存储在DBFS之外(详情请参阅链接),还需要考虑成本问题。
当我们创建Azure中的Databricks资源时,它会自动创建一个托管资源组,在这里集群的虚拟机将被创建。根据不同的网络配置,该资源组还将包含有Databricks运行所需的各种资源。
此资源组还包括一个存储账户,存放在DBFS(Databricks文件系统)中的文件同样也会保存在此存储账户内。无明确位置的托管表将在此存储账户内创建。
Azure Databricks 中的资源组(管理的)
现在,此存储账户自动创建,并具有地理位置冗余存储特性,访问等级设置为“热”。这两个设置不能更改。
即使看起来不多,但每GB冷却且本地冗余的存储收费0.01美元与每GB热且多区域冗余的存储收费0.039美元(你可能其实并不一定需要这种存储)之间的差异,在你需要长时间存储数据时,每个月的费用可能达到几百到几千美元。这样的话,你可以考虑实施存档策略以利用冷却存储层级,这就需要你将数据存储在自己的存储账户中。
依我看来,所有数据都应该存放在我们能完全掌控的位置,这样也可以防止不小心删除实际数据。
本地冗余存储费用,截至2024年05月07日
Geo-冗余存储服务成本 Azure 截至2024年5月7日
4. 创建归档的方法之前提到的图片也显示,热存和冷存之间的成本差异很大。虽然在云环境中可能会觉得存储成本微不足道,但实际上这些成本确实会逐渐累积。
如果你需要处理大量需要长期存储的数据,那么对于不常访问的旧数据,将其迁移到更便宜的存储层级是有意义的。需要特别注意的是,Databricks 当前不支持像归档这样的非标准层级。
5. 使用适合的开发工具和技术我无法计算有多少次看到人们使用过大的计算集群来做不需要这么强大资源的任务。
处理少量数据不需要大型集群,编写函数或运行单元测试也不需要。Azure Databricks目前最便宜的集群大约是0.75 DBU,每小时大约0.41美元,并且使用这个集群,您可以使用所有Databricks的功能和特性,还可以连接到各种源系统。
这就是为什么我觉得很难同意这样的观点,即为了避免高昂的使用成本,发展应该在当地进行。即使由于当地环境与Databricks环境不匹配而出现一些问题,解决这些问题所需的人工成本可能会比集群成本更高。
实际上,虽然资源是可用的,但这并不意味着我们应该浪费它们。例如,我通常会创建两个集群,一个很小的集群用于简单任务,另一个强大的集群用于更接近实际生产的测试场景。
截至 2024年5月7日 Azure Databricks 最便宜的配置方案
6. 在本地环境里开发抽象逻辑虽然我不太喜欢这种方法,但如果你能建立适合自己的本地开发环境,你就能省下不少开发所需的集群费用。
可以使用 Spark 和 Delta 创建本地环境来开发和测试基础功能,然后仅将代码推送到 Databricks 进行集成和系统测试。
采用这种方法,你可以在最喜欢的IDE中工作,同时也会迫使自己创建一个清晰的规范说明,将其分解成独立且功能单一的小函数。
然而,这种方法对我来说通常不那么吸引人,因为有一些缺点,但在你的情况下,成本效益可能抵消这些缺点。
7. 不要设置低于15分钟的自动结束时间。即使将自动终止时间设置得很短以避免空闲时间,这样做可能很有诱惑力,但是将时间设置在15分钟以下就没有意义了,因为如果请求的节点需求量较大,集群启动所需时间可能需要5到7分钟左右。
此外,对于开发人员来说,专注于写代码后却不得不等待集群启动是非常沮丧的。对我来说,20到25分钟是最合适的等待时间,这帮助我保持高效的工作状态。
8 小心你的流即使启用了自动终止功能,我见过一些情况,笔记本会连续运行数周,因为人们在进行流处理的实验。他们启动了一个流处理作业,持续监控源位置进行某些测试,然后就把它忘了。
在这种情况下,集群不会停止,因为还有进程在运行。如果你同时运行很多笔记本和集群,它们可能会被忽视,或者人们可能会误认为这是一个长时间运行的测试。
9. 先教别人怎么做,再优化根据我的经验,在优化过程中,制定一套清晰的指南以帮助新用户有效地并且自觉地使用Databricks等工具非常重要。
当然,你可以制定并执行关于用户可以做什么的政策,设定预算等,这肯定会很有帮助,但可能会有你没有考虑到的情况。然后,因为有人不清楚你没有限制的一些昂贵功能,你就会收到一张高额账单。
而且,如果你只是执行政策而不向用户解释你为什么要这样做,这可能会让用户感到沮丧,因为他们会觉得无法使用某些对他们来说很有用的功能。
我相信,对于新用户来说,进行30分钟的意识提升训练比只施加限制会有很大帮助。
结论篇:我原本打算写一篇关于Databricks成本管理的全面文章,但后来发现官方文档中已经有许多很好的相关文章和指南。因此,我转而分享一些个人的经验和见解,希望这些见解能为你提供额外的帮助。
在这篇文章中,我并没有特别关注代码效率的不足。实际上,一些主要的成本驱动因素包括糟糕的架构或无法充分利用Spark/Databricks的逻辑。因此,我会特别强调教育员工如何高效地利用Databricks和Spark。
总而言之,有效的Databricks成本管理不仅仅需要理解平台的定价模式和特性,还需要政策、监控、教育和经验这四方面的结合。希望你们有所收获,有所成长。下次再聊!
资源和参考资料我的名字是埃杜亚德·波帕,我是一名数据工程师及顾问,帮助组织利用Azure和Databricks构建他们的云数据平台。
若你对这类内容感兴趣,可以试试订阅我的Newsletter。
或改为:若你对这类内容感兴趣,可以试试订阅我的电子报。
关于在企业环境中使用 Azure 和 Databricks 进行数据工程的通讯。点击这里阅读更多关于 Databricks…eduardpopa.substack.com](https://eduardpopa.substack.com/?source=post_page-----8adcf66370bc--------------------------------)
如果你想和我一起工作,可以预约一次免费的一对一通话:Calendly 或者直接通过邮件联系我:eduard.popa@x-data.ro