シーン
Kettle (オープン ソース ETL ツールセット) は、SqlServer から Mysql テーブルへのデータ同期を実装し、それを Windows サーバーにデプロイします。
Kettle の使用については前述しましたが、以下は Ali のオープンソース異種データソース同期ツール DataX の記録です。
データX
DataX は、リレーショナル データベース (MySQL、Oracle など) の実現に特化した、異種データ ソース用のオフライン同期ツールです。
HDFS、Hive、ODPS、HBase、FTP、その他の異種データ ソース間の安定した効率的なデータ同期機能。
GitHub - alibaba/DataX: DataX は、Alibaba Cloud DataWorks データ統合のオープンソース バージョンです。
デザインのコンセプト
異種データ ソースの同期問題を解決するために、DataX は複雑なメッシュ同期リンクをスター データ リンクに変えます。
DataX は中間伝送キャリアとして、さまざまなデータ ソースの接続を担当します。新しいデータ ソースにアクセスする必要がある場合、
このデータ ソースを DataX に接続するだけで、既存のデータ ソースとのシームレスなデータ同期が実現します。
現在のステータス
DataX はアリババグループで広く利用されており、あらゆるビッグデータのオフライン同期ビジネスを請け負い、6 年間安定して稼働しています。
現在、同期8wマルチチャンネル動作は毎日完了し、1日のデータ送信量は300TBを超えています
DataX でサポートされるデータ ソース
GitHub - alibaba/DataX: DataX は、Alibaba Cloud DataWorks データ統合のオープンソース バージョンです。
具体的な例は以下に記録されています - Sqlserver から Mysql へのデータの同期であり、テーブル構造は同じです。
ノート:
ブログ:
横柄なローグ気質 blog_CSDN ブログ - C#、アーキテクチャ ロード、SpringBoot のブロガー
達成
1. Windows への DataX のインストール
公式 Web サイトのクイック スタート ドキュメントを参照してください。
マスターの DataX/userGuid.md · alibaba/DataX · GitHub
必要な環境依存関係をインストールして構成します。
自分でコンパイルする必要はないので、jdk1.8 と Python3 の環境変数を設定するだけです。
ドキュメントのダウンロード アドレスに従って、DataX ツールキットをダウンロードします。
https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202210/datax.tar.gz
ダウンロード後、解凍してください。
2. stream2stream データ変換を開始してテストする
解凍後、bin ディレクトリに移動し、新しいジョブ構成ファイル stream2stream.json ファイルを作成します。
json コンテンツを次のように変更します
{
"job": {
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"sliceRecordCount": 10,
"column": [
{
"type": "long",
"value": "10"
},
{
"type": "string",
"value": "hello,你好,世界-DataX"
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"encoding": "UTF-8",
"print": true
}
}
}
],
"setting": {
"speed": {
"channel": 5
}
}
}
}
これは公式テンプレートの json ファイルの例であり、DataX が正常に構成され、開始されたかどうかを自己チェックするために使用されます。
次に、bin ディレクトリで cmd を開き、実行します。
python datax.py ./stream2stream.json
エラーを表示せずに実行が完了するのを待っていましたが、中国語の文字化けが見つかりました
DataX コマンド ボックスの中国語の文字化けは、エンコード形式を設定する必要があります。最初にそれを cmd に入力します。
chcp 65001
次に、上記のコマンドを実行します
実行中の中国語出力が文字化けしなくなりました
実行結果が文字化けしなくなりました
3. さまざまなデータ ソースから変換された json テンプレートを取得します。
上記はストリームからストリームへのデータソース変換、他のデータソースのjsonテンプレートの取得方法です。
DataX は、さまざまなデータ ソースから変換された JSON テンプレートを取得する手順を提供します
次のコマンドを使用して構成テンプレートを表示できます。
python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
データ ソースの名前を取得する方法。たとえば、sqlserver から読み取り、mysql に書き込み、json テンプレートのコマンドを取得します。
python datax.py -r sqlserverreader -w mysqlwriter
このとき、sqlserverからmysqlへのjsonテンプレートが返されます。
これは、ディレクトリがソース コード内でそのように呼ばれているためです。
内部の doc ディレクトリを直接クリックして、サンプルの json ファイルの内容を表示できると言われています。
また、各設定項目のパラメータにも対応する説明があります。
sqlserverreader パラメータの説明
マスターの DataX/sqlserverreader.md · alibaba/DataX · GitHub
mysqlwriterパラメータの説明
マスターの DataX/mysqlwriter.md · alibaba/DataX · GitHub
ここに、完全に更新された新しい json ファイル sqlserver2mysqlALL.json があります。
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"connection": [
{
"jdbcUrl": [
"jdbc:sqlserver://localhost:1433;DatabaseName=数据库名"
],
"table": [
"表名"
]
}
],
"password": "改成自己的密码",
"username": "用户名",
"column": [
"checkid",
"cardID",
"hphm",
"startTime",
"endTime",
"linenumber",
"cwgt",
"cwgtUL",
"cwgtJudge",
"cwkc",
"cwkcResult",
"cwkcUL",
"cwkcJudge",
"cwkk",
"cwkkResult",
"cwkkUL",
"cwkkJudge",
"cwkg",
"cwkgResult",
"cwkgUL",
"cwkgJudge",
"wkccJudge",
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": [
"checkid",
"cardID",
"hphm",
"startTime",
"endTime",
"linenumber",
"cwgt",
"cwgtUL",
"cwgtJudge",
"cwkc",
"cwkcResult",
"cwkcUL",
"cwkcJudge",
"cwkk",
"cwkkResult",
"cwkkUL",
"cwkkJudge",
"cwkg",
"cwkgResult",
"cwkgUL",
"cwkgJudge",
"wkccJudge",
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=gbk",
"table": [
"表名"
]
}
],
"password": "密码",
"preSql": [
"delete from vehicleresult"
],
"session": [],
"username": "用户名",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": "5"
}
}
}
}
ここでのプロセスは、指定された列のデータを SQLserver から読み取ることであり、ここでの列が構成された列であることに注意してください。
次に、mysql に書き込むときに、preSql で設定された delete ステートメントを事前に実行する必要があります。
車両から削除結果
vehicleresult はテーブル名です。その場合、書き込みモードはインラインです
次に、上記のjsonテンプレートのコマンドを実行します。
python datax.py ./sqlserver2mysqlALL.json
完全なアップデートを実現できます。
タイプ、長さ、null 以外を含む両側のデータ構造が一貫している必要があることに注意してください。
たとえば、sqlserver のフィールドが空ではなく、空のデータが存在するが、mysql の対応するフィールドが空ではない場合、同期中にダーティ データとみなされ、同期は失敗します。
上記の完全なアップデート結果
4. 上記コマンドを実行するたびにフルアップデートが行われるため、定期的にコマンドを実行するにはタイミングバットスクリプトが必要です。
新しいバットファイルを作成し、内容を次のように変更します。
#设置编码
chcp 65001
@echo off
title "同步数据"
set INTERVAL=15
timeout %INTERVAL%
:Again
python datax.py ./sqlserver2mysqlALL.json
echo %date% %time:~0,8%
timeout %INTERVAL%
goto Again
上記の内容は 15 秒ごとの実行を表します
python datax.py ./sqlserver2mysqlALL.json
このバットをjsonファイルと同じ階層のbinディレクトリに置き、ダブルクリックして実行します。
5. 上記は完全なアップデートですが、増分アップデートを実現する方法です。
なお、ここでの増分更新には条件制限があり、まず、ここでのデータは削除されず追加更新のみとなり、更新では当日のデータのみが更新されます。
したがって、ここではまず上記の完全な更新を実行して、最初のドッキングでデータが取得されていることを確認し、その後、スケジュールされたタスクを使用して増分更新を実行します。
現在のデータをクエリして置換します。
さらに、データの読み取りおよび書き込み時に where 条件を使用して現在のデータをクエリできるように、日付と時刻のフィールドが存在することを確認する必要があります。
さらに、ここでの主キーは自動インクリメントされる int データではありません。それ以外の場合は、自動インクリメントされる主キー ID に従って増分更新することもできます。
ここの sqlserver はサードパーティ システムによって提供されているため、必要なタイプに変更できません
上記の sqlserverreader を変更して、その日のデータをクエリするための where 条件を追加します。
Sqlserverでその日のデータをクエリする
where datediff(day,startTime,getdate())=0
startTime は時間フィールドです。
Mysqlでその日のデータをクエリする
WHERE DATE(startTime) = CURDATE()
したがって、上記のjsonファイルを次のように変更します
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"connection": [
{
"jdbcUrl": [
"jdbc:sqlserver://localhost:1433;DatabaseName=数据库名"
],
"table": [
"表名"
]
}
],
"password": "改成自己的密码",
"username": "用户名",
"where": "datediff(day,startTime,getdate())=0",
"column": [
"checkid",
"cardID",
"hphm",
"startTime",
"endTime",
"linenumber",
"cwgt",
"cwgtUL",
"cwgtJudge",
"cwkc",
"cwkcResult",
"cwkcUL",
"cwkcJudge",
"cwkk",
"cwkkResult",
"cwkkUL",
"cwkkJudge",
"cwkg",
"cwkgResult",
"cwkgUL",
"cwkgJudge",
"wkccJudge",
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": [
"checkid",
"cardID",
"hphm",
"startTime",
"endTime",
"linenumber",
"cwgt",
"cwgtUL",
"cwgtJudge",
"cwkc",
"cwkcResult",
"cwkcUL",
"cwkcJudge",
"cwkk",
"cwkkResult",
"cwkkUL",
"cwkkJudge",
"cwkg",
"cwkgResult",
"cwkgUL",
"cwkgJudge",
"wkccJudge",
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/数据库名?useUnicode=true&characterEncoding=gbk",
"table": [
"表名"
]
}
],
"password": "密码",
"preSql": [
"delete from 表名 WHERE DATE(startTime) = CURDATE();"
],
"session": [],
"username": "root",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": "5"
}
}
}
}
このとき、batスクリプトを使用して定期的に実行し、タイミング時に上記15個のパラメータを自分で変更することができます。
次に、今日のデータをもう 1 つ追加して、同期効果をテストします。
上記の段階的に更新される json に sqlserver2mysqlAdd.json という名前を付けます。