我是Apache Beam的新手,我有一些问题。
我想在我的管道中实现一个简单的缓存。我的管道每小时运行一次,以批量(1000个元素)的形式将数据写入Cloud SQL数据库中,并且可能在数据一致性方面存在部分错误,因为数据库中的约束将避免插入无效数据。在这种情况下,管道将部分插入数据。然后,我需要评估错误的数据并手动重新运行管道。在这种情况下,下次运行管道时,我想尝试仅插入未能插入的数据。
我想到了一个想法,在Cloud Storage中编写一个(每小时)缓存文件,该文件包含用JdbcIO写在目标数据库中的实体的ID,因此下次运行该管道时可以读取此文件,以避免在数据库中再次重写相同的数据。目的是避免在数据库上运行不必要的长时间作业。
我认为管道应按以下方式执行:
1)检查Cloud Storage中是否有缓存文件。如果有文件,请转到步骤2.1。否则请转到步骤2.2。
2.1)读取缓存文件并创建一个Map PCollectionView(MapView),以后再将其用作SideInput。转到步骤3。
2.2)处理源的每个元素。转到步骤4。
3)处理源的每个元素,并将其与MapView进行比较。如果MapView不包含该元素,则将其输出。如果包含,则什么也不做。转到步骤4。
4)使用JdbcIO write()将PCollection写入数据库。转到步骤5。
5)在管道的结尾:
5.1)如果未使用缓存文件就成功运行了管道:删除Cloud Storage中的所有缓存文件。这个小时我不需要缓存。
5.2)如果管道已成功运行,并且使用了缓存文件:不执行任何操作。这个小时我不需要缓存。
5.3)如果管道已成功运行且出现了一些非致命错误,而没有使用缓存文件:创建一个具有插入实体ID的缓存文件
5.4)如果管道成功运行并出现一些致命错误,并且使用了缓存文件:在缓存文件中附加新的实体ID。
5.5)如果管道执行失败:不执行任何操作。我相信Dataflow或Beam Model会回滚事务。如果我错了请纠正我。
我还想到了另一种可以解决我的问题的解决方案。而不是使用“缓存”,我将尝试在输出文件中输出无效的批次。然后,将手动评估此输出文件,并在下次运行管道时,只需读取此文件作为输入,然后尝试插入数据库中即可。
问题是:我不相信有一种方法可以通过使用JdbcIO write()方法从数据库中正确写入的行中获取PCollection。这对于了解数据库中插入了哪些实体ID至关重要。
BigQuery具有WriteResult的一些选项,但我不相信JdbcIO有。在这种情况下我能做些什么?