Spark如何处理与时间相关的JDBC数据?

时间:2017-02-03 18:35:36

标签: apache-spark jdbc pyspark apache-spark-sql

我正在尝试通过每日ETL Spark作业将S3上的Spark数据库与较旧的Oracle数据库同步。我试图理解Spark连接到像Oracle这样的RDS来获取数据时所做的事情。

它是否仅获取Spark向DB请求时的数据(即,如果它在2/2 17:00:00从Oracle DB获取数据,它将仅获取数据到达该时间点)?基本上是说从数据提取中无法获得2/2 17:00:01的任何新数据或更新?

1 个答案:

答案 0 :(得分:1)

嗯,这取决于。通常,您必须假设此行为是非确定性的,除非您的应用程序和数据库设计明确确保。

默认情况下,Spark会在每次对相应的Spark数据集执行操作时获取数据。这意味着每次执行都可能会看到数据库的不同状态。

此行为可能受多种因素的影响:

  • 显式缓存和可能的缓存驱逐。
  • 使用随机文件进行隐式缓存。
  • 与JDBC数据源一起使用的一组参数。

在前两种情况下,Spark可以重用已经获取的数据,而无需返回原始数据源。第三个更有趣。默认情况下,Spark使用单个事务获取数据,但有一些方法可以根据列范围或谓词启用并行读取。如果使用其中一个,Spark将使用多个事务获取数据,并且每个事务都可以观察数据库的不同状态。

如果需要一致的时间点语义,您基本上有两个选择:

  • 在数据库中使用不可变,仅附加和时间戳记录,并从Spark发出与时间戳相关的查询。
  • 执行一致的数据库转储,并将其用作Spark作业的直接输入。

虽然第一种方法功能更强大,但如果您使用现有的架构,则实施起来要困难得多。