DataXによる大規模時系列データ移行の実戦:MySQLからTDengine3.xへ

バックグラウンド

MySQLデータベースには 1 億件を超える機器履歴データ テーブルがあります。低コストで迅速に移行するにはどうすればよいでしょうかTDengine3.x?

タイトルからわかるように、私たちが使用するデータ移行/同期ツールは、DataXデータ ソース ( Source) が従来のリレーショナル データベースでありMySQL、ターゲット データベース ( Sink) がシーン特性を持つ新しいタイプの時系列データベースですTDengine

DataX: Alibaba Cloud DataWorks データ統合のオープンソース バージョンであり、アリババ グループで広く使用されているオフライン データ同期ツール/プラットフォームです。DataXMySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore (OTS)、MaxCompute (ODPS)、Hologres、DRDS、databend など、さまざまな異種データソース間の効率的なデータ同期機能を実現します。

MySQL: わずかに。

TDengine: オープンソース、高性能、クラウドネイティブの時系列データベース (Time-Series Database、TSDB) です。モノのインターネット、産業用インターネット、車両のインターネット、運用と保守、金融などの分野TDengineで広く使用できます。IT時系列データベースのコア機能に加え、TDengineキャッシュ、データサブスクリプション、ストリーミングコンピューティングなどの機能も提供し、システム設計の複雑さを最小限に抑え、研究開発費や運用コストを削減するミニマルな時系列データ処理プラットフォームです。

からMySQLへのデータ移行はTDengine3.x、異種データの移行に直面しています。まず、MySQLと のデータ モデルの違いを理解する必要がありますTDengine。詳細については、Taosi Data が公式に提供する電力メーター データのモデル比較: MySQL 開発者向け TDengine Getting Started Guideを参照してください。

データ・モデル

貯水池の水位監視の場合を例にとると、 には、MySQL1 つのデバイス情報テーブル (デバイス番号、メーカー、モデルなど) と 1 つのデバイス データ テーブル (センサーによって収集されたシーケンス データ) があります。

2023-05-28-デバイス.jpg

2023-05-28-ウォーターテーブル.jpg

MySQL2 つのテーブルは、TDengineへの移行後は1 スーパーテーブル+ N (デバイス数) のサブテーブルTDengineとなり、各サブテーブルの名前がデバイス情報テーブルの各デバイス コードに対応する、という設計思想でモデル化されています。具体的には、のデータ モデルは次のとおりです。MySQLTDengine

create database if not exists sensor;
create stable if not exists sensor.water(ts timestamp, level float, status int) tags(district_code nchar(6), unit_id nchar(36), sensor_code int);

ここで作成されるスーパーテーブルは 1 つだけであり、特定のサブテーブルはMySQLデータ移行時にデバイス情報テーブルのデバイス コードに従って自動的に作成されます。

2023-05-28-説明.jpg

移行ツールの準備

最初はhttps://github.com/taosdata/DataXの README: Download DataX download addressから直接ダウンロードしていたのですが、後で Writer のバージョンがないことが分かり、 https://github.com/taosdata/DataXTDengine3.xのソースコードを直接ダウンロードし、ローカルでコンパイルしてパッケージを生成し、 のディレクトリに置きましjarDataXplugin

2023-05-28-mvn.jpg
注:ローカル ソース コードmvn clean package -Dmaven.test.skip=trueがビルドおよび生成されたらtdengine30writer-0.0.1-SNAPSHOT.jarの下のディレクトリをコピーし、 に名前を変更しそれに応じて とその中のと 、の下のディレクトリを変更します\datax\plugin\writertdenginewritertdengine30writerplugin.jsonplugin_job_template.jsonlibstaos-jdbcdriver-3.0.2.jar

2023-05-28-プラグイン.jpg
この時点でツールの準備は完了し、残りはデータ移行用の構成スクリプトを作成することになります。

デバイス情報シートの移行

job-water.json: 移行構成スクリプトは 2 つの部分に分かれています。1 つはデータ ソースで、もう 1 つはターゲット ライブラリです。デバイス情報テーブルを移行するステップの結果、すべてのサブテーブル (1 つのデバイスに対して 1 つのテーブル) が作成されます。

  • データソース
    "name": "mysqlreader" の場合、デバイス情報テーブルを移行する際に、デバイスコードの別名を付けるtbnameと、TDengineサブテーブルの名前として自動的に作成されます。

