2017-02-03 79 views
1

我想通過每日ETL Spark作業將S3上的Spark數據庫與舊的Oracle數據庫同步。我試圖理解Spark在連接到像Oracle這樣的RDS時如何獲取數據。Spark如何處理與時間相關的JDBC數據?

它是否只抓取Spark向DB請求的數據(即如果它在2/2 17:00:00從Oracle DB獲取數據,它將只抓取數據到該點的數據時間)?基本上說,2/2 17:00:01的任何新數據或更新都不會從數據獲取中獲得?

+0

你能用代碼解釋這個問題嗎? – mrsrinivas

回答

1

嗯,這取決於。一般來說,你必須假設這種行爲是非確定性的,除非你的應用程序和數據庫設計明確確認。

默認情況下,Spark會在您每次對相應的Spark數據集執行操作時獲取數據。這意味着每次執行都可能會看到數據庫的不同狀態。

這種行爲可以受到多種因素:

  • 顯式高速緩存和可能緩存驅逐。
  • 帶有混洗文件的隱式緩存。
  • 用於JDBC數據源的一組參數。

在前兩種情況下,Spark可以重新使用已獲取的數據,而無需返回原始數據源。第三個更有趣。默認情況下,Spark使用單個事務獲取數據,但有一些方法可以基於列範圍或謂詞啓用並行讀取。如果使用其中的一個,Spark將使用多個事務來獲取數據,並且每個人都可以觀察數據庫的不同狀態。

如果需要一致的點即時語義你有兩種基本選擇:

  • 使用一成不變的,追加只和時間戳從星火數據庫和問題時間戳相關的查詢記錄。
  • 執行一致的數據庫轉儲並將它們用作Spark作業的直接輸入。

雖然第一種方法功能強大得多,但如果您使用的是現有體系結構,則實施起來要困難得多。

相關問題