为Impala表无缝覆盖基础实木复合地板数据

问题描述 投票:2回答:1

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

我们的Spark代码看起来像这样

dataset.write.format("parquet").mode("overwrite").save(path)

在此更新过程中(覆盖镶木地板数据文件,然后覆盖REFRESH Impala表),如果有人访问该表,那么他们将最终收到错误消息,说底层数据文件不存在。

是否有针对此问题的解决方案或解决方法?因为我不希望其他团队在访问表时随时看到错误。

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

apache-spark parquet impala
1个回答
0
投票

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

当删除表的基础文件并将新文件写入Impala之外时,必须执行REFRESH,以便新文件的详细信息(例如文件和相应的块详细信息)将被获取并分布在守护程序中。这样,Impala就会知道新写入的文件。

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

作为解决方案,您可以执行以下其中一项,

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

OR

  1. 正如您所说,您可以在不同的HDFS路径中写入新的镶木地板文件,一旦写入完成,您可以[删除旧文件,将新文件移动到表的实际HDFS路径中,然后通过REFRESH] OR [针对表发出ALTER语句以修改指向新目录的表数据的位置]。如果这是日常工作,则可能必须通过一个脚本来实现此目的,该脚本通过将目录(新目录和旧目录)作为参数传递来在Spark成功完成写入过程后运行。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.