740
財經資訊
MySQLWriter__Writer插件_使用手冊_數據集成-阿裏雲
1 快速介紹
MySQLWriter 插件實現了寫入數據到 MySQL 主庫的目的表的功能。在底層實現上, MySQLReader 通過 JDBC 連接遠程 MySQL 數據庫,並執行相應的 insert into ... 或者 ( replace into ...) 的 sql 語句將數據寫入 MySQL,內部會分批次提交入庫,需要數據庫本身采用 innodb 引擎。
MySQLWriter 麵向ETL開發工程師,他們使用 MySQLWriter 從數倉導入數據到 MySQL。同時 MySQLWriter 亦可以作為數據遷移工具為DBA等用戶提供服務。
2 實現原理
MySQLWriter 通過 CDP 框架獲取 Reader 生成的協議數據,根據你配置的 writemode
生成
- insert into...(當主鍵/唯一性索引衝突時會寫不進去衝突的行)
replace into...
(沒有遇到主鍵/唯一性索引衝突時,與 insert into 行為一致,衝突時會用新行替換原有行所有字段) 的語句寫入數據到 MySQL。處於性能考慮,采用了PreparedStatement + Batch
,並且設置了:rewriteBatchedStatements=true
,將數據緩衝到線程上下文 Buffer 中,當 Buffer 累計到預定閾值時,才發起寫入請求。
注意:目的表所在數據庫必須是主庫才能寫入數據;整個任務至少需要具備 insert/replace into...的權限,是否需要其他權限,取決於你任務配置中在 preSql 和 postSql 中指定的語句。
3 功能說明
3.1 配置樣例
- 使用RDS的Instance配置一個寫入MySQL的作業。
{
"type": "job",
"traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
"version": "1.0",
"configuration": {
"reader": {
"plugin": "sqlserver",
"parameter": {
"instanceName": "rds.aliyun.com",
"username": "username",
"password": "password",
"table": "table",
"column": [
"*"
],
"where": "1 = 1"
}
},
"writer": {
"plugin": "MySQL",
"parameter": {
"writeMode": "insert",
"instanceName": "instanceName",
"database": "database",
"username": "username",
"password": "password",
"table": "table",
"column": [
"*"
],
"preSql": [
"delete from XXX;"
]
}
}
}
}
- 使用JDBC配置一個向RDS寫入數據的作業
{
"type": "job",
"traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
"version": "1.0",
"configuration": {
"reader": {
"plugin": "sqlserver",
"parameter": {
"instanceName": "rds.aliyun.com",
"username": "username",
"password": "password",
"table": "table",
"column": [
"*"
],
"where": "1 = 1"
}
},
"writer": {
"plugin": "MySQL",
"parameter": {
"writeMode": "insert",
"jdbcUrl": "jdbc:MySQL://ip:port/database",
"username": "username",
"password": "password",
"table": "table",
"column": [
"*"
],
"preSql": [
"delete from XXX;"
]
}
}
}
}
3.2 參數說明
instanceName
描述: 阿裏雲RDS實例名稱(Instance名稱)。用戶使用該配置指定RDS的Instance名稱,CDP將翻譯為底層執行的jdbc連接串連接。
instanceName指定的是RDS實例,類似MySQL實例,需要和database配合使用。
必選:是
默認值:無
jdbcUrl
描述:對於CDP部分私有雲場景,數據庫遷移場景等,其本身數據源是普通MySQL數據庫不是RDS,對於這類場景,用戶可以指定jdbc信息直連。
jdbcUrl和instanceName/database兩類信息概念上是等同的,因此隻能配置其一。如果兩者均配置,CDP默認將使用jdbc信息。
必選:是
默認值:無
database
- 描述: 阿裏雲RDS數據庫名稱。
- 必選:是
- 默認值:無
username
- 描述:數據源的用戶名
- 必選:是
- 默認值:無
password
- 描述:數據源指定用戶名的密碼
- 必選:是
- 默認值:無
table
- 描述:所選取的需要同步的表。
- 必選:是
- 默認值:無
writeMode
- 描述: 選擇導入模式,可以支持insert/replace/insert ignore方式,
- insert指當主鍵/唯一性索引衝突,CDP視為髒數據進行處理。
- replace指沒有遇到主鍵/唯一性索引衝突時,與 insert行為一致,當主鍵/唯一性索引衝突時會用新行替換原有行所有字段。
- insert ignore指當主鍵/唯一性索引衝突,CDP將直接忽略更新丟棄,並且不記錄!
- 必選:否
- 默認值:insert
- 描述: 選擇導入模式,可以支持insert/replace/insert ignore方式,
column
- 描述:所配置的表中需要同步的列名集合。以英文逗號(,)進行分隔。
我們強烈不推薦用戶使用默認列情況
- 必選:是
- 默認值:無
- 描述:所配置的表中需要同步的列名集合。以英文逗號(,)進行分隔。
encoding
- 描述:寫入MySQL時使用的編碼流,默認情況下使用UTF-8。注意,該字段描述的不是對端數據存儲的編碼,隻是數據傳輸的編碼類型。建議大部分用戶可以忽略該配置。
- 必選:否
- 默認值:UTF-8
preSql
- 描述:執行數據同步任務之前率先執行的sql語句,目前隻允許執行一條SQL語句,例如清除舊數據。
- 必選:否
- 默認值:無
postSql
- 描述:執行數據同步任務之後執行的sql語句,目前隻允許執行一條SQL語句,例如加上某一個時間戳。
- 必選:否
- 默認值:無
batchSize
- 描述:一次性批量提交的記錄數大小,該值可以極大減少CDP與MySQL的網絡交互次數,並提升整體吞吐量。但是該值設置過大可能會造成CDP運行進程OOM情況。
- 必選:否
- 默認值:1024
3.3 類型轉換
類似 MySQLReader ,目前 MySQLWriter 支持大部分 MySQL 類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。
下麵列出 MySQLWriter 針對 MySQL 類型轉換列表:
CDP 內部類型 | MySQL 數據類型 |
---|---|
Long | int, tinyint, smallint, mediumint, int, bigint, year |
Double | float, double, decimal |
String | varchar, char, tinytext, text, mediumtext, longtext |
Date | date, datetime, timestamp, time |
Boolean | bit, bool |
Bytes | tinyblob, mediumblob, blob, longblob, varbinary |
4 性能報告
4.1 環境準備
4.1.1 數據特征
建表語句:
CREATE TABLE `CDP_MySQLWriter_perf_00` (
`biz_order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`key_value` varchar(4000) NOT NULL COMMENT 'Key-value的內容',
`gmt_create` datetime NOT NULL COMMENT '創建時間',
`gmt_modified` datetime NOT NULL COMMENT '修改時間',
`attribute_cc` int(11) DEFAULT NULL COMMENT '防止並發修改的標誌',
`value_type` int(11) NOT NULL DEFAULT '0' COMMENT '類型',
`buyer_id` bigint(20) DEFAULT NULL COMMENT 'buyerid',
`seller_id` bigint(20) DEFAULT NULL COMMENT 'seller_id',
PRIMARY KEY (`biz_order_id`,`value_type`),
KEY `idx_biz_vertical_gmtmodified` (`gmt_modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='CDP perf test'
單行記錄類似於:
key_value: ;orderIds:20148888888,2014888888813800;
gmt_create: 2011-09-24 11:07:20
gmt_modified: 2011-10-24 17:56:34
attribute_cc: 1
value_type: 3
buyer_id: 8888888
seller_id: 1
4.1.2 機器參數
- 執行CDP的機器參數為:
- cpu: 24核 Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz
- mem: 48GB
- net: 千兆雙網卡
- disc: CDP 數據不落磁盤,不統計此項
- MySQL數據庫機器參數為:
- cpu: 32核 Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
- mem: 256GB
- net: 千兆雙網卡
- disc: BTWL419303E2800RGN INTEL SSDSC2BB800G4 D2010370
4.1.3 CDP jvm 參數
-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError
4.2 測試報告
4.2.1 單表測試報告
通道數 | 批量提交行數 | CDP速度(Rec/s) | CDP流量(MB/s) | CDP機器網卡流出流量(MB/s) | CDP機器運行負載 | DB網卡進入流量(MB/s) | DB運行負載 | DB TPS |
---|---|---|---|---|---|---|---|---|
1 | 128 | 5319 | 0.260 | 0.580 | 0.05 | 0.620 | 0.5 | 50 |
1 | 512 | 14285 | 0.697 | 1.6 | 0.12 | 1.6 | 0.6 | 28 |
1 | 1024 | 17241 | 0.842 | 1.9 | 0.20 | 1.9 | 0.6 | 16 |
1 | 2048 | 31250 | 1.49 | 2.8 | 0.15 | 3.0 | 0.8 | 15 |
1 | 4096 | 31250 | 1.49 | 3.5 | 0.20 | 3.6 | 0.8 | 8 |
4 | 128 | 11764 | 0.574 | 1.5 | 0.21 | 1.6 | 0.8 | 112 |
4 | 512 | 30769 | 1.47 | 3.5 | 0.3 | 3.6 | 0.9 | 88 |
4 | 1024 | 50000 | 2.38 | 5.4 | 0.3 | 5.5 | 1.0 | 66 |
4 | 2048 | 66666 | 3.18 | 7.0 | 0.3 | 7.1 | 1.37 | 46 |
4 | 4096 | 80000 | 3.81 | 7.3 | 0.5 | 7.3 | 1.40 | 26 |
8 | 128 | 17777 | 0.868 | 2.9 | 0.28 | 2.9 | 0.8 | 200 |
8 | 512 | 57142 | 2.72 | 8.5 | 0.5 | 8.5 | 0.70 | 159 |
8 | 1024 | 88888 | 4.24 | 12.2 | 0.9 | 12.4 | 1.0 | 108 |
8 | 2048 | 133333 | 6.36 | 14.7 | 0.9 | 14.7 | 1.0 | 81 |
8 | 4096 | 166666 | 7.95 | 19.5 | 0.9 | 19.5 | 3.0 | 45 |
16 | 128 | 32000 | 1.53 | 3.3 | 0.6 | 3.4 | 0.88 | 401 |
16 | 512 | 106666 | 5.09 | 16.1 | 0.9 | 16.2 | 2.16 | 260 |
16 | 1024 | 173913 | 8.29 | 22.1 | 1.5 | 22.2 | 4.5 | 200 |
16 | 2048 | 228571 | 10.90 | 28.6 | 1.61 | 28.7 | 4.60 | 128 |
16 | 4096 | 246153 | 11.74 | 31.1 | 1.65 | 31.2 | 4.66 | 57 |
32 | 1024 | 246153 | 11.74 | 30.5 | 3.17 | 30.7 | 12.10 | 270 |
說明:
- 這裏的單表,主鍵類型為 bigint(20),自增。
- batchSize 和 通道個數,對性能影響較大。
- 16通道,4096批量提交時,出現 full gc 2次。
4.2.2 性能測試小結
- 批量提交行數(batchSize)對性能影響很大,當
batchSize>=512
之後,單線程寫入速度能達到每秒寫入一萬行 - 在
batchSize>=512
的基礎上,隨著通道數的增加(通道數<32),速度呈線性比增加。 - 通常不建議寫入數據庫時,通道個數 >32
5 FAQ
Q: MySQLWriter 執行 postSql 語句報錯,那麼數據導入到目標數據庫了嗎?
A: CDP 導入過程存在三塊邏輯,pre 操作、導入操作、post 操作,其中任意一環報錯,CDP 作業報錯。由於 CDP 不能保證在同一個事務完成上述幾個操作,因此有可能數據已經落入到目標端。
Q: 按照上述說法,那麼有部分髒數據導入數據庫,如果影響到線上數據庫怎麼辦?
A: 目前有兩種解法,第一種配置 pre 語句,該 sql 可以清理當天導入數據, CDP 每次導入時候可以把上次清理幹淨並導入完整數據。第二種,向臨時表導入數據,完成後再 rename 到線上表。
Q: 上麵第二種方法可以避免對線上數據造成影響,那我具體怎樣操作?
A: 可以配置臨時表導入
最後更新:2016-11-23 16:03:59
上一篇:
TxtFileReader__Reader插件_使用手冊_數據集成-阿裏雲
下一篇:
SQLServerWriter__Writer插件_使用手冊_數據集成-阿裏雲
UploadPart__關於MultipartUpload的操作_API 參考_對象存儲 OSS-阿裏雲
推薦碼的使用規則___推薦碼_代金券及推薦碼_財務-阿裏雲
阿裏雲又聯手Intel搞事情 這次是建遊戲生態!
如何跨項目配置任務依賴__用戶常見問題反饋_常見問題_大數據開發套件-阿裏雲
8.2 數據導入任務生產指南__第八章 在生產中使用分析型數據庫_使用手冊_分析型數據庫-阿裏雲
創建高權限賬號__設置實例基礎配置_快速入門(MySQL)_雲數據庫 RDS 版-阿裏雲
StopLoadBalancerListener__Listener相關API_API 參考_負載均衡-阿裏雲
DeleteTrail__實例相關接口_API參考_操作審計-阿裏雲
客戶端及連接池__用戶指南_雲數據庫 PetaData-阿裏雲
測試結果搜索__測試結果_Lite用戶使用手冊_性能測試-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