ApsaraDB for SelectDB のデータをバックアップまたは移行する必要がある場合は、SELECT INTO OUTFILE
コマンドを使用して、クエリ結果をファイルとしてエクスポートできます。 このコマンドは、S3 または HDFS プロトコルを介したリモートストレージ(OSS、HDFS など)へのデータのエクスポートをサポートしています。
機能紹介
SELECT INTO OUTFILE
は、SelectDB でのデータのバックアップまたは移行に使用できます。このコマンドには、次の特性があります。
これは 同期コマンドです。
コマンドの実行が完了すると、エクスポートの実行ステータスとしてすぐに 1 行の結果が返されます。
同期メカニズムのため、タスクステータスは完了後にのみ返されます。 接続が中断された場合、システムは中間ステータスを取得できないため、エクスポートが完全に完了したかどうかを判断できません。
タスクの中断後にエクスポートの完了を判断できないことを回避するために、エクスポートタスクの作成時に プロパティ で
"success_file_name" = "SUCCESS"
を構成できます。 タスクが成功すると、指定された識別子ファイルが出力ディレクトリに生成されます。 このファイルが存在するかどうかを確認することで、エクスポートの完了を確認できます。
本質的には SQL クエリを実行します。
このコマンドは本質的には SQL クエリを実行し、デフォルトでは単一スレッドを使用して結果を出力します。
エクスポート時間:
合計エクスポート時間 = クエリ実行時間 + 結果セット書き込み時間
大規模なクエリの場合、セッション変数 query_timeout を使用してタイムアウトのしきい値を上げる必要があります。 クエリセッション変数の設定方法については、「クエリ変数」をご参照ください。
エクスポート結果はファイルです。
このコマンドは、クエリ結果をファイルとしてエクスポートするために使用します。現在、S3 プロトコルまたは HDFS プロトコルを介して、OSS や HDFS などのリモートストレージへのエクスポートをサポートしています。
エクスポート中にファイルとファイルパスが存在するかどうかは確認しません。
このコマンドは、ファイルとファイルパスが存在するかどうかを確認せず、ディレクトリを自動的に作成したり、既存のファイルを上書きしたりしません。 具体的な動作は、リモートストレージシステム(S3/HDFS など)のルールによって完全に異なります。
SelectDB は、エクスポートされたファイルを管理しません。 リモートストレージ側で、エクスポートされたすべてのファイル(成功したプロダクトと失敗した残存ファイルを含む)を管理およびクリーンアップする必要があります。
制限事項
現在、S3 または HDFS プロトコルを介したデータエクスポートのみがサポートされています。
注意事項
データ型によって、エクスポートできるファイル型が異なります。
基本データ型: CSV、PARQUET、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、および ORC 形式のファイルへのエクスポートをサポートします。
複合データ型:
複合データ型(ARRAY、MAP、STRUCT)の CSV、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、および ORC 形式のファイルへのエクスポートのみをサポートします。
ネストされた複合データ型のエクスポートはサポートしていません。
結果ファイルの注意事項:
結果セットが空のクエリの場合でも、ファイルが生成されます。
ファイル分割により、データの完全な行が単一のファイルに格納されるため、ファイルサイズは
max_file_size
と厳密に等しくありません。
結果ファイルのコンテンツ出力の注意事項:
BITMAP 型や HLL 型など、表示されない文字を出力する関数の場合、出力は
\N
(NULL を意味する)です。現在、一部の地理位置情報関数は、エンコードされたバイナリ文字を出力します。 出力には
ST_AsText
を使用してください。 これらの地理位置情報関数には、次のものが含まれます。ST_CIRCLE、ST_POINT、ST_POLYGON、ST_GEOMETRYFROMTEXT、ST_LINEFROMTEXT、ST_GEOMETRYFROMWKB
構文
<query_stmt>
INTO OUTFILE "<file_path>"
[format_as]
[properties]
パラメーターの説明
パラメーター名 | 必須 | 説明 |
query_stmt | はい | SELECT 文を使用して、エクスポートするデータセットをクエリします。 |
file_path | はい | ファイルストレージへのパスとファイルプレフィックスを指定します。
ファイルプレフィックスが指定されていない場合、最終的にエクスポートされるファイル名は、インスタンス名_ファイルシーケンス番号とファイル形式サフィックスで構成されます。 ファイルプレフィックスが指定されている場合、最終的にエクスポートされるファイル名は、ファイルプレフィックス、インスタンス名_ファイルシーケンス番号、およびファイル形式サフィックスで構成されます。
たとえば、file_path は次のとおりです。
ここで:
|
format_as | いいえ | エクスポート形式を指定します。
|
properties | いいえ | エクスポートファイル関連のプロパティと、HDFS および S3 関連のプロパティを指定します。 詳細については、「プロパティの構文」をご参照ください。 説明 現在、S3 または HDFS プロトコルを介したエクスポートのみがサポートされています。 |
プロパティの構文
プロパティの構文は次のとおりです。ファイル、HDFS、および S3 関連のプロパティ構成をサポートしています。
[PROPERTIES ("key"="value", ...)]
ファイル関連のプロパティ
パラメーター名
必須
説明
column_separator
いいえ
列の区切り文字。CSV 関連の形式にのみ使用されます。
line_delimiter
いいえ
行の区切り文字。CSV 関連の形式にのみ使用されます。
max_file_size
いいえ
単一ファイルのサイズ制限。 結果がこの値を超える場合は、複数のファイルに分割されます。
値の範囲: [5 MB, 2 GB]
デフォルト値: 1 GB
ORC ファイル形式としてエクスポートを指定する場合(つまり、format_as パラメーターが ORC の場合)、実際の分割ファイルサイズは
ceil (max_file_size/64) * 64
MB です。delete_existing_files
いいえ
file_path で指定されたディレクトリ内のすべてのファイルを削除するかどうか。
false (デフォルト値): 指定されたディレクトリ内のすべてのファイルを削除せず、ファイルを直接エクスポートします。
true: まず file_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 を再起動して delete_existing_files を有効にします。
file_suffix
いいえ
エクスポートされるファイルのサフィックスを指定します。 このパラメーターを指定しない場合は、ファイル形式のデフォルトのサフィックスが使用されます。
HDFS 関連のプロパティ
パラメーター名
必須
説明
fs.defaultFS
はい
NameNode のアドレスとポート。
hadoop.username
はい
HDFS ユーザー名。
dfs.nameservices
はい
ネームサービス名。hdfs-site.xml と一致します。
dfs.ha.namenodes.[nameservice ID]
はい
NameNode ID のリスト。hdfs-site.xml と一致します。
dfs.namenode.rpc-address.[nameservice ID].[name node ID]
はい
NameNode の RPC アドレス。数は NameNode の数と同じで、hdfs-site.xml と一致します。
dfs.client.failover.proxy.provider.[nameservice ID]
はい
HDFS クライアントがアクティブな NameNode に接続するための Java クラス。通常は
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
です。Kerberos 認証が有効になっている Hadoop クラスタの場合、次の追加の PROPERTIES 属性を設定する必要があります。
パラメーター名
必須
説明
dfs.namenode.kerberos.principal
はい
HDFS NameNode サービスのプリンシパル名。
hadoop.security.authentication
はい
認証方式を指定します。
kerberos
と指定して Kerberos 認証を有効にします。hadoop.kerberos.principal
はい
Kerberos プリンシパルを指定します。
hadoop.kerberos.keytab
はい
Kerberos Keytab ファイルへのパスを指定します。
S3 関連のプロパティ
S3、OSS など、S3 プロトコルをサポートするストレージシステムは、このパラメーターリストを構成の参考にできます。
パラメーター名
必須
説明
s3.endpoint
はい
S3 プロトコルターゲットのエンドポイント。
s3.access_key
はい
S3 プロトコルターゲットのユーザー ID キー。
s3.secret_key
はい
S3 プロトコルターゲットのユーザー暗号化認証文字列。
s3.region
はい
S3 プロトコルターゲットのリージョン。
s3.session_token
はい
S3 プロトコルターゲットユーザーの一時セッション トークン。一時セッション検証が有効になっている場合。
use_path_style
いいえ
デフォルトは
false
です。S3 SDK はデフォルトで Virtual-hosted Style を使用します。
ただし、一部のオブジェクトストレージシステムでは、Virtual-hosted Style アクセスが有効になっていないか、サポートされていない場合があります。
use_path_style
パラメーターを追加することで、Path Style の使用を強制できます。説明URI は現在、
http://
、https://
、s3://
の 3 つのスキームをサポートしています。http://
またはhttps://
を使用する場合、システムはuse_path_style
パラメーターに基づいて、Path Style を使用して S3 プロトコルターゲットにアクセスするかどうかを決定します。s3://
を使用する場合、システムは Virtual-hosted Style を使用して S3 プロトコルターゲットにアクセスします。
レスポンス結果の説明
エクスポートコマンドは同期コマンドです。 コマンドが返されると、操作が終了したことを示し、エクスポートの実行結果を示す 1 行の結果が返されます。
エクスポートが正常で返された場合、結果は次のとおりです。
SELECT * FROM tbl1 LIMIT 10 INTO outfile "file:///home/work/path/result_"; +------------+-----------+----------+--------------------------------------------------------------------+ | FileNumber | TotalRows | FileSize | URL | +------------+-----------+----------+--------------------------------------------------------------------+ | 1 | 2 | 8 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ | +------------+-----------+----------+--------------------------------------------------------------------+ 1 row in set (0.05 sec)
ここで:
パラメーター名
説明
FileNumber
最終的に生成されたファイルの数。
TotalRows
結果セットの行数。
FileSize
エクスポートされたファイルの合計サイズ(バイト単位)。
URL
ローカルディスクにエクスポートする場合、これはエクスポートされた特定のコンピュートノードを示します。
並列エクスポートが実行された場合、複数行のデータが返されます。
+------------+-----------+----------+--------------------------------------------------------------------+ | FileNumber | TotalRows | FileSize | URL | +------------+-----------+----------+--------------------------------------------------------------------+ | 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ | | 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ | +------------+-----------+----------+--------------------------------------------------------------------+ 2 rows in set (2.218 sec)
実行に失敗した場合、エラーメッセージが返されます。例:
SELECT * FROM tbl INTO OUTFILE ... ERROR 1064 (HY000): errCode = 2, detailMessage = ...
並列エクスポート
デフォルトでは、クエリ結果セットのエクスポートは並列ではありません。つまり、単一の BE ノードによって単一スレッドでエクスポートされます。 したがって、エクスポート時間はエクスポート結果セットのサイズに直接関係します。
エクスポート時間を短縮するためにクエリ結果セットを並列でエクスポートする場合は、並列エクスポートを有効にできます。 手順は次のとおりです。
セッション変数を設定して並列エクスポートを有効にします:
set enable_parallel_outfile = true;
.クエリを並列でエクスポートできるかどうかを確認します。
並列エクスポートを有効にした後、現在のクエリを並列でエクスポートできるかどうかを確認する場合は、EXPLAIN を使用してクエリエクスポート文を分析できます。 構文は次のとおりです。
EXPLAIN <select_into_outfile>;
select_into_outfile は、実行する
SELECT INTO OUTFILE
文です。 具体的な構文については、「構文」をご参照ください。クエリで
EXPLAIN
を使用した後、SelectDB はそのクエリのプランを返します。 クエリプランを分析して、クエリを並列でエクスポートできるかどうかを判断する必要があります。RESULT FILE SINK
がPLAN FRAGMENT 1
にある場合: クエリは並列でエクスポートできます。並列条件を満たすクエリの場合、
be_instance_num * parallel_fragment_exec_instance_num
を使用して、クエリ結果セットをエクスポートする並列度を計算できます。be_instance_num は、BE クラスタ内のノードの数です。
計算リソースが 32 コア以下のクラスタは単一ノードです。
計算リソースが 32 コアを超えるクラスタは、32 コアごとに 1 つのノードがあります。
parallel_fragment_exec_instance_num は並列度パラメーターです。
次の文を使用して、このパラメーターを表示できます。
SHOW variables LIKE '% parallel_fragment_exec_instance_num%';
次の文を使用して、このパラメーターを設定します。
SET parallel_fragment_exec_instance_num = <parallel_fragment_exec_instance_num>;
RESULT FILE SINK
がPLAN FRAGMENT 0
にある場合: クエリは並列でエクスポートできません。以下は、
SELECT INTO OUTFILE
タスクのクエリプランです。ここで、RESULT FILE SINK
はPLAN FRAGMENT 0
にあります。このSELECT INTO OUTFILE
は並列でエクスポートできます。並列エクスポートプランの例: +-----------------------------------------------------------------------------+ | Explain String | +-----------------------------------------------------------------------------+ | PLAN FRAGMENT 0 | | OUTPUT EXPRS:<slot 2> | <slot 3> | <slot 4> | <slot 5> | | PARTITION: UNPARTITIONED | | | | RESULT SINK | | | | 1:EXCHANGE | | | | PLAN FRAGMENT 1 | | OUTPUT EXPRS:`k1` + `k2` | | PARTITION: HASH_PARTITIONED: `default_cluster:test`.`multi_tablet`.`k1` | | | | RESULT FILE SINK | | FILE PATH: s3://ml-bd-repo/bpit_test/outfile_1951_ | | STORAGE TYPE: S3 | | | | 0:OlapScanNode | | TABLE: multi_tablet | +-----------------------------------------------------------------------------+
エクスポートを作成するSELECT INTO OUTFILE 構文データをエクスポートするためです。 に従ってエクスポートタスクを作成し、データをエクスポートします。
例
HDFS を使用したエクスポート
HDFS を使用したエクスポート。単純なクエリ結果をファイルにエクスポートし、エクスポート形式を CSV として指定します。 例は次のとおりです。
HDFS を使用してデータをエクスポートする場合、Hadoop クラスタで高可用性が有効になっているかどうかによって、SELECT INTO OUTFILE
の PROPERTIES に違いが生じます。
高可用性が有効になっていない Hadoop クラスタ
-- fileSystem_port のデフォルト値は 9000 です
SELECT * FROM tbl
INTO OUTFILE "hdfs://${host}:${fileSystem_port}/path/to/result_"
FORMAT AS CSV
PROPERTIES
(
"fs.defaultFS" = "hdfs://ip:port",
"hadoop.username" = "work"
);
高可用性が有効になっている Hadoop クラスタ
--HA fileSystem_port のデフォルト値は 8020 です
SELECT * FROM tbl
INTO OUTFILE "hdfs:///path/to/result_"
FORMAT AS CSV
PROPERTIES
(
'fs.defaultFS'='hdfs://hacluster/',
'dfs.nameservices'='hacluster',
'dfs.ha.namenodes.hacluster'='n1,n2',
'dfs.namenode.rpc-address.hacluster.n1'='192.168.0.1:8020',
'dfs.namenode.rpc-address.hacluster.n2'='192.168.0.2:8020',
'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
生成されたファイルサイズが 1 GB を超えない場合は、result_0.csv
になります。 1 GB より大きい場合は、result_0.csv, result_1.csv, ...
になる可能性があります。
S3 プロトコルを使用したファイルへのエクスポート
UNION 文のクエリ結果をファイルにエクスポートします。 ストレージシステムは、ゾーン cn-hangzhou
にある OSS のバケット oss-bucket
として指定されています。 エクスポート形式は PARQUET として指定されており(PARQUET 形式では列区切り文字は不要)、エクスポートの完了後に識別子ファイルが生成されます。 例は次のとおりです。
SELECT k1 FROM tbl1 UNION SELECT k2 FROM tbl1
INTO OUTFILE "s3://oss-bucket/result_"
FORMAT AS PARQUET
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);
S3 プロトコルを使用してデータをエクスポートする場合、異なるクラウドベンダーが提供するオブジェクトストレージシステムでは、URI は 3 つのスキーマ(http://、https://、および s3://)のいずれかをパスの開始マーカーとして使用する必要があります。 そうしないと、ERROR 1105 (HY000): errCode = 2, detailMessage = Unknown properties: [s3.region, s3.endpoint, s3.secret_key, s3.access_key]
というプロンプトが表示されます。
S3 プロトコルを使用した OSS への並列エクスポート
S3 プロトコルを使用して、データを OSS に並列でエクスポートします。 例は次のとおりです。
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 LIMIT 1000
INTO outfile "s3://my_bucket/export/my_file_"
format AS csv
properties
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
)
同じデータ結果セットですが、クエリには最終結果のソート(order by k1
)が含まれているため、並列エクスポートセッション変数が有効になっている場合でも、このクエリは並列でエクスポートできません。 例は次のとおりです。
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 ORDER BY k1 LIMIT 1000
INTO outfile "s3://my_bucket/export/my_file_"
format AS csv
properties
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
)
データ型マッピング
Parquet ファイル形式と ORC ファイル形式の両方には、独自のデータ型があります。 SelectDB のエクスポート機能は、SelectDB データ型を Parquet/ORC ファイル形式の対応するデータ型に自動的にエクスポートできます。
SelectDB から ORC ファイル形式へのデータ型マッピング:
SelectDB 型
Orc 型
boolean
boolean
tinyint
tinyint
smallint
smallint
int
int
bigint
bigint
largeInt
string
date
string
datev2
string
datetime
string
datetimev2
timestamp
float
float
double
double
char / varchar / string
string
decimal
decimal
struct
struct
map
map
array
array
SelectDB から Parquet ファイル形式にデータをエクスポートする場合、SelectDB メモリ内のデータは最初に Arrow メモリデータ形式に変換され、次に Arrow によって Parquet ファイル形式に書き込まれます。 SelectDB データ型から Arrow データ型へのマッピング関係は次のとおりです。
SelectDB 型
Arrow 型
boolean
boolean
tinyint
int8
smallint
int16
int
int32
bigint
int64
largeInt
utf8
date
utf8
datev2
utf8
datetime
utf8
datetimev2
utf8
float
float32
double
float64
char / varchar / string
utf8
decimal
decimal128
struct
struct
map
map
array
list