TDengine注: ではテーブル名に数字を使用できないため、ここではデバイス コードの前に文字 d が追加されます。

  • ターゲットライブラリ

"name": "tdengine30writer" は、columnデータ ソース内のMySQL順序と名前に対応する部分にデータ ソースでクエリされた列名をリストし、tableテーブル名にスーパー テーブルの名前を直接記述します。

{
    
    
    "job": {
    
    
        "content": [
            {
    
    
                "reader": {
    
    
                    "name": "mysqlreader",
                    "parameter": {
    
    
                        "username": "root",
                        "password": "your-password",
                        "connection": [
                            {
    
    
                                "jdbcUrl": [
                                    "jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai"
                                ],
                                "querySql": [
                                    "select concat('d', code) as tbname, create_time as ts, sensor_code, district_code, unit_id from b_device WHERE sensor_code=2;"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
    
    
                    "name": "tdengine30writer",
                    "parameter": {
    
    
                        "username": "root",
                        "password": "taosdata",
                        "column": [
                            "tbname",
                            "ts",
                            "sensor_code",
                            "district_code",
                            "unit_id"
                        ],
                        "connection": [
                            {
    
    
                                "table": [
                                    "water"
                                ],
                                "jdbcUrl": "jdbc:TAOS-RS://192.168.44.158:6041/sensor"
                            }
                        ],
                        "batchSize": 1000,
                        "ignoreTagsUnmatched": true
                    }
                }
            }
        ],
        "setting": {
    
    
            "speed": {
    
    
                "channel": 1
            }
        }
    }
}
  • 移行/同期スクリプトを実行する
D:\datax\bin>datax.py ../job/job-water.json

デバイスのデータシートの移行

job-water-data.json: 移行構成スクリプトは 2 つの部分に分かれています。1 つはデータ ソースで、もう 1 つはターゲット ライブラリです。デバイス データ テーブルを移行するステップの結果、センサー データはデバイス番号に従って対応するサブテーブルに書き込まれます。

  • 情報元

デバイス データ テーブルを移行するときは、センサーによって収集されたフィールドをクエリし、デバイス コードの別名も付けてtbnameTDengine対応するサブテーブルにデータを自動的に書き込みます。

  • ターゲットライブラリ

columnデータ ソース内の順序と名前に対応する、データ ソース内でクエリされた列名をパートにリストします。デバイス データ テーブルを構成するときは、テーブル名にすべてのサブテーブルの名前をMySQL書き込むように注意する必要があります。table

{
    
    
    "job": {
    
    
        "content": [
            {
    
    
                "reader": {
    
    
                    "name": "mysqlreader",
                    "parameter": {
    
    
                        "username": "root",
                        "password": "your-password",
                        "connection": [
                            {
    
    
                                "jdbcUrl": [
                                    "jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai&net_write_timeout=600"
                                ],
                                "querySql": [
                                    "select concat('d', code) as tbname, create_time as ts, value as level, status from sensor_water;"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
    
    
                    "name": "tdengine30writer",
                    "parameter": {
    
    
                        "username": "root",
                        "password": "taosdata",
                        "column": [
                            "tbname",
                            "ts",
                            "level",
                            "status"
                        ],
                        "connection": [
                            {
    
    
                                "table": [
                                    "d66057408201830",
                                    "d66057408063030",
                                    "d66057408027630",
                                    "d66057408208130",
                                    "d66057408009630",
                                    "d66057408000530",
                                    "d66057408067330",
                                    "d66057408025430"
                                ],
                                "jdbcUrl": "jdbc:TAOS-RS://192.168.44.158:6041/sensor"
                            }
                        ],
                        "encoding": "UTF-8",
                        "batchSize": 1000,
                        "ignoreTagsUnmatched": true
                    }
                }
            }
        ],
        "setting": {
    
    
            "speed": {
    
    
                "channel": 1
            }
        }
    }
}
  • 移行/同期スクリプトを実行する
D:\datax\bin>datax.py ../job/job-water-data.json

DataX の使用時に発生する可能性のある問題

DataX の中国語文字化け

実行後D:\datax\bin>datax.py ../job/job.json、コンソール上の中国語出力が文字化けします。

  • 解決策:CHCP 65001新しいウィンドウに「アクティブ コード ページ: 65001」が表示されるまで直接入力して Enter キーを押し、ジョブ コマンドを再度実行すると、中国語が正常に表示されます。

2023-05-28-サブテーブル.jpg

プラグインの読み込みに失敗しました。指定されたプラグインの読み込みが完了していません: [mysqlreader、tdengine20writer]

  • 解決策: 使用するプラグインの名前を正しく記述する必要があります。

com.アリババ.データタックス.共通.例外。DataXException: コード:[TDengineWriter-00]、説明:[パラメータ値がありません]。- パラメーター [ユーザー名] が設定されていません。

  • 解決策: TDengine2.0 と 3.0 の設定項目は異なります。これは、最初に TDengine2.0 の設定を使用して移行したためであり、パラメータは 3.0 のドキュメントに従って変更できます。

java.lang. ClassCastException: java.lang. 文字列を java.util にキャストすることはできません。リスト

  • 解決策: mysql リーダーの読み取り部分の jdbcUrl と querySql の値は、jdbc固定テンプレートである「[]」で囲む必要があります。

com.アリババ.データタックス.共通.例外。DataXException: コード: [TDengineWriter-02]、説明: [ランタイム例外]。- [“jdbc: TAOS-RS://192.168.44.158:6041/sensor”] に適したドライバーが見つかりません

  • 解決策: ライター側の「jdbcUrl」: 「jdbc: TAOS-RS://192.168.44.158:6041/sensor」、配列の代わりに文字列を使用します。

Null ポインター エラー: エラー WriterRunner - Writer Runner が例外を受け取りました:

java.lang.NullPointerException: null
        at com.taosdata.jdbc.rs.RestfulDriver.connect(RestfulDriver.java:111) ~[taos-jdbcdriver-2.0.37.jar:na]
        at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_311]
        at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_311]
        at com.alibaba.datax.plugin.writer.tdenginewriter.DefaultDataHandler.handle(DefaultDataHandler.java:75) ~[tdenginewriter-0.0.1-SNAPSHOT.jar:na]
  • 解決策: taos-jdbcdriver が 2.0 jar パッケージを使用していることを確認し、DataX ソース コードをダウンロードし、tdengine30writer-0.0.1-SNAPSHOT.jar をコンパイルして生成し、tdenginewriter フォルダーを tdengine30writer にコピーし、tdengine30writer-0.0.1-SNAPSHOT.jar を tdengine30writer に配置し、tdengine30writer\ libs を削除します。その中に taos-jdbcdriver-2.0.37.jar を追加し、taos-jdbcdriver-3.0.2.jar を追加します。

com.alibaba.datax.common.Exception. DataXException: コード:[TDengineWriter-02]、説明:[実行時例外]. - TDengine エラー (2600): sql: description 66057408201830、desc: 「66057408201830」付近の構文エラー

  • 解決策: テーブル名に数字を使用することはできません。数字の前に文字 d を追加しました。

com.mysql.jdbc.例外.jdbc4。CommunicationsException: 接続が失敗したときに、アプリケーションは結果をストリーミングしていました。サーバー上の「net_write_timeout」の値を増やすことを検討してください。

  • 解決策:URLデータ ソースの接続でこのパラメータを増やし、net_write_timeout/net_read_timeout少し大きく設定します。デフォルトは 60 秒です。
    例えば:jdbc:mysql://your-ip:3306/iotdata?useSSL=false&serverTimezone=Asia/Shanghai&net_write_timeout=600

MySQL変数値を:で表示しますSHOW VARIABLES LIKE "net%"

2023-05-28-NetParam.jpg

小さな要約

上記はDataXからMySQLへのTDengine3.x時系列データ移行の実際の記録に基づいており、DataXツールの助けを借りて、構成ファイル駆動のアプローチを通じて大量の時系列データの迅速な移行が完了します。

実際の移行テストの結果では、3,000 台以上の貯水池水位検知デバイス、1 億枚以上の履歴データ シート、および 5,000 万枚以上のデータ シートが半日で移行されたことが示されています。

参照


ご質問やバグが見つかった場合は、お気軽にご連絡ください。

ご意見やご提案は大歓迎です。

おすすめ

転載: blog.csdn.net/u013810234/article/details/130910778