微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

您如何确定 Spark 应用程序的 shuffle 分区?

如何解决您如何确定 Spark 应用程序的 shuffle 分区?

我是 spark 新手,所以我正在关注 sparkbyexamples.com 上的这个精彩教程,在阅读时我发现了这一部分:

随机分区大小和性能

基于您的数据集大小、内核数量和内存 PySpark 改组可以使您的工作受益或有害。当你处理的少 数据量,您通常应该减少随机分区 否则你最终会得到许多分区文件,但数量较少 每个分区中的记录数。这导致运行许多任务 要处理的数据较少。

另一方面,当您有太多数据而数据较少时 分区导致运行时间更长的任务更少,有时您 也可能出现内存不足错误

获得正确大小的 shuffle 分区总是很棘手,而且 需要多次运行不同的值才能达到优化的数字。 这是当您拥有时要寻找的关键属性之一 PySpark 作业的性能问题。

有人可以帮助我了解您如何确定您的工作需要多少个随机分区吗?

解决方法

正如你所引用的,这很棘手,但这是我的策略:

如果您使用“静态分配”,意味着您告诉 Spark 您要为作业分配多少个执行程序,那么很简单,分区数可以是 executors * cores per executor * factorfactor = 1 表示每个 executor 将处理 1 个作业,factor = 2 表示每个 executor 将处理 2 个作业,依此类推

如果你使用“动态分配”,那就更棘手了。您可以在此处阅读详细说明 https://databricks.com/blog/2021/03/17/advertising-fraud-detection-at-scale-at-t-mobile.html。一般的想法是你需要回答很多问题,比如你的数据有多大(以千兆字节计),它的结构是什么样的(多少文件,多少文件夹,多少行等),你会如何阅读它(来自 hdfs 或 hive 或 jdbc),你有多少资源(核心、执行程序、内存),......然后你一遍又一遍地运行和基准测试,以找到适合你情况的最佳点。

更新 #1:

那么一般的行业惯例是什么?公司是简单地使用第一种策略并分配更多硬件还是使用动态分配?

通常,如果您有本地 Hadoop 环境,您可以在静态(默认模式)和动态分配(高级模式)之间进行选择。另外,我经常从动态开始,因为我不知道数据有多大及其转换有多大,所以坚持动态让我可以灵活地扩展我的工作,而不必过多考虑 Spark 配置。但是如果你愿意,你也可以从静态开始,没有什么阻止你这样做。

最后,在生产过程中,您还可以在静态(非常稳定但消耗更多资源)与动态(不太稳定,即有时由于资源分配而失败,但节省资源)之间进行选择。

最后,大多数 Hadoop 云解决方案(如 Databricks)默认都带有动态分配,成本较低。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。