根据sqoop用户指南,为了向rdms中执行“全有或全无”加载,可以使用暂存表。
然而,这一选择似乎只适用于出口。在执行(从sqlserver)到hdfs的导入时,选项--staging table不存在。默认情况下,sqoop导入使用read-committed事务隔离策略。如果其中一个导入Map器失败怎么办?如果我正在执行的导入是增量导入,那么sqoop会对整个操作执行“回滚”吗,这样就不会导入任何数据?
我们已经实现了一个工作流,该工作流通过临时hdfs目录从sql表执行增量导入,然后,如果一切正常,使用以前导入的所有数据在“main”hdfs表上执行合并。这基本上是一个手工制作的进口暂存台。这是正确/有效的方法吗?
提前谢谢。
1条答案
按热度按时间li9yvcax1#
如果sqoop
import
失败,例如如果其中一个Map器hadoopmax.retries
如果多次导入仍然失败,整个sqoop导入将失败并出现错误。我怀疑要写入的表(在hdfs中)将不完整,可能需要删除,但您会从错误中知道,对吗?export
以及import
它们几乎是对立的——从源rdbms导入拷贝数据,并且能够利用关系数据库的复杂锁定来确保数据在读取时的一致状态。hdfs没有这样的保证(据我所知),但至少sqoop可以确定,它从rdbms复制的内容已经使它完整地保存到hdfs中。但是当你朝另一个方向走的时候(
export
)sqoop只知道它对hdfs的读取是否完成而没有错误,但是没有并发性或其他rdbms保护。因此export
option建议将staging表作为一种机制来确保所有数据都成功地位于rdbms staging位置,之后sqoop可以使用rdbms从staging到最终结果的拷贝来确保一致性、锁定等。