Apache Doris から ApsaraDB for SelectDB へのデータ移行には、主に OSS および Catalog の 2 つの方法があります。シナリオに応じて適切なデータ移行方法を選択できます。本トピックでは、Apache Doris から ApsaraDB for SelectDB へのオフラインデータ移行方法を説明し、各方法の選定基準について解説します。
移行方法の選定
ビジネスシナリオに応じて移行方法を選択してください。以下の表に、各移行方法とその選定基準を示します。
方法 | シナリオ | 推奨対象 | 手順 |
OSS を介したエクスポートおよびインポート | データが Alibaba Cloud 上に保存されており、データ量が多い場合。 |
| |
目次 | データが Alibaba Cloud 上に保存されており、データ量が少ない場合。 説明 Alibaba Cloud EMR クラスターなどのシナリオが該当します。 |
|
本トピックでは、Catalog または OSS を使用して Doris から SelectDB へオフラインデータを移行する方法を詳しく説明します。
OSS を使用したデータ移行
前提条件
OSS サービス:
OSS サービスが有効化されていること。詳細については、「OSS の有効化」をご参照ください。
OSS にアクセスするために使用する Resource Access Management (RAM) ユーザーが、OSS オブジェクトに対する読み取りおよび書き込み権限を持っていること。詳細については、「権限とアクセスの制御」をご参照ください。
クラスター:
クラスター内にデータベースアカウントが作成されていること。詳細については、「アカウント管理」をご参照ください。
事前準備
OSS コンソールでバケットを作成します。詳細については、「コンソールでのバケット作成」をご参照ください。
OSS バケットとご利用の ApsaraDB for SelectDB インスタンスが同一リージョンにあることを確認してください。
本トピックでは、test-selectdb という名前のバケットを例として使用します。
ステップ 1:ソースデータのエクスポート
ソースクラスターにログインします。
自己管理型 Doris インスタンスへのログイン方法については、MySQL プロトコルによる接続 - Apache Dorisをご参照ください。
(任意)サンプルデータの準備
すでに移行対象のデータがある場合は、このステップをスキップしてください。
データベースの作成
次の文を実行してデータベースを作成します。
CREATE DATABASE source_db;テーブルの作成
次の文を実行してテーブルを作成します。
CREATE TABLE IF NOT EXISTS source_tb ( `c1` int(11) NULL, `c2` string NULL, `c3` bigint NULL ) DISTRIBUTED BY HASH(c1) BUCKETS 20 PROPERTIES("replication_num" = "1");サンプルデータの挿入
INSERT INTO source_tb VALUES (1, 'doris', 18), (2, 'nereids', 20), (3, 'pipelibe', 99999), (4, 'Apache', 122123455), (5, null, null);データの確認
次の文を実行してサンプルデータを確認します。
SELECT * FROM `source_tb` limit 10;次の結果が返されます。
+--------------+--------------+--------------+ | c1 | c2 | c3 | +--------------+--------------+--------------+ | 1 | doris | 18 | | 3 | pipelibe | 99999 | | 5 | | | | 2 | nereids | 20 | | 4 | Apache | 122123455 | +--------------+--------------+--------------+
ソーステーブルの `CREATE TABLE` 文をバックアップします。
SHOW CREATE TABLE文を実行して、ソーステーブルの `CREATE TABLE` 文を表示し、その文をバックアップします。 次の例にその方法を示します。SHOW CREATE TABLE source_tb ;次の結果が返されます。
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | source_tb | CREATE TABLE `source_tb` ( `c1` int NULL, `c2` text NULL, `c3` bigint NULL ) ENGINE=OLAP DUPLICATE KEY(`c1`) DISTRIBUTED BY HASH(`c1`) BUCKETS 20 PROPERTIES ( "file_cache_ttl_seconds" = "0", "is_being_synced" = "false", "storage_medium" = "hdd", "storage_format" = "V2", "inverted_index_storage_format" = "V2", "light_schema_change" = "true", "disable_auto_compaction" = "false", "enable_single_replica_compaction" = "false", "group_commit_interval_ms" = "10000", "group_commit_data_bytes" = "134217728" ); | +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Rows returned: [1], Time elapsed: [22ms]データを OSS にエクスポートします。
`EXPORT` コマンドを使用してデータを OSS にエクスポートします。
次の構文を使用します。
EXPORT TABLE table_name [PARTITION (p1[,p2])] [WHERE] TO export_path [opt_properties] WITH S3 [s3_properties];以下の表にパラメーターを示します。
パラメーター
必須
説明
table_name
はい
エクスポート対象のテーブル名。
partition
いいえ
エクスポート対象のテーブルのパーティションを指定します。
where
いいえ
テーブルからエクスポートする条件付きデータを指定します。
export_path
はい
ファイルのエクスポート先パス。
ディレクトリまたはファイルプレフィックス付きのディレクトリ(例:
s3://path/to/my_file_)を指定できます。opt_properties
いいえ
エクスポートパラメーターを指定します。詳細については、「opt_properties の構文とパラメーター」をご参照ください。
s3_properties
はい
S3 プロトコル関連のプロパティを設定します。詳細については、「s3_properties の構文とパラメーター」をご参照ください。
opt_properties の構文は次のとおりです。
[PROPERTIES ("key"="value", ...)]以下のパラメーターを指定できます。
パラメーター
必須
説明
label
いいえ
エクスポートジョブのラベルを指定します。このパラメーターを指定しない場合、システムがランダムなラベルを生成します。
column_separator
いいえ
エクスポートデータの列区切り文字を指定します。
デフォルト値は
\tです。マルチバイトデリミタもサポートされています。このパラメーターは CSV ファイルでのみ使用されます。line_delimiter
いいえ
エクスポートデータの行区切り文字を指定します。
デフォルト値は
\nです。マルチバイトデリミタもサポートされています。このパラメーターは CSV ファイルでのみ使用されます。columns
いいえ
テーブルからエクスポートする列を指定します。
format
いいえ
エクスポートジョブのファイル形式を指定します。
有効値:parquet、orc、csv、csv_with_names、csv_with_names_and_types
デフォルト値:csv
max_file_size
いいえ
エクスポートジョブにおける単一ファイルの最大サイズ。結果がこの値を超える場合、複数のファイルに分割されます。
有効値範囲:[5 MB、2 GB]
デフォルト値:1 GB
エクスポートのファイル形式として ORC を指定した場合(つまり format パラメーターを ORC に設定した場合)、実際のファイルサイズは
ceil (max_file_size/64) * 64MB になります。parallelism
いいえ
エクスポートジョブの並列度。デフォルト値は 1 です。
エクスポートジョブは parallelism の値に等しい数のスレッドを起動し、
select into outfile文を実行します。parallelism の値がテーブル内のタブレット数より大きい場合、システムは自動的に parallelism をタブレット数に設定します。これにより、各select into outfile文が 1 つのタブレットを処理します。delete_existing_files
いいえ
宛先パス内のすべてのファイルを削除するかどうかを指定します。
false(デフォルト):宛先パス内のファイルを削除しません。
true:
export_pathで指定されたディレクトリ内のすべてのファイルを削除した後、そのディレクトリにデータをエクスポートします。例:"file_path" = "/user/tmp"の場合、"/user/"配下のすべてのファイルおよびディレクトリが削除されます。"file_path" = "/user/tmp/"の場合、"/user/tmp/"配下のすべてのファイルおよびディレクトリが削除されます。
警告delete_existing_files = trueの設定はリスクの高い操作です。テスト環境でのみ使用してください。`delete_existing_files` パラメーターを使用するには、Alibaba Cloud サポートにチケットを送信する必要があります。SelectDB 技術チームが fe.conf ファイルに
enable_delete_existing_files = true構成を追加し、FE を再起動します。再起動後にのみ、このパラメーターが有効になります。
with_bom
いいえ
デフォルト値は false です。このパラメーターを true に設定すると、エクスポートされたファイルは UTF-8 with BOM(バイト順マーク)でエンコードされます。これは CSV 関連のファイル形式でのみ適用されます。
timeout
いいえ
エクスポートジョブのタイムアウト期間。デフォルト値は 2 時間です。単位は秒です。
s3_properties の構文は次のとおりです。
("key"="value"[,...])以下のパラメーターを設定できます。
パラメーター
必須
説明
s3.endpoint
はい
S3 プロトコル宛先のエンドポイント。
この例では、Alibaba Cloud OSS を使用したデータ移行方法を示します。この場合、このパラメーターは、OSS データにアクセスするために使用される
エンドポイントです。エンドポイントの取得方法について詳しくは、「OSS のリージョンとエンドポイント」をご参照ください。重要OSS バケットとご利用の ApsaraDB for SelectDB インスタンスが同一リージョンにあることを確認してください。
s3.access_key
はい
S3 プロトコル宛先のユーザー ID キー。
本例では Alibaba Cloud OSS を使用してデータを移行するため、このパラメーターは OSS にアクセスするために使用する RAM ユーザーの
AccessKey IDです。s3.secret_key
はい
S3 プロトコル宛先のユーザー認証文字列。
本例では Alibaba Cloud OSS を使用してデータを移行するため、このパラメーターは OSS にアクセスするために使用する RAM ユーザーの
AccessKey Secretです。s3.region
はい
S3 プロトコル宛先のリージョン。
この例では、Alibaba Cloud OSS を使用してデータを移行する方法を示します。この場合、このパラメーターは Alibaba Cloud OSS バケットのリージョンです。リージョンの取得方法の詳細については、「OSS のリージョンとエンドポイント」をご参照ください。
use_path_style
いいえ
デフォルト値は
falseです。デフォルトでは、S3 SDK は仮想ホスト形式を使用します。
ただし、一部のオブジェクトストレージシステムでは仮想ホスト形式のアクセスが有効化またはサポートされていない場合があります。このような場合、
use_path_styleパラメーターを追加してパス形式を強制できます。説明URI は次の 3 つのスキーマをサポートしています:
http://、https://、s3://。http://またはhttps://を使用する場合、システムはuse_path_styleパラメーターに基づいて、S3 プロトコル宛先へのアクセスにパス形式を使用するかどうかを判断します。s3://を使用する場合、システムは S3 プロトコル宛先へのアクセスに仮想ホスト形式を使用します。
以下の例を参照してください。
EXPORT TABLE source_tb -- source_tb テーブルからデータをエクスポート。 TO "s3://test-selectdb/test/" -- test-selectdb という名前の OSS バケット内の test フォルダにデータをエクスポート。 PROPERTIES ( "label" = "test_export", -- ジョブラベル。 "format" = "orc", -- ファイルストレージ形式は orc。 "max_file_size" = '2048MB', -- ファイル分割サイズ。 'parallelism' = '10' -- エクスポートの並列度は 10。 ) WITH s3 ( "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com", -- OSS バケットにアクセスするための URL。 "s3.region" = "oss-cn-hangzhou", -- OSS バケットが配置されているリージョン。 "s3.secret_key"="yourAccessKeySecret", -- OSS にアクセスするために使用する RAM ユーザーのシークレットキー。 "s3.access_key" = "LTAI****************" -- OSS にアクセスするために使用する RAM ユーザーのアクセスキー。 );エクスポートの確認
データエクスポートのステータスは、以下の 2 つの方法のいずれかで確認できます。
コマンドの使用
Doris に接続しているクライアントで、次の文を実行してエクスポートステータスを確認します。
SHOW export;エクスポート成功:結果の `State` の値が `FINISHED` の場合、データエクスポートは成功しています。
エクスポート失敗:結果の `State` の値が `CANCELLED` の場合、データエクスポートは失敗しています。`ErrorMsg` パラメーターの内容に基づいて失敗原因を特定できます。
OSS コンソールの使用
OSS コンソール にログインし、指定されたエクスポートパスに該当するファイルが生成されているかどうかを確認します。
ステップ 2:ターゲットテーブルへのデータインポート
ターゲットクラスターにログインします。詳細については、「DMS を使用した ApsaraDB for SelectDB インスタンスへの接続」をご参照ください。
ターゲットテーブルの作成
データベースの作成
(任意)データベースの作成
すでにターゲットデータベースがある場合は、このステップをスキップしてください。
次の文を実行してデータベースを作成します。
CREATE DATABASE aim_db;テーブルの作成
バックアップした `CREATE TABLE` 文を実行します。
本例では次の `CREATE TABLE` 文を使用します。
CREATE TABLE IF NOT EXISTS aim_tb ( `c1` int(11) NULL, `c2` string NULL, `c3` bigint NULL ) ENGINE=OLAP DUPLICATE KEY(`c1`) DISTRIBUTED BY HASH(c1) BUCKETS 20 PROPERTIES("replication_num" = "1");
データのインポート
`S3 load` を使用して OSS から SelectDB にデータをインポートします。
S3 loadの構文やその他の例の詳細については、「OSS Load」をご参照ください。以下の例を参照してください。
LOAD LABEL label_1 -- ジョブを一意に識別するためのランダムなラベル名。 ( DATA INFILE("s3://test-selectdb/test/59ab2e9dc4ec4c04-9e50e45a6fda2c8e_0.orc") -- 前のステップで OSS に出力されたデータファイルのパス。 INTO TABLE aim_tb -- データをインポートするテーブル名。 FORMAT AS ORC -- インポートファイルの形式。エクスポートデータの形式と同じです。 ) WITH S3 ( "AWS_PROVIDER" = "OSS", "AWS_REGION" = "oss-cn-hangzhou", -- OSS バケットが配置されているリージョン。 "AWS_ENDPOINT" = "oss-cn-hangzhou-internal.aliyuncs.com", -- OSS バケットにアクセスするための URL。 "AWS_ACCESS_KEY" = "LTAI****************", -- OSS にアクセスするために使用する RAM ユーザーのアクセスキー。 "AWS_SECRET_KEY"="yourAccessKeySecret" -- OSS にアクセスするために使用する RAM ユーザーのシークレットキー。 ) PROPERTIES ( "timeout" = "3600" -- インポートのタイムアウト期間。 );インポートの確認
インポート結果は、以下の 2 つの方法のいずれかで確認できます。
コマンドの使用
SelectDB に接続しているクライアントで、次の文を実行してインポートステータスを確認します。
SHOW load;インポート成功:結果の `State` の値が `FINISHED` の場合、データは正常にインポートされています。
ターゲットテーブルのクエリ。以下の文を例として使用します。
SELECT * FROM `aim_tb` limit 10;次の結果が返されます。
+--------------+--------------+--------------+ | c1 | c2 | c3 | +--------------+--------------+--------------+ | 1 | doris | 18 | | 3 | pipelibe | 99999 | | 5 | | | | 2 | nereids | 20 | | 4 | Apache | 122123455 | +--------------+--------------+--------------+このデータは「ステップ 1:ソースデータのエクスポート」で説明したソーステーブルのデータと同じです。これはインポートが成功したことを示しています。
Catalog を使用したデータ移行
前提条件
Doris インスタンスと SelectDB インスタンスがネットワーク上で相互に通信できることを確認してください。
Doris インスタンスと SelectDB インスタンスが同一 VPC 内にあること。同一 VPC 内にない場合は、まずネットワーク接続の問題を解決する必要があります。詳細については、「ApsaraDB for SelectDB インスタンスとデータソース間のネットワーク接続の問題を解決する方法」をご参照ください。
Doris インスタンスの IP アドレスが SelectDB インスタンスのホワイトリストに追加されていること。詳細については、「ホワイトリストの設定」をご参照ください。
Doris インスタンスがホワイトリストを使用している場合、SelectDB インスタンスの CIDR ブロックを Doris インスタンスのホワイトリストに追加してください。
SelectDB インスタンスの VPC エンドポイントの IP アドレスを取得するには、「ApsaraDB for SelectDB インスタンスが属する VPC の IP CIDR ブロックを確認する方法」をご参照ください。
SelectDB インスタンスのパブリック IP アドレスを取得するには、SelectDB インスタンスのパブリックエンドポイントに対して
pingコマンドを実行し、対応する IP アドレスを取得します。
SelectDB のバージョンは Doris のバージョンより古いものであってはなりません。
説明SelectDB は Doris 上に構築されたクラウドネイティブリアルタイムデータウェアハウスです。バージョンマッピングの詳細については、「カーネルリリースノート」をご参照ください。
Catalog およびその基本操作に精通していること。詳細については、「データレイクハウス」をご参照ください。
環境例
本例では、Doris インスタンスの doris_db データベースにある doris_t テーブルから、SelectDB インスタンスの test_db データベースにある test_doris2SelectDB テーブルへデータを移行する方法を示します。移行を実行する際は、必要に応じてパラメーターを変更してください。本例では以下の環境を使用します。
ターゲットデータベース:test_db
ターゲットテーブル:test_doris2SelectDB
ソースデータベース:doris_db
ソーステーブル:doris_t
例:ソースデータの準備
ソース Doris インスタンスにログインし、以下の操作を実行します。
データベースの作成
CREATE DATABASE doris_db;テーブルの作成
CREATE TABLE doris_t ( id int, name string, age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1");データの挿入
INSERT INTO doris_t VALUES (1, 'Alice', 25), (2, 'Bob', 30), (3, 'Charlie', 35), (4, 'David', 40), (5, 'Eve', 45);
手順
SelectDB インスタンスに接続します。詳細については、「MySQL クライアントを使用した ApsaraDB for SelectDB インスタンスへの接続」をご参照ください。
Doris Java Database Connectivity (JDBC) Catalog の作成
CREATE CATALOG doris_catalog PROPERTIES ( "type"="jdbc", "user"="root", "password"="123456", "jdbc_url" = "jdbc:mysql://127.0.0.1:9030/doris_db", "driver_url" = "mysql-connector-java-8.0.25.jar", "driver_class" = "com.mysql.cj.jdbc.Driver" )パラメーター
必須
デフォルト値
説明
user
はい
なし
Doris データベースのアカウント。
password
はい
なし
Doris データベースアカウントのパスワード。
jdbc_url
はい
なし
JDBC 接続文字列。Doris データベースの接続アドレスを含む必要があります。
形式:
jdbc:mysql://<host>:<port>/<database>host:Doris データベースの IP アドレス。
port:Doris データベースのポート番号。
database:アクセス対象のデータベース名。
例:
jdbc:mysql://127.0.0.1:9030/doris_dbdriver_url
はい
なし
JDBC ドライバー JAR パッケージの名前。
説明mysql-connector-java-8.0.25.jarの使用を推奨します。他の JAR パッケージを使用したい場合は、チケットを送信してご相談ください。
driver_class
はい
なし
JDBC ドライバーのクラス名。
com.mysql.cj.jdbc.Driverに設定することを推奨します。lower_case_table_names
説明バージョン 4.0 で lower_case_meta_names に名称変更されました
いいえ
"false"
外部 JDBC データソースからデータベース名およびテーブル名を小文字で同期するかどうかを指定します。
true: 小文字の名前とリモートシステム内の実際の名前とのマッピングを維持することで、名前が小文字でないデータベースやテーブルをクエリできるようになります。この場合、データベース、テーブル、およびカラムの名前はすべて小文字に変換されます。
false:小文字ではない名前を持つデータベースおよびテーブルをクエリできません。
重要SelectDB 3.0 の場合:
FE の
lower_case_table_namesパラメーターが1または2に設定されている場合、Catalog のlower_case_table_namesパラメーターをtrueに設定する必要があります。FE の
lower_case_table_namesパラメーターが0に設定されている場合、Catalog パラメーターはtrueまたはfalseのいずれかに設定できます。
SelectDB 4.0 の場合:
FE の
lower_case_table_namesパラメーターが0または2に設定されている場合、データベース名、テーブル名、列名は変換されません。FE の
lower_case_table_namesパラメーターが1に設定されている場合、テーブル名は小文字に変換されますが、データベース名および列名は変換されません。
only_specified_database
いいえ
"false"
指定されたデータベースのみを同期するかどうかを指定します。
true:JDBC URL で指定されたデータソースのデータベースのみを同期します。
false:JDBC URL 内のすべてのデータベースを同期します。
include_database_list
いいえ
""
only_specified_database=trueの場合、同期する複数のデータベースをカンマ区切りで指定します。データベース名は大文字と小文字を区別します。exclude_database_list
いいえ
""
only_specified_database=trueの場合、同期しない複数のデータベースをカンマ区切りで指定します。データベース名は大文字と小文字を区別します。meta_names_mapping
いいえ
""
外部データソースに DORIS と doris のように、大文字と小文字のみが異なる同じ名前が存在する場合、Doris は Catalog のクエリ時に曖昧さによりエラーを報告します。このような場合、競合を解決するために
meta_names_mappingパラメーターを設定する必要があります。詳細については、「大文字・小文字の区別に関する設定」をご参照ください。
重要このパラメーターは SelectDB 4.0 のみに適用されます。
Catalog の確認
SHOW CATALOGS; -- CATALOG が正常に作成されたかどうかを確認。次の結果が返されます。
+--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+ | CatalogId | CatalogName | Type | IsCurrent | CreateTime | LastUpdateTime | Comment | +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+ | 436009309195 | doris_catalog | jdbc | | 2024-08-06 17:09:08.058 | 2024-07-19 18:04:37 | | | 0 | internal | internal | yes | UNRECORDED | NULL | Doris internal catalog | +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+(任意)外部 Catalog doris_catalog への切り替え
内部 Catalog と同様に、外部 Catalog doris_catalog のデータを表示およびアクセスできます。
説明現在、ApsaraDB for SelectDB は外部 Catalog のデータに対する読み取り操作のみをサポートしています。
SWITCH doris_catalog;(任意)内部 Catalog への切り替え
ステップ 4 を実行していない場合は、このステップをスキップしてください。
SWITCH internal;(任意)データベースの作成
すでにターゲットデータベースを作成済みの場合は、このステップをスキップしてください。
CREATE database test_db;ターゲットデータベースへの切り替え
USE test_db;テーブルの作成
すでにターゲットテーブルがある場合は、ターゲット列のデータの型が Doris のソース列のデータの型に対応しているかどうかを確認してください。
ターゲットテーブルがない場合は、テーブル作成時にターゲット列のデータの型が Doris のソース列のデータの型に対応していることを確認してください。
型マッピングの詳細については、「型マッピング」をご参照ください。
CREATE TABLE test_doris2SelectDB ( id int, name string, age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1");データの移行
INSERT INTO test_doris2SelectDB SELECT * FROM doris_catalog.doris_db.doris_t;データインポートステータスの確認
SELECT * FROM test_doris2SelectDB;
増分データ移行ガイド
本番環境では、Doris データには既存データと増分データの両方が含まれます。通常、Doris から SelectDB へのデータ移行は、クエリ高速化のためにデータウェアハウスにデータをコピーするために実行されます。増分データ移行には、以下のいずれかの方法を使用できます。
Doris にデータを書き込む際に、並行して SelectDB にもデータのコピーを書き込む。
定期的なジョブを使用して、Doris からパーティション化されたデータを読み取り、SelectDB に書き込む。