【问题标题】:Cross join optimizations on AWS Glue/SparkAWS Glue/Spark 上的交叉联接优化
【发布时间】:2021-05-09 20:58:29
【问题描述】:

我有 2 个数据框:

df1 - 7 列(ID 和 VARCHAR),行:1,700,000

df2 - 7 列(ID 和 VARCHAR),行:25,000

需要找到所有可能的相似之处,没有办法跳过笛卡尔积。

AWS Glue:具有 10 个(或 20 个)G.1X Worker 的集群

已经针对 178 个分区进行了测试(从较大的 df 中过滤 df1 时会即时计算 Spark) 运行时间:10小时...我停止了工作! 但在 S3 上,发现了超过 999 个 part-XXX-YYYYY 文件。

问题:如果无法跳过交叉连接,如何在 Glue/Spark 上优化此交叉连接?

【问题讨论】:

  • 你试过广播吗?如果由于内存问题广播失败,请尝试使用 G2X 工作类型。
  • 我试过了。实际上是一样的 +/-。
  • 最好估计一下,这个作业应该在指定的集群大小下运行多长时间(小时)?有什么方法吗?

标签: amazon-web-services apache-spark optimization cross-join


【解决方案1】:

通过以下方法和 Glue 配置,作业在 121 分钟内完成:

胶水细节=>

工人=>G2.X

工人人数=> 50 。你也可以试试 149,这应该在 35-45 分钟内完成。

我创建了两个文件:-

df1=> 7 列行:1700000,大小 140 MB(根据列大小,文件大小可能因您而异)

df2=> 7 列行:25000,大小 2 MB

现在我已经用 42500 对第一个数据帧进行了分区。

我是如何获得 42500-> 首先我创建了 DF1 和 1 条记录,DF2 和 25000 并保存,交叉连接输出。

这是 3.5 MB 的文件,为了获得最佳性能,最佳分区应该在 128 MB 左右。 假设您要将一个分区大小设为 150 MB。

现在从 1 条记录生成的输出为 3.5 MB,分区大小为 150 MB 我们需要大约。每个分区 42 条记录。 我们有 1700000 条记录,这使得它大约。 40500 个分区。

对您而言,1 条记录的大小可能会有所不同。使用相同的方法来计算分区大小。 修复后,只需使用cross join和broadcast即可。

df1.reparition(40500)

df.crossJoin(broadcast(df2))

【讨论】:

  • 嗯...所以你在你身边测试了它,你在 121 分钟内得到了结果(50 个 T2.X 工作人员 ~ 100 个 DPU)。您应该支付的费用:0.44 美元 *(121/10 分钟)*(100 DPU)=0.44 美元*12*100 = 528 美元听起来对吗?
  • 或者您应该支付:0.44 美元 * 2(小时)* (100 DPU) = 0.44 美元*2*100 = 88 美元
  • 抱歉,我无权访问计费矩阵。理想情况下应该是 88 美元,我已经在客户帐户上对其进行了测试,根据他们的说法“与标准定价相比,我们的费率非常低”。
  • 谢谢! Spark作业的执行时间估计如何?没有(之前)运行作业来估计/计算。
  • 没有这样的方法来估计执行时间。我能想到的唯一方法是,使用以前的统计数据并估计它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
相关资源
最近更新 更多