【问题标题】:Glue Spark: Some task has 0 records for shuffle but some task has disk spillGlue Spark:某些任务有 0 条随机播放记录,但某些任务有磁盘溢出
【发布时间】:2022-10-07 03:49:09
【问题描述】:

我有一个火花作业,其中某些任务的记录输出为零,并且某些任务具有内存和磁盘溢出的随机读取大小。有人可以帮我做些什么来优化执行。 执行信息:repartition_cnt=3500 [数据集在 S3 中,通过具有 298 个 DPU 的 Glue G2X 执行)

代码:

fct_ate_df.repartition(expr(s\"pmod(hash(mae_id, rowsin, dep), $repartition_cnt)\"))
       .write
       .mode(\"overwrite\")
       .format(\"parquet\")
       .bucketBy(repartition_cnt, \"rowsin\", \"rowsin\",\"dep\")
       .sortBy(\"rowsin\",\"dep\")
       .option(\"path\", s\"s3://b222-id/data22te=$dat22et_date\")
       .saveAsTable(s\"btemp.intte_${table_name}_${regd}\")

摘要指标

无记录输出/随机播放

泄漏记录

    标签: apache-spark aws-glue amazon-emr


    【解决方案1】:

    您正在通过表达式使用reparition,我认为这就是您看到那些空分区的原因。在这种情况下,内部 spark 将使用 HashPartitioner 并且此分区器不保证分区将是相等的。

    由于哈希算法,您可以确定具有相同表达式值的记录将位于同一个分区中,但您最终可能会得到空分区或其中包含例如 5 个键的分区。

    在这种情况下 numPartitions 不会改变任何东西,如果一个存储桶中的许多键(所以稍后的分区)最终生成的分区少于 numPartition Spark 将生成空分区,如您在示例中所见

    我认为,如果你想拥有相等的分区,你可以删除计算哈希的这个表达式,只留下 $repartition_cnt

    多亏了 Spark 将使用 RoundRobinPartitioner 而这个将生成相等的分区

    如果你想挖掘dipper,你可以看看源代码,我认为这是很好的起点

    在这里你可以找到连接到没有表达式的重新分区的逻辑:Spark source code

    在这里您可以找到用于按表达式进行分区的逻辑:Spark source code

    问候!

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多