根据Sqoop user guide的说法,为了对RDMS执行“全有或全无”加载,可以使用临时表。
但是,此选项似乎仅在导出中可用。在执行(从SQLServer)到HDFS的导入时,选项--staging-table不存在。默认情况下,Sqoop导入使用read committed事务隔离策略。如果其中一个导入映射器失败了怎么办?如果我正在执行的导入是增量导入,sqoop是否会执行整个操作的“回滚”,从而不导入任何数据?
我们已经实现了一个工作流,该工作流通过临时HDFS目录从SQL表执行增量导入,然后,如果一切正常,则对“主”HDFS表执行合并,其中包含以前导入的所有数据。这基本上是一个手工制作的进口临时表。这是正确/有效的继续进行的方式吗?
提前谢谢。
发布于 2016-06-19 10:05:30
如果sqoop import失败,例如,如果其中一个映射器hadoop的max.retries次数仍然失败,则整个sqoop导入将失败并显示错误。我怀疑正在写入的表(在HDFS中)将是不完整的,可能需要删除,但您可以从错误中知道,对吧?
export和import几乎完全相反-- import从源关系数据库复制数据,并且能够利用关系数据库的复杂锁定来确保数据在读取时的一致状态。HDFS没有这样的保证(据我所知),但至少Sqoop可以确保它从RDBMS复制的内容完好无损地复制到HDFS。
但是当进行另一个方向(export)时,Sqoop所知道的就是它对HDFS的读取是否无错误地完成,但没有并发或其他RDBMS的保护。因此,export选项建议使用临时表作为一种机制,以确保所有数据都成功地位于RDBMS位置,之后Sqoop可以使用从staging到最终结果的RDBMS副本,以确保一致性、锁定等。
https://stackoverflow.com/questions/37874382
复制相似问题