问题描述
我们有一个在spark上运行的ETL作业,该作业从sql Server读取数据。然后,通过应用mappartition对数据框执行一些转换,并创建具有不同架构的新数据框。完成一些进一步的转换,最后将结果数据帧写回到sql Server。
我的问题是假设在将sql Server中的数据插入8个分区中时,其中一个spark节点出现故障,spark如何确保数据完整性?其他分区将在数据库中插入数据,并且在发生故障时,数据库中的数据不一致。
spark只会通过应用所有转换来重新创建失败的分区吗?
万一再次失败,数据库中其他分区的数据将处于什么状态?
解决方法
简短回答。
如果您还没有检查站,
- 然后,因为您不是从源中读取可以跟踪最初使用的文件的信息-如果从源中重新计算-例如蜂巢表
- 将进行重新计算,并且对于后续的节点故障恢复,结果可能会有所不同-除非该源是静态的。
具有仍可以在其他位置读取的.cache和/或检查点,
- 我的理解是,您将获得相同的结果。
很难测试恕我直言。
加分
应用所有转换后的缓存不是标准的事情 去做。它是昂贵的。而且,由于内存问题甚至 存储问题,Spark可以逐出分区并返回源代码,因此 数据可能不同于先前的处理调用。而如果 如果您坚持不懈,并且节点在写入之前已关闭,则您丢失了 缓存。情况相同。