Flink の強力なテスト ツール DataGen に関する予備調査 | JD Cloud 技術チーム

Flinksqlとは何ですか

Flink SQL は、Apache Calcite の SQL パーサーおよびオプティマイザーに基づいて構築されており、ANSI SQL 標準をサポートし、標準 SQL ステートメントを使用してストリーミング データやバッチ データを処理できるようにします。Flink SQL を使用すると、明示的なコードを記述することなく、宣言的な方法でデータ処理ロジックを記述することができます。Flink SQL を使用すると、フィルタリング、集計、接続、変換などのさまざまなデータ操作を実行できます。また、ストリーミングデータ処理のニーズを満たすウィンドウ操作、時間処理、複雑なイベント処理などの機能も提供します。

Flink SQL は、Flink のストリーミング エンジンとバッチ処理エンジンの特性に適応するための多くの拡張関数と構文を提供します。これは Flink の最高レベルの抽象化であり、Flink の分散コンピューティング機能とフォールト トレランス メカニズムを活用して、DataStream API および DataSet API とシームレスに統合できます。

Flink SQL を使用してデータを処理する基本手順:

  1. 入力テーブルを定義する: CREATE TABLE ステートメントを使用して入力テーブルを定義し、テーブル スキーマ (フィールドとタイプ) およびデータ ソース (Kafka、ファイルなど) を指定します。

  2. SQL クエリの実行: SELECT や INSERT INTO などの SQL ステートメントを使用して、データ クエリと操作を実行します。SQL クエリでは、さまざまな組み込み関数、集計操作、ウィンドウ操作、時間属性などを使用できます。

  3. 出力テーブルを定義する: CREATE TABLE ステートメントを使用して出力テーブルを定義し、テーブル スキーマとターゲット データ ストレージ (Kafka、ファイルなど) を指定します。

  4. ジョブの送信: Flink SQL クエリを Flink ジョブとして Flink クラスターに実行のために送信します。Flink は、クエリ ロジックと構成に基づいて実行プランを自動的に構築し、データ処理タスクをクラスター内のタスク マネージャーに分散して実行します。

要約すると、Flink SQL クエリと操作を通じてストリーミング データとバッチ データを処理できます。これは、特に SQL に精通した開発者やデータ エンジニアにとって、データ処理開発を簡素化および加速する方法を提供します。

コネクタとは何ですか

Flink Connector は、外部システムとデータ ソースの接続に使用されるコンポーネントを指します。これにより、Flink はデータベース、メッセージ キュー、ファイル システムなどの特定のコネクタを介してさまざまなデータ ソースと対話できるようになります。外部システムとの通信、データ形式の変換、データの読み書きなどのタスクを処理します。入力データ テーブルとしても出力データ テーブルとしても、適切なコネクタを使用することで、Flink SQL で外部システムのデータにアクセスし、操作できます。現在、リアルタイム プラットフォームは、一般的に使用される多くのコネクタを提供しています。

例えば:

  1. JDBC: リレーショナル データベース (MySQL、PostgreSQL など) との接続を確立するために使用され、Flink SQL でのデータベース テーブルからのデータの読み取りと書き込みをサポートします。

  2. JDQ: JDQ との統合に使用され、JDQ トピック内のデータの読み取りと書き込みが可能です。

  3. Elasticsearch: Elasticsearch との統合では、Elasticsearch インデックスにデータを書き込んだり、Elasticsearch インデックスからデータを読み取ることができます。

  4. ファイル コネクタ: さまざまなファイル形式 (CSV、JSON、Parquet など) でデータを読み書きするために使用されます。

  5. ……

さまざまなデータ ソースとの統合に使用される HBase、JMQ4、Doris、Clickhouse、Jimdb、Hive などもあります。Flink SQL Connector を使用すると、外部システムと簡単に対話したり、データを Flink にインポートして処理したり、処理結果を外部システムにエクスポートしたりできます。

DataGen コネクタ

DataGen は、開発およびテスト中に使用するシミュレートされたテスト データを生成するために Flink SQL によって提供される組み込みコネクタです。

DataGen を使用すると、整数、文字列、日付など、さまざまなデータ型と分布を持つデータを生成できます。これにより、実際のデータ シナリオをシミュレートし、Flink SQL クエリと操作の検証とデバッグに役立ちます。

デモ

以下は、DataGen 関数を使用した簡単な例です。

-- 创建输入表
CREATE TABLE input_table (
 order_number BIGINT,
 price DECIMAL(32,2),
 buyer ROW<first_name STRING, last_name STRING>,
 order_time TIMESTAMP(3)
) WITH (
 'connector' = 'datagen',
);

