遷移Apache Doris資料到ApsaraDB for SelectDB的方式主要有通過OSS和Catalog兩種。根據您的需要和業務情境,可以選擇不同的方式進行資料移轉。本文為您介紹Apache Doris的離線資料移轉到ApsaraDB for SelectDB的各個方式以及方式選擇規則。
方式選擇
根據不同的業務情境,選擇合適您的遷移方式。具體的方式選擇可以參考如下規則:
方式 | 適用情境 | 推薦原因 | 具體操作 |
匯出匯入OSS | 資料存放區在阿里雲平台,且資料量大。 |
| |
Catalog | 資料存放區在阿里雲平台,且資料量小。 說明 包括阿里雲EMR叢集等情境。 |
|
本文將以Catalog和匯出匯入OSS方式,詳細介紹如何遷移Doris的離線資料到SelectDB。
通過匯出匯入OSS遷移
前提條件
準備工作
在OSS服務建立儲存空間(Bucket)。如何建立,請參見控制台建立儲存空間。
確保OSS儲存空間(Bucket)與您的ApsaraDB for SelectDB執行個體在同一地區。
本文樣本中Bucket的名為test-selectdb。
步驟一:匯出來源資料
登入源叢集。
自建Doris如何登入,請參見Connecting by MySQL Protocol - 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 | +--------------+--------------+--------------+
備份目標資料所在表的建表語句。
您可通過
SHOW 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" ); | +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 返回行數: [1], 耗時: [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
否
指定此次Export任務的label,當不指定時系統會隨機產生一個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_as參數為ORC)時,實際切分檔案的大小是
ceil (max_file_size/64) * 64MB。parallelism
否
匯出作業的並發度,預設為1。
匯出作業會開啟parallelism個數的線程去執行
select into outfile語句。(如果parallelism個數大於表的tablets個數,系統會自動把parallelism設定為tablets個數大小,即每一個select into outfile語句負責一個tablets)。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參數,您可以向阿里雲客服提工單,SelectDB技術團隊在fe.conf設定檔中添加配置
enable_delete_existing_files = true,並重啟FE後,delete_existing_files才會生效。
with_bom
否
預設為false,若指定為true,則匯出的檔案編碼為帶有BOM的UTF-8編碼(只對csv相關的檔案格式生效)。
timeout
否
匯出作業的逾時時間,預設為2小時,單位是秒。
s3_properties文法如下。
("key"="value"[,...])可以指定如下參數。
參數名稱
是否必選
參數說明
s3.endpoint
是
使用S3協議目標的endpoint。
本文樣本為使用阿里雲OSS遷移,則此處為訪問OSS資料的
Endpoint。如何擷取,請參見OSS地區和訪問網域名稱。重要請確保OSS儲存空間(Bucket)與您的ApsaraDB for SelectDB執行個體在同一地區。
s3.access_key
是
使用S3協議目標的使用者身份密鑰。
本文樣本為使用阿里雲OSS遷移,此處為訪問OSS的RAM使用者的
Accesskey ID。s3.secret_key
是
使用S3協議目標的使用者加密認證字串。
本文樣本為使用阿里雲OSS遷移,此處為訪問OSS的RAM使用者的
AccessKey Secret。s3.region
是
使用S3協議目標的Region。
本文樣本為使用阿里雲OSS遷移,此處為阿里雲OSS的地區。如何擷取,請參見OSS地區和訪問網域名稱。
use_path_style
否
預設為
false。S3 SDK預設使用Virtual-hosted Style方式。
但某些Object Storage Service系統可能沒開啟或沒支援Virtual-hosted Style方式的訪問,您可以通過添加
use_path_style參數來強制使用Path Style方式。說明URI目前支援三種方案(schema):
http://、https://和s3://。如果使用
http://或https://,則會根據use_path_style參數來決定是否使用Path Style方式訪問S3協議目標。如果使用
s3://,則會使用Virtual-hosted Style方式訪問S3協議目標。
樣本如下。
EXPORT TABLE source_tb -- 匯出source_tb表中的資料 TO "s3://test-selectdb/test/" -- 將資料匯出至OSS名為test-selectdb的bucket中的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 bucket的網址 "s3.region" = "oss-cn-hangzhou", -- OSS 所屬地區 "s3.secret_key"="yourAccessKeySecret", -- 訪問OSS的RAM使用者的secret key "s3.access_key" = "LTAI****************" -- -- 訪問OSS的RAM使用者的access key );驗證匯出是否成功。
您可通過以下兩種方式,查看資料匯出情況。
通過指令查看。
可在串連了Doris的用戶端,執行以下語句,查看匯出情況。
SHOW export;匯出成功:當結果中State為FINISHED時,表示匯出資料成功。
匯出失敗:當結果中State為CANCELLED時,表示匯出資料失敗。您可通過ErrorMsg中的內容,進一步排查失敗的原因。
通過OSS查看。
登入OSS管理主控台,查看指定匯出路徑是否有對應檔案產生。
步驟二:匯入資料至目標表
登入目的地組群。如何登入,請參見通過DMS串連雲資料庫SelectDB版執行個體。
建立目標表。
建庫。
(可選)建庫。
如果您已有目標庫,可跳過此步驟。
執行以下語句,建立資料庫。
CREATE DATABASE aim_db;建表。
執行匯出資料中備份的建表語句。
本樣本中的建表語句如下。
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 -- labelname 隨機取一個,job唯一識別碼 ( 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 bucket 所屬地區 "AWS_ENDPOINT" = "oss-cn-hangzhou-internal.aliyuncs.com", -- 訪問OSS bucket的網址 "AWS_ACCESS_KEY" = "LTAI****************", -- 訪問OSS的RAM使用者的access key "AWS_SECRET_KEY"="yourAccessKeySecret" -- 訪問OSS的RAM使用者的secret key ) PROPERTIES ( "timeout" = "3600" -- 匯入逾時時間 );驗證匯入結果。
您可通過以下兩種方式,查看匯入結果。
通過指令查看。
可在串連了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 | +--------------+--------------+--------------+與步驟一:匯出來源資料中需要匯入的表資料一致,匯入成功。
通過Catalog遷移
前提條件
確保Doris執行個體和SelectDB執行個體的網路處於互連狀態。
Doris執行個體和SelectDB執行個體處於同一VPC下。如果不在同一VPC下,請先解決網路互連問題。如何操作,請參見如何解決SelectDB執行個體與資料來源網路互連問題?
已將Doris執行個體IP添加至SelectDB的白名單。具體操作,請參見設定白名單。
若Doris執行個體存在白名單機制,已將SelectDB執行個體所在網段IP添加至Doris執行個體的白名單中。
擷取SelectDB執行個體VPC地址的IP,請參見如何查看雲資料庫 SelectDB 版執行個體所屬VPC的IP網段?
擷取SelectDB執行個體公網的IP地址,通過
ping命令訪問SelectDB執行個體的公網地址,擷取其對應的 IP 位址。
SelectDB版本不能低於Doris版本。
說明SelectDB是基於Doris構建的雲原生即時數倉,二者的版本關係,可參見核心發布記錄。
瞭解什麼是Catalog,以及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用戶端串連雲資料庫SelectDB版執行個體。
建立Doris 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 Driver的Jar包名稱。
說明推薦使用
mysql-connector-java-8.0.25.jar。若希望使用其他Jar包,支援工單諮詢。
driver_class
是
無
JDBC Driver的Class名稱。
推薦設定為
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"
指定是否只同步指定的Database。
true:只同步 JDBC URL 中指定的資料來源的 Database。
false:同步 JDBC URL 中所有的 Database。
include_database_list
否
""
當
only_specified_database=true時,指定同步多個Database,以英文逗號分隔。Database名稱大小寫敏感。exclude_database_list
否
""
當
only_specified_database=true時,指定不需要同步的多個Database,以英文逗號分隔。Database名稱大小寫敏感。meta_names_mapping
否
""
如果外部資料源存在名稱相同只有大小寫不同的情況,例如 DORIS 和 doris,Doris 由於歧義而在查詢 Catalog 時報錯,此時需要配置
meta_names_mapping參數來解決衝突。具體操作,請參見小寫名稱同步。
重要此參數僅適用於SelectDB4.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 | +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+(可選)切換至External Catalog doris_catalog目錄下。
您可以像使用Internal Catalog一樣,對External Catalog doris_catalog的資料進行查看和訪問。
說明目前,雲資料庫 SelectDB 版對External Catalog中的資料只支援讀操作。
SWITCH doris_catalog;(可選)切換內部的catalog internal目錄下。
如果您沒有執行第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。