【问题标题】:Apache Spark performance tuningApache Spark 性能调优
【发布时间】:2019-09-26 01:40:28
【问题描述】:

我在使用 Upsert(插入和更新记录)逻辑将 4MB 文件加载到配置单元表时遇到性能问题。作为此负载的一部分,我们有两个阶段 -

第 1 阶段 - 将 4MB 文本文件加载到表 A

第 2 阶段 - 通过从返回大约 600 万条记录的表 A 中排除 source_code NOT IN ("ABC") 来加载表 B

val finalizedDf= sparkSession.sql(s"""select * from $tableA where $source_code not in ("ABC")""")


finalizedDf.write.format("parquet").mode("Overwrite").insertInto(tableB)

在插入表 B 时,由于内存限制超过执行程序内存开销,作业失败。此外,负载运行超过 5 小时。请针对上述情况推荐性能转向技巧:)

【问题讨论】:

    标签: scala apache-spark hadoop hive hdfs


    【解决方案1】:

    在 spark 中执行性能调优时需要考虑多个事项。

    1. 什么是随机分区集?默认情况下,它设置为 200。您需要将其更改为更大的数字。 spark.sql.shuffle.partitions=1000

    2. 执行器核心和执行器内存。通过查看描述,在我看来,执行程序的内存较少。更少的内存会频繁触发 GC,从而减慢 Spark 的执行速度。尝试增加它。

    3. 在执行 insertInto 时不需要overwrite

    改用这个。 finalizedDf.write.format("parquet") .insertInto(tableB)

    【讨论】:

    • 感谢您的回复,阿维舍克!表 B 每次都需要插入覆盖。这就是我们有模式(覆盖)的原因。我在想,因为每次都点击表 A 并检查 source_code,所以负载运行了 5 个小时。
    • 您可以尝试在排除 source_code 后保存中间数据并将其用于 insertInto。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多