上の例では、DataGen コネクタを使用して「input_table」という名前の入力テーブルを作成しました。このテーブルには、「order_number」、「price」、および「buyer」、「order_time」の 4 つのフィールドが含まれています。デフォルトでは、対応する種類のデータをランダムに生成するランダムが設定されており、生成速度は 10,000 アイテム/秒で、タスクが停止しない限り、データは継続的に生成されます。もちろん、1 秒あたりに生成される行数、データ型、フィールドの分布など、データ生成のルールを定義するパラメーターを指定することもできます。

生成されたデータのサンプル:

{"order_number":-6353089831284155505,"price":253422671148527900374700392448,"buyer":{"first_name":"6e4df4455bed12c8ad74f03471e5d8e3141d7977bcc5bef88a57102dac71ac9a9dbef00f406ce9bddaf3741f37330e5fb9d2","last_name":"d7d8a39e063fbd2beac91c791dc1024e2b1f0857b85990fbb5c4eac32445951aad0a2bcffd3a29b2a08b057a0b31aa689ed7"},"order_time":"2023-09-21 06:22:29.618"}
{"order_number":1102733628546646982,"price":628524591222898424803263250432,"buyer":{"first_name":"4738f237436b70c80e504b95f0d9ec3d7c01c8745edf21495f17bb4d7044b4950943014f26b5d7fdaed10db37a632849b96c","last_name":"7f9dbdbed581b687989665b97c09dec1a617c830c048446bf31c746898e1bccfe21a5969ee174a1d69845be7163b5e375a09"},"order_time":"2023-09-21 06:23:01.69"}

サポートされているタイプ

フィールドタイプ データ生成方法
ブール値 ランダム
チャー ランダム/シーケンス
VARCHAR ランダム/シーケンス
ランダム/シーケンス
10進数 ランダム/シーケンス
タイイント ランダム/シーケンス
スモールント ランダム/シーケンス
INT ランダム/シーケンス
BIGINT ランダム/シーケンス
浮く ランダム/シーケンス
ダブル ランダム/シーケンス
日付 ランダム
時間 ランダム
タイムスタンプ ランダム
TIMESTAMP_LTZ ランダム
年から月までの間隔 ランダム
日から月までの間隔 ランダム
ランダム
配列 ランダム
地図 ランダム
マルチセット ランダム

コネクタのプロパティ

属性 必要ですか? デフォルト値 タイプ 説明する
コネクタ 必須 (なし) 「データジェネ」。
1 秒あたりの行数 オプション 10000 長さ データ生成率
行の数 オプション (なし) 長さ 生成するデータ項目の数を指定します。デフォルトは制限なしです。
フィールド.#.種類 オプション ランダム フィールドのデータ生成方法を指定します: ランダムまたはシーケンス
フィールド.#.分 オプション (型の最小値) (フィールドの種類) ランダム ジェネレータはフィールド # の最小値を指定し、数値タイプをサポートします
フィールド.#.max オプション (型の最大値) (フィールドの種類) 乱数発生器の指定フィールド# 最大値、数値型をサポート
フィールド.#.長さ オプション 100 整数 char/varchar/string/array/map/multiset 型の長さ。
フィールド.#.開始 オプション (なし) (フィールドの種類) シーケンスジェネレーターの開始値
フィールド.#.終了 オプション (なし) (フィールドの種類) シーケンスジェネレータの終了値

DataGen が使用するもの

dategen の基本的な使い方を理解したので、他の種類のコネクタを使って練習してみましょう。

シナリオ 1: 1 億個のデータをハイブ テーブルに生成する

CREATE TABLE dataGenSourceTable
 (
 order_number BIGINT,
 price DECIMAL(10, 2),
 buyer STRING,
 order_time TIMESTAMP(3)
 )
WITH
 ( 'connector'='datagen', 
 'number-of-rows'='100000000',
 'rows-per-second' = '100000'
 ) ;


CREATECATALOG myhive
WITH (
 'type'='hive',
 'default-database'='default'
);
USECATALOG myhive;
USE dev;
SETtable.sql-dialect=hive;
CREATETABLEifnotexists shipu3_test_0932 (
 order_number BIGINT,
 price DECIMAL(10, 2),
 buyer STRING,
 order_time TIMESTAMP(3)
) PARTITIONED BY (dt STRING) STORED AS parquet TBLPROPERTIES (
 'partition.time-extractor.timestamp-pattern'='$dt',
 'sink.partition-commit.trigger'='partition-time',
 'sink.partition-commit.delay'='1 h',
 'sink.partition-commit.policy.kind'='metastore,success-file'
);
SETtable.sql-dialect=default;
insert into myhive.dev.shipu3_test_0932
select order_number,price,buyer,order_time, cast( CURRENT_DATE as varchar)
from default_catalog.default_database.dataGenSourceTable;

