【问题标题】:Alter table to add partition taking long time on Hive external table更改表以在 Hive 外部表上添加需要很长时间的分区
【发布时间】:2021-02-06 22:29:12
【问题描述】:

我正在尝试通过具有 6 个节点(每个节点上有 8 个内核和 56GB 内存)的 EMR 集群执行 spark 作业。 Spark 作业对 Hive 表上的分区进行增量加载,最后它会刷新表以更新元数据。

刷新命令需要长达 3-6 小时才能完成,这太长了。

Hive 中数据的性质:

  1. 27Gb 数据位于 S3 上。
  2. 存储在镶木地板中。
  3. 在 2 列上分区。(例如:s3a//bucket-name/table/partCol1=1/partCol2=2020-10-12)。

注意 - 它是一个按日期划分的分区,不能更改。

使用的 Spark 配置:

  • Num-executors= 15
  • 执行器内存 =16Gb
  • Executor-cores = 2
  • 驱动程序内存 = 49Gb
  • Spark-shuffle-partitions=48
  • Hive.exec.dynamic.partition.mode=nonstrict
  • Spark.sql.sources.partitionOverwriteMode=dynamic.

尝试过的事情:

  • 调整 spark 内核/内存/执行器,但没有成功。
  • 刷新表命令。
  • Alter table 添加分区命令。
  • Hive cli 需要 3-4 小时才能完成 MSCK repair table tablename

以上所有对于减少刷新 Hive 分区的时间都没有影响。

一些假设:

  1. 由于数据存储在 Amazon-S3 中,我是否在调整过程中遗漏了任何参数?
  2. 目前表上的分区数接近 10k,这是一个问题吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: apache-spark amazon-s3 pyspark hive amazon-emr


    【解决方案1】:
    • 如果可能,将分区设置为 1 列。当我们有多级(多列分区)时,它会杀死

    • 使用 R 类型的实例。同价位相比M型实例提供更多内存

    • 如果有很多小文件,请使用合并合并源中的文件。

    • 检查映射器任务的数量。任务越多,性能越差

    • 使用 EMRFS 而不是 S3 来保存元数据信息

    • 在下面使用

      { “分类”:“火花”, “特性”: { “最大化资源分配”:“真” } }

    • 按照下面Link的一些说明进行操作

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2021-04-18
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多