Hive 当配置单元插入中途失败时会发生什么情况?

Hive 当配置单元插入中途失败时会发生什么情况?,hive,hiveql,atomicity,acid,Hive,Hiveql,Atomicity,Acid,假设一个插入预期在配置单元中加载100条记录,并且已经插入了40条记录,但由于某种原因,插入失败。事务是否会完全回滚,撤消插入的40条记录? 或者,即使在insert查询失败之后,配置单元表中还会出现40条记录吗?该操作是原子操作(即使对于非ACID表):如果使用HiveQL插入或重写数据,它会将数据写入临时位置,并且仅当命令成功时,文件才会移动到表位置(在插入覆盖时删除旧文件)。如果SQL语句失败,数据将保持在语句执行前的状态 关于S3直接写入的注意事项:应禁用直接写入S3功能,以允许配置单元

假设一个插入预期在配置单元中加载100条记录,并且已经插入了40条记录,但由于某种原因,插入失败。事务是否会完全回滚,撤消插入的40条记录? 或者,即使在insert查询失败之后,配置单元表中还会出现40条记录吗?

该操作是原子操作(即使对于非ACID表):如果使用HiveQL插入或重写数据,它会将数据写入临时位置,并且仅当命令成功时,文件才会移动到表位置(在插入覆盖时删除旧文件)。如果SQL语句失败,数据将保持在语句执行前的状态

关于S3直接写入的注意事项:应禁用直接写入S3功能,以允许配置单元写入临时位置,并仅在操作成功时重写目标文件夹:

-- Disable AWS S3 direct writes:
set hive.allow.move.on.s3=true; 
另请阅读本文档,了解并发模式下支持哪些ACID功能和限制的更多详细信息:

在Hive 0.13之前,分区级别提供了原子性、一致性和耐久性。可以通过打开一个可用的锁定机制(ZooKeeper或内存中)来提供隔离。通过在Hive 0.13中添加事务,现在可以在行级别提供完整的ACID语义,以便一个应用程序可以添加行,而另一个应用程序可以从同一分区读取,而不会相互干扰

也请阅读这篇关于

关于S3最终一致性的重要补充。关于S3的文件在创建后立即一致,在删除或覆盖后最终一致。您可以轻松解决一致性问题(极大地降低最终一致性问题的可能性)使用基于时间戳的分区文件夹或文件名或GUID前缀文件名。 Qubole为使用GUID为文件添加前缀提供了其他配置参数,这有助于消除最终一致性问题,因为每次使用新GUID前缀编写新文件时,都会删除具有不同GUID的文件:

set hive.qubole.dynpart.use.prefix=true;
set hive.qubole.dynpart.bulk.delete=true;
如果您不使用Qubole,您可以创建位置包含时间戳的分区。如果您在配置单元中删除分区并使用新的时间戳位置创建新分区,您可以完全消除最终一致性问题,因为您不重写文件,位置不同,并且当您删除前一个位置时,无论何时删除w我将变得一致,该位置不再装载在配置单元中。这需要额外的分区操作。对于小型表,您可以忽略此问题。同时保持每个分区的文件数较低,这将有助于减少数据变得一致的时间

另请参见以下关于S3最终一致性的相关答案:

该操作是原子操作(即使对于非酸性表):如果使用HiveQL插入或重写数据,它会将数据写入临时位置,并且仅当命令成功时,才会将文件移动到表位置(在插入覆盖的情况下删除旧文件))。如果SQL语句失败,数据将保持语句执行前的状态

关于S3直接写入的注意事项:应禁用直接写入S3功能,以允许配置单元写入临时位置,并仅在操作成功时重写目标文件夹:

-- Disable AWS S3 direct writes:
set hive.allow.move.on.s3=true; 
另请阅读本文档,了解并发模式下支持哪些ACID功能和限制的更多详细信息:

在Hive 0.13之前,分区级别提供了原子性、一致性和耐久性。可以通过打开一个可用的锁定机制(ZooKeeper或内存中)来提供隔离。通过在Hive 0.13中添加事务,现在可以在行级别提供完整的ACID语义,以便一个应用程序可以添加行,而另一个应用程序可以从同一分区读取,而不会相互干扰

也请阅读这篇关于

关于S3最终一致性的重要补充。关于S3的文件在创建后立即一致,在删除或覆盖后最终一致。您可以轻松解决一致性问题(极大地降低最终一致性问题的可能性)使用基于时间戳的分区文件夹或文件名或GUID前缀文件名。 Qubole为使用GUID为文件添加前缀提供了其他配置参数,这有助于消除最终一致性问题,因为每次使用新GUID前缀编写新文件时,都会删除具有不同GUID的文件:

set hive.qubole.dynpart.use.prefix=true;
set hive.qubole.dynpart.bulk.delete=true;
如果您不使用Qubole,您可以创建位置包含时间戳的分区。如果您在配置单元中删除分区并使用新的时间戳位置创建新分区,您可以完全消除最终一致性问题,因为您不重写文件,位置不同,并且当您删除前一个位置时,无论何时删除w我将变得一致,该位置不再装载在配置单元中。这需要额外的分区操作。对于小型表,您可以忽略此问题。同时保持每个分区的文件数较低,这将有助于减少数据变得一致的时间

另请参见以下关于S3最终一致性的相关答案:


请提供有关如何加载数据的更多详细信息。它是在ACID模式下?是100条insert语句还是从select单次插入?否。表不是事务性/ACID表。它是单次insert select语句。请提供有关如何加载数据的更多详细信息。它是在ACID模式下?是100条insert语句还是单次insselect中的ert?否。表不是事务性/ACID表。它是一个Insert select语句。感谢您的澄清:)kudos@leftjoin,+1感谢您的澄清:)kudos@leftjoin,+1