「1秒あたり10万個のデータが生成されると、約17分で完了できます。もちろん、Flinkタスクの計算ノードを増やしたり、並列度を増やしたり、生成レートの値を上げたりすることで、より速く完了できます」 1 秒あたりの行数」など。大量のデータが生成されます。

シナリオ 2: 1 秒あたり 100,000 個のメッセージをメッセージ キューに継続的に生成する

CREATE TABLE dataGenSourceTable (
 order_number BIGINT,
 price INT,
 buyer ROW< first_name STRING, last_name STRING >,
 order_time TIMESTAMP(3),
 col_array ARRAY < STRING >,
 col_map map < STRING, STRING >
 )
WITH
 ( 'connector'='datagen', --连接器类型
 'rows-per-second'='100000', --生产速率
 'fields.order_number.kind'='random', --字段order_number的生产方式
 'fields.order_number.min'='1', --字段order_number最小值
 'fields.order_number.max'='1000', --字段order_number最大值
 'fields.price.kind'='sequence', --字段price的生产方式
 'fields.price.start'='1', --字段price开始值
 'fields.price.end'='1000', --字段price最大值
 'fields.col_array.element.length'='5', --每个元素的长度
 'fields.col_map.key.length'='5', --map key的长度
 'fields.col_map.value.length'='5' --map value的长度
 ) ;
CREATE TABLE jdqsink1
 (
 order_number BIGINT,
 price DECIMAL(32, 2),
 buyer ROW< first_name STRING, last_name STRING >,
 order_time TIMESTAMP(3),
 col_ARRAY ARRAY < STRING >,
 col_map map < STRING, STRING >
 )
WITH
 (
 'connector'='jdq',
 'topic'='jrdw-fk-area_info__1',
 'jdq.client.id'='xxxxx',
 'jdq.password'='xxxxxxx',
 'jdq.domain'='db.test.group.com',
 'format'='json'
 ) ;
INSERTINTO jdqsink1
SELECT*FROM dataGenSourceTable;

考える

上記のケースからわかるように、Datagen と他のコネクタを組み合わせて、さまざまなシナリオのデータをシミュレートできます。

  • パフォーマンス テスト: Flink の高い処理パフォーマンスを使用して、タスクの外部依存関係のしきい値 (タイムアウト、電流制限など) を適切な水位までデバッグし、タスクに対する外部依存関係が多すぎることによるバレル効果を回避できます。
  • 境界条件テスト: Flink DataGen を使用して、最小値、最大値、NULL 値、繰り返し値などの特殊なテスト データを生成し、境界条件下での Flink タスクの正確性と堅牢性を検証します。
  • データ整合性テスト: Flink DataGen を使用して、無効なデータ形式、欠落しているフィールド、重複データなど、誤ったまたは異常なデータを含むデータセットを生成します。これにより、異常な状況に対処する Flink タスクの能力をテストし、データ処理時に Flink タスクがデータの整合性を正しく維持できるかどうかを検証できます。

つまり、Flink DataGen は、テスターがさまざまな種類のテスト データを構築するのに役立つ強力なツールです。適切に使用すると、テスターはより効率的にテストを実施し、潜在的な問題や欠陥を発見できます。

著者: JD Retail Shi Pu

出典:JD Cloud Developer Community 転載の際は出典を明記してください

オープンソース フレームワーク NanUI の作者がスチールの販売に切り替えたため、プロジェクトは中断されました。Apple App Store の無料リストのナンバー 1 はポルノ ソフトウェア TypeScript です。人気が出てきたばかりなのに、なぜ大手はそれを放棄し始めるのでしょうか。 ? TIOBE 10月リスト:Javaが最大の下落、C#はJavaに迫る Rust 1.73.0リリース AIガールフレンドにイギリス女王暗殺を勧められた男性に懲役9年の実刑判決 Qt 6.6正式リリース ロイター:RISC-Vテクノロジーが中米テクノロジー戦争の鍵となる 新たな戦場 RISC-V: 単一の企業や国に支配されない レノボ、Android PC の発売を計画
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10117339