首页 文章

Delta Processing(并行执行问题)

提问于
浏览
-1

Scenario:

我们有“ employees_final ”ADLA目录/表 .

来自不同位置的用户将通过ADF调用U-SQL将员工数据加载到“ employees_final " ADLA catalog/table " in parallel ” .

当用户加载数据时,它首先进入临时表( employees_staging ) . 如果现有记录有更新,那么我们将在登台表( employees_staging )中存储两个版本的数据 . 下一步是,我们需要“ employees_final ”表与 latest version of record ONLY.

为了创建最终表,我们正在加入staging和final表来查找插入/更新员工,并将现有记录与新记录和RECREATE final表相结合 .

注意:由于没有DELETE选项,我们将缓存现有记录并附加新/更新记录 .

这种方法的缺点是,当用户运行ADF in parallel 时,它将尝试更新SAME employees_final 表,并且由于TRUNCATE / RECREATE表方法而有可能 DATA LOSS .

我们有更好的方法来处理PARALLEL场景吗?

1 回答

  • 1

    我不确定我是完全回答你的问题 . 但首先对ADLA / U-SQL(以及许多其他非事务性大数据系统)中的并发更新进行了一些一般性评论:

    • ADLA / U-SQL旨在提供与读取提交的快照隔离(RCSI)等效的行为,允许多个读取器和1个并发写入器 . 目前存在商店级别限制,即使在这种情况下也可能导致作业失败,但您不应该丢失数据 .

    • 同一对象上的多个破坏性写入器(例如,截断)通常会导致其中一个写入器失败(当前它是第二个写入器) .

    • 您应该能够在同一对象上并行存在多个追加(例如,多个 INSERT 到同一个表中) . 但请注意:不要进行单行插入,因为每次插入都会创建一个表碎片文件,该文件具有严重的性能和规模问题 .

    因此,考虑到这些要点,如果您有一个用于插入增量的临时表,我看不出问题,但是您需要一个作业才能将合并重新放回到主表中 . 特别是如果您想重新创建它以处理更新和删除并防止它过度碎片化 .

相关问题