【问题标题】:External Hive Table Refresh table vs MSCK Repair外部 Hive 表刷新表与 MSCK 修复
【发布时间】:2019-01-13 17:31:27
【问题描述】:

我有存储为 Parquet 的外部配置单元表,分区在一个列上,例如 as_of_dt,并且数据通过火花流插入。 现在每天都会添加新分区。我正在做msck repair table 以便配置单元元存储获取新添加的分区信息。这是唯一的方法还是有更好的方法?我担心如果下游用户查询该表,msck repair 是否会导致数据不可用或过时数据出现任何问题?我正在通过HiveContext API 并查看refreshTable 选项。知道改用refreshTable 是否有意义吗?

【问题讨论】:

  • 在创建新目录时,您的 Spark Streaming 应用程序是否可以简单地ALTER TABLE ADD PARTITION?我知道 Spark 对 Hive SQL 的支持有限,但有一些解决方法,例如使用 WebHCat...
  • 流媒体应用使用 dataframe.write.mode("append").partitionBy(partitionKeys).parquet(baseDirectory) spark 在内部负责添加外部 parquet 文件夹。只是想知道 msck 修复是否是唯一的选择。

标签: apache-spark hive hivecontext hive-partitions


【解决方案1】:

要直接回答您的问题 msck repair table,将检查表的分区是否处于活动状态。这意味着如果您删除了一些分区,并且不希望它们出现在表的 show partitions 命令中,msck repair table 应该删除它们。 Msck 修复可能比 invalidate 或 refresh 语句花费更多时间,但是 Invalidate Metadata 仅在 Hive 内运行,仅更新 Hive Metastore。 Refresh 仅在 Spark SQL 中运行并更新 Spark 元数据存储。

如果您在处理中的某处完成添加分区步骤,Hive 元存储应该没问题,但是如果您想通过 Spark SQL 访问配置单元表,您将需要通过 Spark(或 Impala 或其他进程更新元数据)更新火花元数据)。

每当您更新或更改 Hive 表的内容时,Spark Metastore 可能会不同步,导致您无法通过 spark.sql 命令集查询数据。这意味着如果您想查询需要保持 Spark 元存储同步的数据。

如果您的 Spark 版本允许这样做,您应该刷新并向 Spark 中的 Hive 表添加分区,以便所有元存储同步。以下是我的做法:

//Non-Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation)
spark.sql("refresh table " + tableName)

//Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation + "/" + partition)
val addPartitionsStatement = "alter table" + tableName = " add if not exists partition(partitionKey='" + partition + "') location '" + fileLocation + "/" + partition + "'"
spark.sql(addPartitionsStatement)
spark.sql("refresh table " + tableName)

【讨论】:

  • 非常感谢阿费尔德曼。目前我有一个包含一些列和 as_of_dt 作为分区的表。因此,每天都会添加新记录,并且由于分区值更改,它会转到新分区。我正在做 dataframe.write.mode("append").partitionBy(partitionKeys).parquet(baseDirectory) ,然后是 MSCK REPAIR TABLE 。那么,如果我不存在分区并刷新表而不是 msck 修复,我会得到任何好处吗?
【解决方案2】:

看起来 refreshTable 确实刷新了缓存的元数据,不影响 Hive 元数据。

Doc 说:

使给定表的所有缓存元数据失效并刷新。 出于性能原因,Spark SQL 或外部数据源库 它使用的可能会缓存有关表的某些元数据,例如 块的位置。当这些在 Spark SQL 之外发生变化时,用户 应该调用这个函数来使缓存失效。

方法不会更新 Hive 元数据,因此需要修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2019-06-11
    • 2017-02-24
    • 2019-06-22
    相关资源
    最近更新 更多