提问者:小点点

无缝覆盖Impala表的底层拼花数据


我有一个由拼花文件支持的Impala表,由另一个团队使用。每天我运行一个批处理Spark作业,覆盖现有的拼花文件(创建新数据集,现有文件将被删除,新文件将被创建)

我们的火花代码看起来像这样

数据集。写。格式化(“拼花”)。模式(“覆盖”)。保存(路径)

在此更新期间(覆盖拼花数据文件,然后覆盖REFRESHImpala表),如果有人访问该表,那么他们最终会错误地说底层数据文件不存在。

是否有任何解决方案或解决方法可用于此问题?因为我不希望其他团队在访问表时的任何时间点看到错误。

也许我可以将新数据文件写入不同的位置,然后使Impala表指向该位置?


共1个答案

匿名用户

您看到的行为是由于Impala的设计工作方式。Impala从HMS获取表的元数据,例如表结构、分区详细信息、HDFS文件路径以及来自NameNode的相应HDFS文件路径的块详细信息。所有这些详细信息都由Catalog获取,并将分布在Impala守护程序中执行。

当表的底层文件被移除并在Impala外部写入新文件时,需要执行REFRESH,以便新的文件详细信息(例如文件和相应的块详细信息)将被获取并分发到守护进程中。这样Impala就会意识到新写入的文件。

由于您正在覆盖文件,Impala查询将无法找到它知道的文件,因为它们已被删除并且正在写入新文件。这是预期的事件。

作为解决方案,您可以执行以下操作之一,

  1. 将新文件追加到表的相同HDFS路径中,而不是覆盖。这样,在表上运行的Impala查询仍然会返回结果。然而,结果将只是旧数据(因为Impala还不知道新文件),但您所说的错误将在发生覆盖时避免。一旦在Table的目录中创建了新文件,您可以执行HDFS操作以删除该表的文件,然后执行Impala REFRESH语句。

希望这有帮助!