1。概要
実際のビジネスシステムでは、1つのテーブルに大量のデータが存在することによるさまざまな問題を解決するために、通常、データベーステーブルをサブデータベースとサブテーブルに分割してシステムのスループットを向上させます。
ただし、これはその後のデータ分析に問題をもたらします。現時点では、通常、ビジネスデータベースのサブデータベースとサブテーブルをデータウェアハウスに同期し、これらのサブデータベースとサブテーブルのデータをマージしようとします。 1つのデータベースと1つのテーブルに。後のデータ分析に便利です
このドキュメントでは、Apache Doris FlinkConnectorおよびDorisStreamLoadの2段階送信と組み合わせたFlinkCDCに基づいて、MySQLデータベースサブデータベースおよびサブテーブルのApacheDorisデータウェアハウスへのリアルタイムで効率的なアクセスを実現する方法を示します。
1.1CDCとは
CDCはChange Data Capture 变更数据获取
()の略です。
中心的なアイデアは、データベースの変更(データまたはデータテーブルのINSERT、UPDATEの更新、DELETEの削除など)を監視およびキャプチャし、これらの変更を発生順に完全に記録し、他のサービスのメッセージミドルウェアに書き込むことです。サブスクリプションと消費。
CDCテクノロジーのアプリケーションシナリオも非常に幅広く、次のようなものがあります。
●データ分散。データソースを複数のダウンストリームに分散します。多くの場合、ビジネスの分離やマイクロサービスに使用されます。
●データ統合、分散した異種データソースをデータウェアハウスに統合し、データアイランドを排除し、その後の分析を容易にします。
●データベースのバックアップ、災害復旧などに一般的に使用されるデータ移行。
1.2FlinkCDCを選択する理由
データベースログに基づくFlinkCDCのChangeDataCaputreテクノロジーは、完全かつ段階的な統合読み取り機能を実現します。Flinkの優れたパイプライン機能と豊富なアップストリームおよびダウンストリームエコシステムの助けを借りて、さまざまなデータベースの変更のキャプチャをサポートし、これらの変更はダウンストリームストレージに同期しますリアルタイムで。
現在、Flink CDCのアップストリームは、MySQL、MariaDB、PG、Oracle、MongoDB、Oceanbase、TiDB、SQLServer、およびその他のデータベースをすでにサポートしています。
Flink CDCのダウンストリームはより豊富で、Kafka、Pulsarメッセージキュー、Hudi、Iceberg、Dorisなどへの書き込みをサポートし、さまざまなデータウェアハウスやデータレイクへの書き込みをサポートします。
同時に、Flink SQLでネイティブにサポートされているChangelogメカニズムにより、CDCデータの処理を非常に簡単にすることができます。ユーザーは、SQLを介してデータベースの完全データと増分データのクリーニング、拡張、集約などの操作を実行できます。これにより、ユーザーのしきい値が大幅に削減されます。さらに、Flink DataStream APIは、ユーザーがカスタムロジックを実装するためのコードを記述できるようにし、サービスを大幅にカスタマイズする自由をユーザーに提供します。
Flink CDCテクノロジーのコアは、テーブル内の完全なデータと増分データの同期と処理をサポートしてリアルタイムの一貫性を保つことです。これにより、ユーザーは各テーブルのリアルタイムの一貫性のあるスナップショットを簡単に取得できます。たとえば、テーブルには完全な履歴ビジネスデータがあり、増分ビジネスデータは継続的に書き込まれ、更新されます。Flink CDCは、増分更新レコードをリアルタイムでキャプチャし、データベースとリアルタイムで整合性のあるスナップショットを提供します。更新レコードの場合は、既存のデータを更新します。レコードが挿入されると、既存のデータに追加されます。プロセス全体を通じて、Flink CDCは一貫性を保証します。つまり、レコードが繰り返されたり失われたりすることはありません。
FLinkCDCには次の利点があります。
- Flinkの演算子とSQLモジュールは、より成熟していて使いやすいです
- Flinkジョブは、演算子の並列処理を調整することにより、処理能力を簡単に拡張できます
- Flinkは高度な状態バックエンド(状態バックエンド)をサポートし、大量の状態データへのアクセスを可能にします
- Flinkは、SourceやSinkなどのより環境に配慮したサポートを提供します
- Flinkは、より多くのユーザーベースとアクティブなサポートコミュニティを備えているため、問題の解決が容易になります。
さらに、Flink Table / SQLモジュールは、データベーステーブルと変更レコードストリーム(CDCのデータストリームなど)を同じものの両側と見なすため、内部で提供されるUpsertメッセージ構造(+I
新しい値を表し-U
、値を表す)レコードの更新前、レコードの更新を+U
表す最後の値(-D
削除を示す)は、Debeziumetalによって生成された変更レコードと1対1で対応できます。
1.3ApacheDorisとは
Apache Dorisは、最新のMPP分析データベース製品です。クエリ結果は1秒未満の応答時間で取得でき、リアルタイムのデータ分析を効果的にサポートします。Apache Dorisの分散アーキテクチャは非常にシンプルで、操作と保守が簡単で、10PBを超える大規模なデータセットをサポートできます。
Apache Dorisは、固定履歴レポート、リアルタイムデータ分析、インタラクティブデータ分析、探索的データ分析など、さまざまなデータ分析のニーズを満たすことができます。データ分析作業をより簡単かつ効率的にしましょう!
1.42フェーズコミット
1.4.1 2フェーズコミット(2PC)とは
分散システムでは、各ノードが他のノードのトランザクション実行ステータスを認識できるようにするために、すべてのノードの実行ロジックを均一に処理する中央ノードを導入する必要があります。この中央ノードはコーディネーターと呼ばれ、中央ノード。他のビジネスノードは参加者と呼ばれます。
2PCは、分散トランザクションを2つのフェーズに分割します。2つのフェーズは、コミット要求(投票)とコミット(実行)です。コーディネーターは、参加者の回答に応じて、実際に取引を実行するかどうかを決定します。具体的なプロセスは次のとおりです。
リクエスト(投票)フェーズを送信する
- コーディネーターは、トランザクションの内容を含む準備要求をすべての参加者に送信し、トランザクションをコミットする準備ができるかどうかを尋ね、参加者の応答を待ちます。
- アクターは、トランザクションに含まれる操作を実行し、ログの取り消し(ロールバックの場合)とやり直し(再生の場合)を実行しますが、実際にはコミットしません。
- 参加者は、トランザクション操作の実行結果をコーディネーターに返し、実行が成功した場合はyesを返し、それ以外の場合はnoを返します。
コミット(実行)フェーズ
成功と失敗には2つのタイプがあります。
- すべての参加者がyesを返す場合、トランザクションをコミットできます。
- コーディネーターは、すべての参加者にコミット要求を送信します。
- 参加者がコミット要求を受信した後、トランザクションは実際にコミットされ、占有されていたトランザクションリソースが解放され、ackがコーディネーターに返されます。
- コーディネーターはすべての参加者からackメッセージを受信し、トランザクションは正常に完了します。
- いずれかの参加者がnoを返すか、タイムアウトが失敗した場合、トランザクションは中断され、ロールバックする必要があります。
- コーディネーターは、すべての参加者にロールバック要求を送信します。
- 参加者はロールバック要求を受信すると、取り消しログに従ってトランザクション実行前の状態にロールバックし、占有されているトランザクションリソースを解放して、コーディネーターにackを返します。
- コーディネーターはすべての参加者からackメッセージを受信し、トランザクションのロールバックが完了します。
1.4 Flink 2PC
ストリーム処理エンジンとして、Flinkは当然、1回限りのセマンティクスを保証します。エンドツーエンドの1回限りのセマンティクスは、入力、処理ロジック、および出力の相乗効果の結果です。Flinkは、チェックポイントメカニズムと軽量の分散スナップショットアルゴリズムABSに依存して、1回だけ確実に実行します。正確に1回の出力ロジックを実現するには、べき等書き込み、トランザクション書き込みの2つの制限のいずれかを課す必要があります。
プレコミット段階のプロセス
チェックポイントを実行する必要がある場合は常に、JobManagerはチェックポイントの境界としてデータフローにバリア(バリア)に入ります。バリアはオペレーターチェーンに沿って下流に渡され、オペレーターに到達するたびに、状態スナップショットを状態バックエンドに書き込むアクションがトリガーされます。バリアがKafkaシンクに到達すると、メッセージデータはKafkaProducer.flush()メソッドを介してフラッシュされますが、実際にはまだコミットされていません。次に、チェックポイントを介してコミットフェーズをトリガーする必要があります
提出段階のプロセス
書き込みは、すべてのチェックポイントが正常に完了した場合にのみ成功します。これは、JobManagerがコーディネーターであり、各オペレーターが参加者である上記の2PCプロセスと一致しています(ただし、シンク参加者のみが送信を実行します)。チェックポイントが失敗すると、notifyCheckpointComplete()メソッドは実行されません。再試行が失敗した場合、最終的にはabort()メソッドが呼び出され、トランザクションがロールバックされます。
1.5 Doris Stream Load 2PC
1.5.1ストリームの読み込み
ストリームの読み込みは、Apache Dorisが提供する同期インポート方式です。ユーザーは、HTTPプロトコルを送信することにより、ローカルファイルまたはデータストリームをDorisにインポートするリクエストを送信します。ストリームロードはインポートを同期的に実行し、インポート結果を返します。ユーザーは、リクエストのリターン本文を介して、インポートが成功したかどうかを直接判断できます。
ストリームの読み込みは、主にローカルファイルのインポート、またはプログラムを介したデータストリームのデータのインポートに適しています。
メソッドを使用すると、ユーザーはHttpクライアントを介して操作するか、Curlコマンドを使用できます。
curl --location-trusted -u user:passwd [-H ""...] -T data.file -H "label:label" -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load
ユーザーが同じデータを繰り返しインポートするのを防ぐために、ここではインポートタスクのラベルが使用されます。同じバッチのデータに同じラベルを使用することを強くお勧めします。このようにして、同じバッチのデータに対する繰り返しの要求は1回だけ受け入れられ、At-Most-Onceが保証されます。
1.5.2ストリームロード2PC
Aapche Dorisの初期のStreamLoadには、2段階の送信がありません。データをインポートする場合、データのインポートはStream Loadのhttpインターフェイスを介して直接完了し、成功と失敗のみが行われます。
- これは通常の状況では問題になりません。分散環境では、特定のインポートタスクが失敗するため、両端のデータに一貫性がない可能性があります。特にDoris Flinkコネクタでは、以前のDorisFlinkコネクタのデータインポートの失敗に必要です。ユーザーが自分で制御し、例外を処理します。たとえば、インポートが失敗した場合は、指定された場所(Kafkaなど)にデータを保存してから、手動で処理します。
- 他の問題が原因でFlinkジョブが突然ハングした場合、一部のデータは成功し、一部のデータは失敗します。失敗したデータにはチェックポイントがないため、ジョブを再開すると失敗したデータを再利用できず、データの一貫性が失われます。両端。
上記の問題を解決し、両端でデータの一貫性を確保するために、Doris StreamLoad2PCを実装しました。原則は次のとおりです。
- 2つのフェーズでコミットする
- 最初の段階では、データ書き込みタスクが送信されます。このとき、データ書き込みが成功すると、データステータスは非表示になり、トランザクションステータスはPRECOMMITTEDになります。
- データが正常に書き込まれた後、ユーザーはコミット操作をトリガーしてトランザクションステータスをVISIBLEに変更します。このとき、データを照会できます。
- ユーザーがこのデータのバッチを使用する場合は、トランザクションIDを使用するだけで、トランザクションの中止操作がトリガーされ、このデータのバッチは自動的に削除されます。
1.5.3 Streamload2PCの使用方法
- be.confで構成します
disable_stream_load_2pc=false
(再起動して有効にします) - HEADERで宣言されてい
two_phase_commit=true
ます。
事前コミットを開始するには:
curl --location-trusted -u user:passwd -H "two_phase_commit:true" -T test.txt http://fe_host:http_port/api/{db}/{table}/_stream_load
トランザクションのトリガーコミット操作
curl -X PUT --location-trusted -u user:passwd -H "txn_id:18036" -H "txn_operation:commit" http://fe_host:http_port/api/{db}/_stream_load_2pc
物事に対して中止アクションをトリガーする
curl -X PUT --location-trusted -u user:passwd -H "txn_id:18037" -H "txn_operation:abort" http://fe_host:http_port/api/{db}/_stream_load_2pc
1.6DorisFlinkコネクタ2PC
以前、Dorisテーブルデータの読み取り、アップサート、削除(一意キーモデル)に対応したDoris Flink Connectorを提供していましたが、ジョブの失敗などの異常により、両端のデータが一致しない場合があります。
これらの問題を解決するために、FLink2PCとDorisStream Load2PCに基づいてDorisConnectorを変更およびアップグレードして、両端が正確に1つになるようにしました。
- 読み取りバッファと書き込みバッファをメモリに保持します。起動時に、書き込みと送信を非同期で開始します。この期間中、httpチャンクを介してBEにデータを書き込み続け、チェックポイントまで書き込みを停止します。これの利点は次のとおりです。ユーザーによる頻繁なhttpの送信によって引き起こされるオーバーヘッドを回避します。チェックポイントが完了すると、書き込みの次の段階が開始されます。
- このチェックポイント中に、テーブルのデータを同時に書き込む複数のタスクが存在する可能性があります。このチェックポイント中にグローバルラベルに対応し、チェックポイント中にこのラベルに対応するデータを書き込むトランザクションを統合します。1つのコミット、作成表示されるデータ状態、
- 失敗した場合、Flinkは再起動時にチェックポイントを介してデータを再生します。
- これにより、Dorisの両端でデータの一貫性が確保されます
2.システムアーキテクチャ
完全な例を見て、最新バージョンのDoris Flink Connector(2段階の送信をサポート)を介してFlink CDCを統合し、MySQLサブデータベースとサブテーブルのリアルタイムの収集と保存を実現する方法を見てみましょう。
- ここでは、Flink CDCを使用して、MySQLサブデータベースとサブテーブルのデータ収集を完了します。
- 次に、DorisFlinkコネクタを介してデータストレージを完了します
- 最後に、Dorisの高同時実行性、高性能のOLAP分析およびコンピューティング機能を使用して、外部データサービスを提供します
3.MySQLのインストール構成
3.1MySQLをインストールする
Dockerを使用してMysqlをすばやくインストールおよび構成します。詳細については、次の接続を参照してください。
https://segmentfault.com/a/1190000021523570
3.2Mysqlbinlogを開く
Dockerコンテナを入力して/etc/my.cnfファイルを変更し、[mysqld]の下に以下を追加します。
log_bin=mysql_bin
binlog-format=Row
server-id=1
次に、Mysqlを再起動します
systemctl restart mysqld
3.3データを準備する
ここでは、2つのデータベースemp_1とemp_2を準備し、2つのテーブルemployees_1とemployees_2が各データベースの下でアクティブおよびスタンバイであることを示します。そして初期化データを与える
CREATE DATABASE emp_1;
USE emp_1;
CREATE TABLE employees_1 (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
INSERT INTO `employees_1` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
(10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
(10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),
(10011,'1953-11-07','Mary','Sluis','F','1990-01-22'),
(10012,'1960-10-04','Patricio','Bridgland','M','1992-12-18'),
(10013,'1963-06-07','Eberhardt','Terkki','M','1985-10-20'),
(10014,'1956-02-12','Berni','Genin','M','1987-03-11'),
(10015,'1959-08-19','Guoxiang','Nooteboom','M','1987-07-02'),
(10016,'1961-05-02','Kazuhito','Cappelletti','M','1995-01-27'),
(10017,'1958-07-06','Cristinel','Bouloucos','F','1993-08-03'),
(10018,'1954-06-19','Kazuhide','Peha','F','1987-04-03'),
(10019,'1953-01-23','Lillian','Haddadi','M','1999-04-30'),
(10020,'1952-12-24','Mayuko','Warwick','M','1991-01-26'),
(10021,'1960-02-20','Ramzi','Erde','M','1988-02-10'),
(10022,'1952-07-08','Shahaf','Famili','M','1995-08-22'),
(10023,'1953-09-29','Bojan','Montemayor','F','1989-12-17'),
(10024,'1958-09-05','Suzette','Pettey','F','1997-05-19'),
(10025,'1958-10-31','Prasadram','Heyers','M','1987-08-17'),
(10026,'1953-04-03','Yongqiao','Berztiss','M','1995-03-20'),
(10027,'1962-07-10','Divier','Reistad','F','1989-07-07'),
(10028,'1963-11-26','Domenick','Tempesti','M','1991-10-22'),
(10029,'1956-12-13','Otmar','Herbst','M','1985-11-20'),
(10030,'1958-07-14','Elvis','Demeyer','M','1994-02-17'),
(10031,'1959-01-27','Karsten','Joslin','M','1991-09-01'),
(10032,'1960-08-09','Jeong','Reistad','F','1990-06-20'),
(10033,'1956-11-14','Arif','Merlo','M','1987-03-18'),
(10034,'1962-12-29','Bader','Swan','M','1988-09-21'),
(10035,'1953-02-08','Alain','Chappelet','M','1988-09-05'),
(10036,'1959-08-10','Adamantios','Portugali','M','1992-01-03');
CREATE TABLE employees_2 (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
INSERT INTO `employees_2` VALUES (10037,'1963-07-22','Pradeep','Makrucki','M','1990-12-05'),
(10038,'1960-07-20','Huan','Lortz','M','1989-09-20'),
(10039,'1959-10-01','Alejandro','Brender','M','1988-01-19'),
(10040,'1959-09-13','Weiyi','Meriste','F','1993-02-14'),
(10041,'1959-08-27','Uri','Lenart','F','1989-11-12'),
(10042,'1956-02-26','Magy','Stamatiou','F','1993-03-21'),
(10043,'1960-09-19','Yishay','Tzvieli','M','1990-10-20'),
(10044,'1961-09-21','Mingsen','Casley','F','1994-05-21'),
(10045,'1957-08-14','Moss','Shanbhogue','M','1989-09-02'),
(10046,'1960-07-23','Lucien','Rosenbaum','M','1992-06-20'),
(10047,'1952-06-29','Zvonko','Nyanchama','M','1989-03-31'),
(10048,'1963-07-11','Florian','Syrotiuk','M','1985-02-24'),
(10049,'1961-04-24','Basil','Tramer','F','1992-05-04'),
(10050,'1958-05-21','Yinghua','Dredge','M','1990-12-25'),
(10051,'1953-07-28','Hidefumi','Caine','M','1992-10-15'),
(10052,'1961-02-26','Heping','Nitsch','M','1988-05-21'),
(10053,'1954-09-13','Sanjiv','Zschoche','F','1986-02-04'),
(10054,'1957-04-04','Mayumi','Schueller','M','1995-03-13');
CREATE DATABASE emp_2;
USE emp_2;
CREATE TABLE employees_1 (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
INSERT INTO `employees_1` VALUES (10055,'1956-06-06','Georgy','Dredge','M','1992-04-27'),
(10056,'1961-09-01','Brendon','Bernini','F','1990-02-01'),
(10057,'1954-05-30','Ebbe','Callaway','F','1992-01-15'),
(10058,'1954-10-01','Berhard','McFarlin','M','1987-04-13'),
(10059,'1953-09-19','Alejandro','McAlpine','F','1991-06-26'),
(10060,'1961-10-15','Breannda','Billingsley','M','1987-11-02'),
(10061,'1962-10-19','Tse','Herber','M','1985-09-17'),
(10062,'1961-11-02','Anoosh','Peyn','M','1991-08-30'),
(10063,'1952-08-06','Gino','Leonhardt','F','1989-04-08'),
(10064,'1959-04-07','Udi','Jansch','M','1985-11-20'),
(10065,'1963-04-14','Satosi','Awdeh','M','1988-05-18'),
(10066,'1952-11-13','Kwee','Schusler','M','1986-02-26'),
(10067,'1953-01-07','Claudi','Stavenow','M','1987-03-04'),
(10068,'1962-11-26','Charlene','Brattka','M','1987-08-07'),
(10069,'1960-09-06','Margareta','Bierman','F','1989-11-05'),
(10070,'1955-08-20','Reuven','Garigliano','M','1985-10-14'),
(10071,'1958-01-21','Hisao','Lipner','M','1987-10-01'),
(10072,'1952-05-15','Hironoby','Sidou','F','1988-07-21'),
(10073,'1954-02-23','Shir','McClurg','M','1991-12-01'),
(10074,'1955-08-28','Mokhtar','Bernatsky','F','1990-08-13'),
(10075,'1960-03-09','Gao','Dolinsky','F','1987-03-19'),
(10076,'1952-06-13','Erez','Ritzmann','F','1985-07-09'),
(10077,'1964-04-18','Mona','Azuma','M','1990-03-02'),
(10078,'1959-12-25','Danel','Mondadori','F','1987-05-26'),
(10079,'1961-10-05','Kshitij','Gils','F','1986-03-27'),
(10080,'1957-12-03','Premal','Baek','M','1985-11-19'),
(10081,'1960-12-17','Zhongwei','Rosen','M','1986-10-30'),
(10082,'1963-09-09','Parviz','Lortz','M','1990-01-03'),
(10083,'1959-07-23','Vishv','Zockler','M','1987-03-31'),
(10084,'1960-05-25','Tuval','Kalloufi','M','1995-12-15');
CREATE TABLE employees_2(
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
INSERT INTO `employees_2` VALUES (10085,'1962-11-07','Kenroku','Malabarba','M','1994-04-09'),
(10086,'1962-11-19','Somnath','Foote','M','1990-02-16'),
(10087,'1959-07-23','Xinglin','Eugenio','F','1986-09-08'),
(10088,'1954-02-25','Jungsoon','Syrzycki','F','1988-09-02'),
(10089,'1963-03-21','Sudharsan','Flasterstein','F','1986-08-12'),
(10090,'1961-05-30','Kendra','Hofting','M','1986-03-14'),
(10091,'1955-10-04','Amabile','Gomatam','M','1992-11-18'),
(10092,'1964-10-18','Valdiodio','Niizuma','F','1989-09-22'),
(10093,'1964-06-11','Sailaja','Desikan','M','1996-11-05'),
(10094,'1957-05-25','Arumugam','Ossenbruggen','F','1987-04-18'),
(10095,'1965-01-03','Hilari','Morton','M','1986-07-15'),
(10096,'1954-09-16','Jayson','Mandell','M','1990-01-14'),
(10097,'1952-02-27','Remzi','Waschkowski','M','1990-09-15'),
(10098,'1961-09-23','Sreekrishna','Servieres','F','1985-05-13'),
(10099,'1956-05-25','Valter','Sullins','F','1988-10-18'),
(10100,'1953-04-21','Hironobu','Haraldson','F','1987-09-21'),
(10101,'1952-04-15','Perla','Heyers','F','1992-12-28'),
(10102,'1959-11-04','Paraskevi','Luby','F','1994-01-26'),
(10103,'1953-11-26','Akemi','Birch','M','1986-12-02'),
(10104,'1961-11-19','Xinyu','Warwick','M','1987-04-16'),
(10105,'1962-02-05','Hironoby','Piveteau','M','1999-03-23'),
(10106,'1952-08-29','Eben','Aingworth','M','1990-12-19'),
(10107,'1956-06-13','Dung','Baca','F','1994-03-22'),
(10108,'1952-04-07','Lunjin','Giveon','M','1986-10-02'),
(10109,'1958-11-25','Mariusz','Prampolini','F','1993-06-16'),
(10110,'1957-03-07','Xuejia','Ullian','F','1986-08-22'),
(10111,'1963-08-29','Hugo','Rosis','F','1988-06-19'),
(10112,'1963-08-13','Yuichiro','Swick','F','1985-10-08'),
(10113,'1963-11-13','Jaewon','Syrzycki','M','1989-12-24'),
(10114,'1957-02-16','Munir','Demeyer','F','1992-07-17'),
(10115,'1964-12-25','Chikara','Rissland','M','1986-01-23'),
(10116,'1955-08-26','Dayanand','Czap','F','1985-05-28');
4.Dorisのインストール構成
ここでは、スタンドアロンバージョンを例として取り上げます。
まず、Doris1.1リリースバージョンをダウンロードします。
https://doris.apache.org/downloads/downloads.html
指定したディレクトリに解凍します
tar zxvf apache-doris-1.1.0-bin.tar.gz -C doris-1.1
解凍されたディレクトリ構造は次のとおりです。
.
├── apache_hdfs_broker
│ ├── bin
│ ├── conf
│ └── lib
├── be
│ ├── bin
│ ├── conf
│ ├── lib
│ ├── log
│ ├── minidump
│ ├── storage
│ └── www
├── derby.log
├── fe
│ ├── bin
│ ├── conf
│ ├── doris-meta
│ ├── lib
│ ├── log
│ ├── plugins
│ ├── spark-dpp
│ ├── temp_dir
│ └── webroot
└── udf
├── include
└── lib
feを構成して
cd doris-1.0
# 配置 fe.conf 和 be.conf,这两个文件分别在fe和be的conf目录下
打开这个 priority_networks
修改成自己的IP地址,注意这里是CIDR方式配置IP地址
例如我本地的IP是172.19.0.12,我的配置如下:
priority_networks = 172.19.0.0/24
######
在be.conf配置文件最后加上下面这个配置
disable_stream_load_2pc=false
- デフォルトでは、変更する必要が
fe.conf
あるbe.conf
のは上記と同じ構成のみであることに注意してください。 - デフォルトのfeメタデータディレクトリは、
fe/doris-meta
ディレクトリ - beのデータは
be/storage
ディレクトリ
FEを開始します
sh fe/bin/start_fe.sh --daemon
BEを開始
sh be/bin/start_be.sh --daemon
MySQLコマンドラインはFEに接続します。ここで新しくインストールされたDorisクラスターのデフォルトユーザーはrootとadminであり、パスワードは空です。
mysql -uroot -P9030 -h127.0.0.1
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.7.37 Doris version trunk-440ad03
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show frontends;
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
| Name | IP | EditLogPort | HttpPort | QueryPort | RpcPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastHeartbeat | IsHelper | ErrMsg | Version | CurrentConnected |
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
| 172.19.0.12_9010_1654681464955 | 172.19.0.12 | 9010 | 8030 | 9030 | 9020 | FOLLOWER | true | 1690644599 | true | true | 381106 | 2022-06-22 18:13:34 | true | | trunk-440ad03 | Yes |
+--------------------------------+-------------+-------------+----------+-----------+---------+----------+----------+------------+------+-------+-------------------+---------------------+----------+--------+---------------+------------------+
1 row in set (0.01 sec)
BEノードをクラスターに追加します
mysql>alter system add backend "172.19.0.12:9050";
これがあなた自身のIPアドレスです
BEを表示
mysql> show backends;
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
| BackendId | Cluster | IP | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | Tag | ErrMsg | Version | Status |
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
| 10002 | default_cluster | 172.19.0.12 | 9050 | 9060 | 8040 | 8060 | 2022-06-22 12:51:58 | 2022-06-22 18:15:34 | true | false | false | 4369 | 328.686 MB | 144.083 GB | 196.735 GB | 26.76 % | 26.76 % | {"location" : "default"} | | trunk-440ad03 | {"lastSuccessReportTabletsTime":"2022-06-22 18:15:05","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false} |
+-----------+-----------------+-------------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Dorisスタンドアロンインストールが完了しました
5.Flinkのインストール構成
5.1Flink1.14.4をダウンロードしてインストールします
wget https://dlcdn.apache.org/flink/flink-1.14.4/flink-1.14.5-bin-scala_2.12.tgz
tar zxvf flink-1.14.4-bin-scala_2.12.tgz
次に、次の依存関係をFlinkインストールディレクトリのlibディレクトリにコピーする必要があります。具体的な依存関係のlibファイルは次のとおりです。
wget https://jiafeng-1308700295.cos.ap-hongkong.myqcloud.com/flink-doris-connector-1.14_2.12-1.0.0-SNAPSHOT.jar
wget https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.2.1/flink-sql-connector-mysql-cdc-2.2.1.jar
Flinkを起動します
bin/start-cluster.sh
起動後のインターフェースは以下の通りです。
6.Dorisへのデータの同期を開始します
6.1Dorisデータベースとテーブルを作成する
create database demo;
use demo;
CREATE TABLE all_employees_info (
emp_no int NOT NULL,
birth_date date,
first_name varchar(20),
last_name varchar(20),
gender char(2),
hire_date date,
database_name varchar(50),
table_name varchar(200)
)
UNIQUE KEY(`emp_no`, `birth_date`)
DISTRIBUTED BY HASH(`birth_date`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
6.2FlinkSQLクライアントに入る
bin/sql-client.sh embedded
チェックポイントをオンにして、10秒ごとにチェックポイントを実行します
チェックポイントはデフォルトでは有効になっていません。トランザクションを送信するには、チェックポイントを有効にする必要があります。
ソースは起動時にテーブル全体をスキャンし、主キーに従ってテーブルを複数のチャンクに分割します。また、インクリメンタルスナップショットアルゴリズムを使用して、各チャンクのデータを1つずつ読み取ります。ジョブは定期的にチェックポイントを実行して、完了したチャンクを記録します。フェイルオーバーが発生した場合は、未完成のチャンクを読み続けてください。すべてのチャンクが読み取られると、以前に取得したBinlogサイトから増分変更レコードが読み取られます。Flinkジョブは、引き続き定期的にCheckpointを実行し、Binlogサイトを記録します。ジョブがフェイルオーバーすると、以前に記録されたBinlogサイトから処理を続行し、ExactlyOnceセマンティクスを実現します。
SET execution.checkpointing.interval = 10s;
注:これはデモです。実稼働環境では、60秒のチェックポイント間隔を推奨しています
6.3MySQLCDCテーブルの作成
FlinkSQLクライアントで次のSQLを実行します
CREATE TABLE employees_source (
database_name STRING METADATA VIRTUAL,
table_name STRING METADATA VIRTUAL,
emp_no int NOT NULL,
birth_date date,
first_name STRING,
last_name STRING,
gender STRING,
hire_date date,
PRIMARY KEY (`emp_no`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'localhost',
'port' = '3306',
'username' = 'root',
'password' = 'MyNewPass4!',
'database-name' = 'emp_[0-9]+',
'table-name' = 'employees_[0-9]+'
);
- 'database-name' ='emp_ [0-9] +':これは、正規表現を使用して複数のライブラリを同時に接続する方法です。
- 'table-name' ='employees_ [0-9] +':正規表現を使用して複数のテーブルを同時に接続する方法は次のとおりです。
CDCテーブルをクエリすると、次のデータが表示され、すべてが正常であることを示しています。
select * from employees_source limit 10;
6.4Dorisシンクテーブルを作成する
CREATE TABLE cdc_doris_sink (
emp_no int ,
birth_date STRING,
first_name STRING,
last_name STRING,
gender STRING,
hire_date STRING,
database_name STRING,
table_name STRING
)
WITH (
'connector' = 'doris',
'fenodes' = '172.19.0.12:8030',
'table.identifier' = 'demo.all_employees_info',
'username' = 'root',
'password' = '',
'sink.properties.two_phase_commit'='true',
'sink.label-prefix'='doris_demo_emp_001'
);
パラメータの説明:
- コネクタ:コネクタがドリスであることを指定します
- fenodes:DorisFEノードのIPアドレスとhttpポート
- table.identifier:Dorisに対応するデータベースとテーブル名
- ユーザー名:dorisユーザー名
- パスワード:ドリスユーザーパスワード
- sink.properties.two_phase_commit:2フェーズコミットの使用を指定します。これにより、ストリームが読み込まれるときにhttpヘッダーに追加されます
two_phase_commit:true
。そうでない場合、失敗します。 - think.label-prefix:これは、両端でデータの一貫性を確保するために2フェーズ送信中に追加する必要があるパラメーターです。追加しないと失敗します。
- その他のパラメータについては、公式ドキュメントhttps://doris.apache.org/zh-CN/docs/ecosystem/flink-doris-connector.htmlを参照してください。
現時点では、Dorisシンクテーブルをクエリするためのデータはありません
select * from cdc_doris_sink;
6.5Dorisテーブルにデータを挿入する
次のSQLを実行します。
insert into cdc_doris_sink (emp_no,birth_date,first_name,last_name,gender,hire_date,database_name,table_name)
select emp_no,cast(birth_date as string) as birth_date ,first_name,last_name,gender,cast(hire_date as string) as hire_date ,database_name,table_name from employees_source;
次に、FlinkWEBUIでタスク実行情報を確認できます。
ここで、TaskManagerのログ情報を確認できます。ここでは、2フェーズの送信が使用されており、データはhttpチャンク方式を介してBE側に継続的に送信されます。チェックポイントが完了すると、次のタスクの送信が続行されます。
2022-06-22 19:04:01,350 INFO io.debezium.relational.history.DatabaseHistoryMetrics [] - Started database history recovery
2022-06-22 19:04:01,350 INFO io.debezium.relational.history.DatabaseHistoryMetrics [] - Finished database history recovery of 0 change(s) in 0 ms
2022-06-22 19:04:01,351 INFO io.debezium.util.Threads [] - Requested thread factory for connector MySqlConnector, id = mysql_binlog_source named = binlog-client
2022-06-22 19:04:01,352 INFO io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Skip 0 events on streaming start
2022-06-22 19:04:01,352 INFO io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Skip 0 rows on streaming start
2022-06-22 19:04:01,352 INFO io.debezium.util.Threads [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,374 INFO io.debezium.util.Threads [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,381 INFO io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Connected to MySQL binlog at localhost:3306, starting at MySqlOffsetContext [sourceInfoSchema=Schema{io.debezium.connector.mysql.Source:STRUCT}, sourceInfo=SourceInfo [currentGtid=null, currentBinlogFilename=mysql_bin.000005, currentBinlogPosition=211725, currentRowNumber=0, serverId=0, sourceTime=null, threadId=-1, currentQuery=null, tableIds=[], databaseName=null], partition={server=mysql_binlog_source}, snapshotCompleted=false, transactionContext=TransactionContext [currentTransactionId=null, perTableEventCount={}, totalEventCount=0], restartGtidSet=null, currentGtidSet=null, restartBinlogFilename=mysql_bin.000005, restartBinlogPosition=211725, restartRowsToSkip=0, restartEventsToSkip=0, currentEventLengthInBytes=0, inTransaction=false, transactionId=null]
2022-06-22 19:04:01,381 INFO io.debezium.util.Threads [] - Creating thread debezium-mysqlconnector-mysql_binlog_source-binlog-client
2022-06-22 19:04:01,381 INFO io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Waiting for keepalive thread to start
2022-06-22 19:04:01,497 INFO io.debezium.connector.mysql.MySqlStreamingChangeEventSource [] - Keepalive thread is running
2022-06-22 19:04:08,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:08,321 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6963,
"Label": "doris_demo_001_0_1",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 634,
"NumberLoadedRows": 634,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 35721,
"LoadTimeMs": 9046,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9041,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:08,321 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:08,321 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_2
2022-06-22 19:04:08,321 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:08,325 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 1
2022-06-22 19:04:08,329 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6963] commit successfully."
}
2022-06-22 19:04:18,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:18,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6964,
"Label": "doris_demo_001_0_2",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9988,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9983,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:18,310 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:18,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_3
2022-06-22 19:04:18,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:18,312 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 2
2022-06-22 19:04:18,317 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6964] commit successfully."
}
2022-06-22 19:04:28,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:28,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6965,
"Label": "doris_demo_001_0_3",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9998,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9993,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:28,308 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:28,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_4
2022-06-22 19:04:28,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:28,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 3
2022-06-22 19:04:28,316 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6965] commit successfully."
}
2022-06-22 19:04:38,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6966,
"Label": "doris_demo_001_0_4",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9999,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9994,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:38,308 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_5
2022-06-22 19:04:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:38,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 4
2022-06-22 19:04:38,317 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6966] commit successfully."
}
2022-06-22 19:04:48,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:48,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6967,
"Label": "doris_demo_001_0_5",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 10000,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9996,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:48,310 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:48,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_6
2022-06-22 19:04:48,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:48,312 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 5
2022-06-22 19:04:48,317 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6967] commit successfully."
}
2022-06-22 19:04:58,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:04:58,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6968,
"Label": "doris_demo_001_0_6",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9998,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9993,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:04:58,308 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:04:58,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_7
2022-06-22 19:04:58,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:04:58,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 6
2022-06-22 19:04:58,316 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6968] commit successfully."
}
2022-06-22 19:05:08,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:05:08,309 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6969,
"Label": "doris_demo_001_0_7",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9999,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9995,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:05:08,309 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:08,309 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_8
2022-06-22 19:05:08,309 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:05:08,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 7
2022-06-22 19:05:08,316 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6969] commit successfully."
}
2022-06-22 19:05:18,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:05:18,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6970,
"Label": "doris_demo_001_0_8",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9999,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9993,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:05:18,308 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:18,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_9
2022-06-22 19:05:18,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:05:18,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 8
2022-06-22 19:05:18,317 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6970] commit successfully."
}
2022-06-22 19:05:28,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:05:28,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6971,
"Label": "doris_demo_001_0_9",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 10000,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9996,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:05:28,310 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:28,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_10
2022-06-22 19:05:28,310 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:05:28,315 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 9
2022-06-22 19:05:28,320 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6971] commit successfully."
}
2022-06-22 19:05:38,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:05:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6972,
"Label": "doris_demo_001_0_10",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 0,
"NumberLoadedRows": 0,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 0,
"LoadTimeMs": 9998,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 9992,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:05:38,308 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_11
2022-06-22 19:05:38,308 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:05:38,311 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 10
2022-06-22 19:05:38,316 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6972] commit successfully."
}
2022-06-22 19:05:48,303 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load stopped.
2022-06-22 19:05:48,315 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - load Result {
"TxnId": 6973,
"Label": "doris_demo_001_0_11",
"TwoPhaseCommit": "true",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 520,
"NumberLoadedRows": 520,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 29293,
"LoadTimeMs": 10005,
"BeginTxnTimeMs": 0,
"StreamLoadPutTimeMs": 0,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 10001,
"CommitAndPublishTimeMs": 0
}
2022-06-22 19:05:48,315 INFO org.apache.doris.flink.sink.writer.RecordBuffer [] - start buffer data, read queue size 0, write queue size 3
2022-06-22 19:05:48,315 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - stream load started for doris_demo_001_0_12
2022-06-22 19:05:48,315 INFO org.apache.doris.flink.sink.writer.DorisStreamLoad [] - start execute load
2022-06-22 19:05:48,322 INFO org.apache.flink.streaming.runtime.operators.sink.AbstractStreamingCommitterHandler [] - Committing the state for checkpoint 11
2022-06-22 19:05:48,327 INFO org.apache.doris.flink.sink.committer.DorisCommitter [] - load result {
"status": "Success",
"msg": "transaction [6973] commit successfully."
}
6.6Dorisデータのクエリ
ここに636個のデータを挿入しました。
mysql> select count(1) from all_employees_info ;
+----------+
| count(1) |
+----------+
| 634 |
+----------+
1 row in set (0.01 sec)
mysql> select * from all_employees_info limit 20;
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date | database_name | table_name |
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | emp_1 | employees_1 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | emp_1 | employees_1 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | emp_1 | employees_1 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | emp_1 | employees_1 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | emp_1 | employees_1 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | emp_1 | employees_1 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | emp_1 | employees_1 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | emp_1 | employees_1 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | emp_1 | employees_1 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | emp_1 | employees_1 |
| 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | emp_1 | employees_1 |
| 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | emp_1 | employees_1 |
| 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 | emp_1 | employees_1 |
| 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 | emp_1 | employees_1 |
| 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 | emp_1 | employees_1 |
| 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | emp_1 | employees_1 |
| 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | emp_1 | employees_1 |
| 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | emp_1 | employees_1 |
| 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | emp_1 | employees_1 |
| 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 | emp_1 | employees_1 |
+--------+------------+------------+-------------+--------+------------+---------------+-------------+
20 rows in set (0.00 sec)
6.7テストの削除
mysql> use emp_2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_emp_2 |
+-----------------+
| employees_1 |
| employees_2 |
+-----------------+
2 rows in set (0.00 sec)
mysql> delete from employees_2 where emp_no in (12013,12014,12015);
Query OK, 3 rows affected (0.01 sec)
Dorisデータの削除を確認する
mysql> select count(1) from all_employees_info ;
+----------+
| count(1) |
+----------+
| 631 |
+----------+
1 row in set (0.01 sec)
7.まとめ
この質問では、主にFLink CDCサブデータベースとサブテーブルをリアルタイムで同期する方法を紹介し、最新バージョンのApache DorisFlinkConnectorと統合されたFlink2PCとDorisStreamLoad 2PCのメカニズム、統合原理、および使用方法を組み合わせます。
あなたにいくつかの助けをもたらすことを願っています。
8.関連リンク:
SelectDB公式ウェブサイト:
Apache Dorisの公式ウェブサイト:
Apache Doris Github:
https://github.com/apache/doris
Apache Doris開発者メーリンググループ: