更改表以在Hive外部表上添加需要很长时间的分区

时间:2020-10-23 20:46:11

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

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

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

Hive中的数据性质:

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

注意:它是按日期划分的分区,无法更改。

使用的火花配置:

  • Num-executors = 15
  • 执行器内存= 16Gb
  • 执行者核心数= 2
  • Driver-memory = 49Gb
  • Spark-shuffle-partitions = 48
  • Hive.exec.dynamic.partition.mode = nonstrict
  • Spark.sql.sources.partitionOverwriteMode = dynamic。

尝试过的事情:

  • 调整Spark核心/内存/执行器,但没有运气。
  • 刷新表命令。
  • 更改表添加分区命令。
  • 蜂巢cli需要3-4个小时来完成MSCK repair table tablename

以上所有内容都无法减少刷新Hive上的分区的时间。

一些假设:

  1. 由于数据存储在Amazon-S3中,我在调整时是否缺少任何参数??
  2. 当前表上的分区数接近10k,这是一个问题。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

  • 在可能的情况下,将分区设为1列。当我们具有多级(多列分区)时,它会杀死

  • 使用R类型实例。与价格相同的M型实例相比,它提供了更多的内存

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

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

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

  • 在下面使用

    { “分类”:“火花”, “属性”:{ “ maximizeResourceAllocation”:“ true” } }

  • 遵循Link下面的一些说明