本文為您介紹DataWorks的Databricks資料同步的能力和支援情況。
使用說明
使用限制
資源群組:Databricks Reader 僅支援 Serverless資源群組,並且需要為資源群組綁定的VPC配置公網 NAT Gateway和EIP。
讀模數式:資料同步僅支援
JDBC模式讀取資料。
並發讀取與資料一致性問題
Databricks Reader 通過
splitPk配置對資料進行切分,並啟動多個並發任務以提高同步效率。但請注意以下關鍵點:多個並發任務不屬於同一個資料庫事務,且存在時間間隔。
在資料來源持續寫入的情況下,並發讀取可能導致擷取的資料快照不完整或不一致。
解決方案:由於技術限制,無法實現跨多線程的完美一致性快照。我們提供以下兩種工程上的解決方案,請根據業務情境權衡選擇:
方案一:配置為單線程同步,不設定資料切片(
splitPk)。可以保證資料嚴格一致,但同步速度較慢。方案二:在同步期間確保資料來源為靜態。例如,通過鎖表、臨時關閉應用寫入或暫停備庫同步等方式。同步速度較快,但可能對線上業務造成影響。
編碼處理
Databricks Reader 底層使用 JDBC 進行資料幫浦,JDBC 會自動處理不同資料庫的編碼識別與轉換。因此,您無需手動設定編碼。
增量資料同步
Databricks Reader 通過執行
SELECT ... WHERE ...語句來抽取資料,實現增量同步處理的關鍵在於WHERE條件的構造。推薦方式(基於時間戳記欄位):
在您的來源資料庫表中,設計一個時間戳記欄位(例如
modify_time)。當應用對資料進行新增或更新(包括邏輯刪除)時,務必同步更新該時間戳記欄位。
在同步任務中,使用該時間戳記欄位作為
WHERE條件,即可拉取上一同步點之後發生變化的資料。
不支援的情況:如果業務表中沒有可用於區分新增或修改的欄位(如時間戳記或自增ID),Databricks Reader 無法進行增量同步處理,只能進行全量資料同步。
支援的欄位類型
在進行離線讀取時,Databricks Reader支援大部分Databricks類型,但也存在個別類型未被支援的情況,請注意檢查您的資料類型。
Databricks Reader針對Databricks類型的轉換列表,如下所示。
類型分類 | Databricks資料類型 |
整數類 | TINYINT、SMALLINT、INT、BIGINT |
浮點類 | FLOAT、DOUBLE、DECIMAL |
字串類 | STRING |
日期時間類 | DATE、TIMESTAMP、TIMESTAMP_NTZ |
布爾類 | BOOLEAN |
複雜類型 | ARRAY、MAP、STRUCT |
其他類型 | INTERVAL、 BINARY、GEOGRAPHY(srid)、GEOMETRY(srid) |
建立資料來源
在進行資料同步任務開發時,您需要在DataWorks上建立一個對應的資料來源,操作流程請參見資料來源管理,詳細的配置參數解釋可在配置介面查看對應參數的文案提示。
資料同步任務開發
資料同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過嚮導模式配置離線同步任務、通過指令碼模式配置離線同步任務。
指令碼模式配置的全量參數和指令碼Demo請參見下文的附錄:指令碼Demo與參數說明。
常見問題(FAQ)
Q:讀取報錯:
[Databricks][JDBCDriver](500313)Error getting the data value from result set: Column13:[Databricks][JDBCDriver](500312)Error in fetching data rows: Timestamp Conversion has failed.A:Databricks 的 TIMESTAMP 類型取值範圍超過 JAVA Timestamp 取值範圍,如果出現了超出範圍的值,JDBC Driver 會報錯。可以通過修改
column配置解決,例如"column": ["CAST(col_timestamp AS STRING)"]。
附錄:指令碼Demo與參數說明
離線任務指令碼配置方式
如果您配置離線任務時使用指令碼模式的方式進行配置,您需要按照統一的指令碼格式要求,在任務指令碼中編寫相應的參數,詳情請參見通過指令碼模式配置離線同步任務,以下介紹指令碼模式下資料來源的參數配置詳情。
Reader指令碼Demo
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "databricks",
"parameter": {
"datasource": "databricks",
"schema": "schema1",
"table": "table1",
"readMode": "jdbc",
"where": "id>1",
"splitPk": "id",
"column": [
"c1",
"c2"
]
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"concurrent": 1
}
}
}Reader指令碼參數
參數 | 描述 | 是否必選 | 預設值 |
datasource | 資料來源名稱,指令碼模式支援添加資料來源,此配置項填寫的內容必須要與添加的資料來源名稱保持一致。 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述欄位資訊。
舉例:
column必須顯式需指定同步的列集合,不允許為空白 。 | 是 | 無 |
splitPk | Databricks Reader進行資料幫浦時,如果指定
| 否 | 無 |
where | 過濾條件,Databricks Reader根據指定的 | 否 | 無 |
schema | 所選取的需要同步的schema。 | 是 | 無 |
table | 所選取的需要同步的表,一個作業只能支援一個表同步。 | 是 | 無 |
readMode | 資料讀模數式,目前僅支援JDBC模式。 | 否 | jdbc |