Hadoop 配置单元:如果删除当前正在查询的文件,会发生什么情况?

Hadoop 配置单元:如果删除当前正在查询的文件,会发生什么情况?,hadoop,hive,delete-file,Hadoop,Hive,Delete File,假设我们有一个配置单元表存储在HDFS上作为目录,如下所示: data/ |-- file1 |-- file2 |-- file3 如果我在这个目录上启动长查询,然后删除其中一个文件,会发生什么 我可以想到3种情况: 文件描述符在查询开始时打开,数据保留到查询结束,即使文件路径不再可用于新查询。 配置单元会记住文件路径,如果找不到已删除的文件,则会导致查询失败。 配置单元不记得文件路径,只获取当前目录中的文件。 如果配置单元的行为类似于2,并且在查询过程中删除文件是不安全的,那么从被查

假设我们有一个配置单元表存储在HDFS上作为目录,如下所示:

data/
 |-- file1
 |-- file2
 |-- file3
如果我在这个目录上启动长查询,然后删除其中一个文件,会发生什么

我可以想到3种情况:

文件描述符在查询开始时打开,数据保留到查询结束,即使文件路径不再可用于新查询。 配置单元会记住文件路径,如果找不到已删除的文件,则会导致查询失败。 配置单元不记得文件路径,只获取当前目录中的文件。
如果配置单元的行为类似于2,并且在查询过程中删除文件是不安全的,那么从被查询的目录中删除旧数据的正确方法是什么

我想Hive会做一个表级锁共享只读,它不允许对表进行任何更新/删除,所以理想情况下它不允许删除数据

请也看看这篇文章:


正如@Shankarsh所述,Hive试图在其元存储数据库中使用锁表来协调其查询。尝试运行显示锁;命令,而另一个会话正在运行一个长的SELECT或INSERT查询,而另一个会话试图更改该表,必须等到它可以获得独占锁才能自己查看

不幸的是,这不会阻止HDFS直接访问文件和目录。在HDFS中只有一种类型的锁,它是一种专用锁,用于创建/追加/截断文件或现有文件中的最后一个块

典型场景:您提交一个查询;Hive在查询编译时检索文件和文件块的列表,然后启动一些映射程序从这些块中读取;同时,另一个作业请求删除其中一个文件==>其中一个映射程序将因FileNotFoundException而崩溃我一直在那里

另一个典型的场景:…同时另一个作业创建一个新文件,或在现有文件中附加一个新块==>数据将永远不会被访问-顺便说一下,这不是一件坏事

一句话:避免删除配置单元表使用的HDFS目录中的文件,无论是托管的还是外部的,除非您可以确保当前没有查询正在运行,或者可能很快就会运行。如果您想一次删除所有文件,对于托管表,请在表/分区级别使用TRUNCATE,并让Hive执行脏的协调工作


在某些情况下,您可能会尝试一个复杂的技巧:临时表有一个分区,一个EXCHANGE分区配置单元命令…协调…,然后在临时目录中删除HDFS,然后另一个EXCHANGE分区返回所有剩余的文件-当然,在这两者之间启动的任何查询都会看到一个空表,这可能是个问题。

谢谢您的回复。但是,我不打算从蜂箱删除数据,我想直接删除文件,例如使用Hadoop FS - RM。这样Hive就没有机会锁定它,甚至不知道变化了……另外,在betwen中插入的任何数据都将在最后一次交换时发送到limbo,除非在此之后您再次将其从临时表插入到常规表。伟大答案所需的一切:对具体问题的回答以及如何克服强加问题的描述。非常感谢。