AnalyticDB for MySQL インポートツールは、Java Database Connectivity (JDBC) を使用して、ローカルの区切り付きファイルを AnalyticDB for MySQL データウェアハウスエディションクラスターに読み込みます。このツールは、LOAD DATA 文よりも優れたパフォーマンスを発揮し、同時実行による複数ファイルのインポートをサポートします。また、ライトスループットを最大化するために、batchSize および concurrency のチューニングが可能です。
仕組み
このツールは、複数のフロントノードにトラフィックを分散する Server Load Balancer (SLB) インスタンスに接続します。フロントノードは MySQL プロトコルと SQL ステートメントを解析し、データを書き込み、クエリをスケジュールします。データはフロントノードからストレージノードに流れ、永続化されます。

前提条件
開始する前に、以下を確認してください。
Java 1.8 以降がインストールされていること (
java -versionを実行して確認)AnalyticDB for MySQL クラスターエンドポイントへのネットワークアクセスがあること
クラスター内にデータベースとターゲットテーブルがすでに作成されていること
データインポート
| ステップ | 説明 |
|---|---|
| ステップ 1: インポートツールのダウンロードと解凍 | ツールパッケージをダウンロードして解凍します。 |
| ステップ 2: データファイルの準備 | ファイル形式、列の順序、および区切り文字を確認します。 |
| ステップ 3: インポートスクリプトの設定 | 接続、ファイル、およびパフォーマンスパラメーターを設定します。 |
| ステップ 4: インポートの実行 | スクリプトを実行し、進捗を監視します。 |
ステップ 1: インポートツールのダウンロードと解凍
作業ディレクトリを作成します。
mkdir -p /u01/loadataディレクトリに移動します。
# cd /u01/loadataツールをダウンロードします。
wget https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20220811/gpvn/adb-import-tool.tar.gzパッケージを解凍します。
tar zxvf adb-import-tool.tar.gz
パッケージは以下のファイルを抽出します。
adb-import.sh.template
adb-import.sh.template.md5
adb-import-tool.jar
adb-import-tool.jar.md5ステップ 2: データファイルの準備
ファイル形式の確認
インポートするファイルまたはフォルダーの絶対パスをメモします。
行区切り文字と列区切り文字を特定します。これらはスクリプトパラメーターで設定します。
ファイル内の列の順序が
CREATE TABLE文と一致することを確認してください。データベースでSHOW CREATE TABLEを実行して確認してください。テーブルとそれに対応するデータファイルは、次のようになります:CREATE TABLE `product_info` ( `id` bigint NOT NULL, `name` varchar, `price` decimal(15, 2) NOT NULL ) DISTRIBUTED BY HASH(`id`) INDEX_ALL='Y';1|tv|1000.0 2|computer|2000.0 3|cup|15.8ファイルには、少なくとも 2 つのカラムが含まれている必要があります。最後のカラムの後ろに続くデリミタは許容されており、
1|abc|3.0と1|abc|3.0|はどちらも有効です。
空のフィールドは、デフォルトで null として扱われます。たとえば、4||5.0はname列に空文字列ではなく null を挿入します。オートインクリメント列は自動的に処理されるため、事前処理は不要です。
大容量ファイルの分割
大容量ファイルをセグメントに分割すると、インポートツールがそれらを同時に読み取ることができます。セグメントサイズは 1 ~ 2 GB を推奨します。
ファイルサイズが 128 GB の filename.txt を、2 GB ずつの 64 個のセグメントに分割します:
# split -l$((`wc -l < filename.txt`/64 + 1)) filename.txt filename.txt.split -da 2;このツールは、インポート中に 64 個すべてのセグメントを同時に読み取ります。
ステップ 3: インポートスクリプトの設定
adb-import.sh.template ファイルは、再利用可能なテンプレートです。テーブルごとにコピーして名前を変更します。たとえば、product_info テーブルの場合は adb-import-product_info.sh のようにします。
必須パラメーター
すべてのインポートジョブでこれらのパラメーターを設定します。
####################################
# Path to the Java command.
# If Java is already on your PATH, leave this as-is.
####################################
java_cmd=java
####################################
# Absolute path to the import tool JAR.
# If the script and JAR are in the same directory, leave this as-is.
####################################
jar_path=adb-import-tool.jar
####################################
# Database connection settings.
# If encryptPassword=true, provide a Base64-encoded password.
####################################
host=host
port=3306
user=adbuser
password=pwd
database=dbname
encryptPassword=false
####################################
# Table name.
####################################
tableName=please_set_table_name
####################################
# Path to the file or folder to import.
# For multiple files, separate paths with commas (,).
####################################
dataPath=please_set_data_file_path_or_dir_path
####################################
# The number of files that are imported in a concurrent manner.
# To fully leverage the performance of AnalyticDB for MySQL, set this
# parameter to a number within the range of 16 to 96.
####################################
concurrency=64
####################################
# The number of values that are written when the import operation is performed.
# Specify this parameter based on the lengths of individual rows.
# To fully leverage the performance of AnalyticDB for MySQL, set this
# parameter to a number within the range of 1024 to 4096.
# Smaller batches make individual failed rows easier to identify.
####################################
batchSize=4096
####################################
# File encoding. Valid values: UTF-8, GBK.
####################################
encoding=UTF-8
####################################
# Row delimiter.
# For non-printable characters, use hexadecimal notation.
# Example: \x0d\x06\x08\x0a -> hex0d06080a
####################################
lineSeparator="\\n"
####################################
# Column delimiter.
# For non-printable characters, use hexadecimal notation.
# Example: \x07\x07 -> hex0707
####################################
delimiter="\\|"オプションパラメーター
特定のシナリオに合わせてこれらのパラメーターを調整します。
####################################
# JVM heap size. Increase if you see frequent garbage collection (GC).
####################################
jvmopts="-Xmx12G -Xms12G"
####################################
# Max number of files read concurrently from a folder.
####################################
maxConcurrentNumOfFilesToImport=64
####################################
# How to handle empty fields.
# false (default): empty fields become null.
# true: empty fields become '' (empty string).
####################################
nullAsQuotes=false
####################################
# Print the actual row count of the destination table after each file.
####################################
printRowCount=false
####################################
# Max characters to display for failed SQL statements.
####################################
failureSqlPrintLengthLimit=1000
####################################
# Dry-run mode. true=display INSERT statements only, false=execute them.
####################################
disableInsertOnlyPrintSql=false
####################################
# Skip the header row in each file.
####################################
skipHeader=false
####################################
# Buffer pool size for INSERT batches.
# Separates I/O and compute, improving client throughput.
####################################
windowSize=128
####################################
# Escape backslashes (\) and apostrophes (') in column values.
# true (default): safe for all data but slightly slower.
# false: faster, but only use if your data contains neither character.
####################################
escapeSlashAndSingleQuote=true
####################################
# Ignore batches that fail to import instead of stopping.
####################################
ignoreErrors=false
####################################
# Print failed SQL statements.
####################################
printErrorSql=true
####################################
# Print the stack trace when a SQL error occurs.
####################################
printErrorStackTrace=trueステップ 4: インポートの実行
インポートスクリプトを実行します。
sh adb-import-product_info.sh;以下のログエントリは、スクリプトが開始されたことを確認します。
[2021-03-13 17:50:24.730] add consumer consumer-01このツールはプログレスバーを表示しません。ロードされた行数を確認するには、宛先テーブルをクエリします。
mysql > select count(*) from dbname.product_info;インポートが完了すると、ツールはサマリーを出力します。各ファイルで読み取られた行数、各ファイルにかかった時間、合計経過時間、およびすべてのファイルが成功したかどうかです。
すべてのファイルが正常にインポートされました:
all import finished successfully1つ以上のファイルが失敗しました:
all import finished with ERROR!
データインポートプロセス中にエラーが発生した場合、インポートツールは直ちにインポート操作を終了し、失敗した SQL ステートメントの詳細を提供します。送信先テーブルには部分的なデータが含まれています。TRUNCATE TABLE table_nameを実行して送信先テーブルをクリアし、その後再度インポート操作を実行してください。また、DROP TABLE table_nameを実行して送信先テーブルを削除し、その後別のテーブルを作成してインポートすることもできます。
よくある質問
ボトルネックがクライアント側かサーバー側かを確認する方法
リソース飽和を特定するには、クライアントマシンで以下のコマンドを実行します。
| コマンド | 表示内容 |
|---|---|
top | CPU 使用率 |
free | メモリ使用量 |
vmstat 1 1000 | システム全体の負荷 |
dstat -all --disk-util または iostat 1 1000 | ディスク読み取り帯域幅と使用率 |
jstat -gc <pid> 1000 | Java ガベージコレクションの詳細 |
jstat が頻繁な GC を示している場合は、jvmopts を -Xmx16G -Xms16G に設定して、JVM ヒープを増加させます。
1 つのスクリプトで複数のテーブルをインポートする方法
すべてのテーブルが同じデリミタを共有する場合、tableName および dataPath をパラメーター化します。
tableName=$1
dataPath=$2次に、テーブルごとに個別の呼び出しを実行します。
# sh adb-import.sh table_name001 /path/table_001
# sh adb-import.sh table_name002 /path/table_002
# sh adb-import.sh table_name003 /path/table_003インポートをバックグラウンドで実行する方法
# nohup sh adb-import.sh &ログを確認します。
# tail -f nohup.outプロセスが実行中であることを確認します。
# ps -ef|grep importインポートエラーを無視する方法
SQL 実行エラーが発生した場合、ignoreErrors=true を設定します。ツールはインポートを継続し、影響を受けたファイル、開始行番号、および失敗した文をログに記録します。batchSize パラメーターが指定されている場合、不正な行番号は、開始行番号と batchSize 値の合計以下になります。
列数の不一致は無視できません。行内の列数がテーブル定義と一致しない場合、ツールはそのファイルを直ちに停止します。再試行する前に、ファイルを手動で確認してください。エラーメッセージは次のようになります。
[ERROR] 2021-03-22 00:46:40,444 [producer- /test2/data/lineitem.csv.split00.100-41] analyticdb.tool.ImportTool
(ImportTool.java:591) -bad line found and stop import! 16, file = /test2/data/tpch100g/lineitem.csv.split00.100, rowCount = 7, current row = 3|123|179698|145|73200.15|0.06|0.00|R|F|1994-02-02|1994-01-04|1994-02-
23|NONE|AIR|ongside of the furiously brave acco|インポートエラーの原因を絞り込む方法
3 つのアプローチがあります。
失敗したステートメントをより多く表示するために、SQL 表示長を増やします。
printErrorSql=true failureSqlPrintLengthLimit=1500不良行を特定するために、`batchSize` を減らします。
batchSize=10エラーを含む分割ファイルがすでに特定されている場合は、特定のファイルセグメントを分離します。
dataPath=/u01/this/is/the/directory/where/product_info/stores/file007
Windows でツールを実行する方法
Windows ではシェルスクリプトは提供されません。コマンドラインインターフェイスを使用して JAR を直接呼び出します。
usage: java -jar adb-import-tool.jar [-a <arg>] [-b <arg>] [-B <arg>] [-c <arg>]
[-D <arg>] [-d <arg>] [-E <arg>] [-f <arg>] [-h <arg>] [-I <arg>]
[-k <arg>] [-l <arg>] [-m <arg>] [-n <arg>] [-N <arg>] [-O <arg>]
[-o <arg>] [-p <arg>] [-P <arg>] [-Q <arg>] [-s <arg>] [-S <arg>]
[-t <arg>] [-T <arg>] [-u <arg>] [-w <arg>][-x <arg>] [-y <arg>] [-z <arg>]必須パラメーター:
| フラグ | 説明 |
|---|---|
-h, --ip <arg> | クラスターエンドポイント |
-u, --username <arg> | データベースアカウント |
-p, --password <arg> | アカウントパスワード |
-P, --port <arg> | ポート番号 |
-D, --databaseName <arg> | データベース名 |
-f, --dataFile <arg> | ファイルまたはフォルダーへの絶対パス。複数のファイルの場合は、パスをコンマ (,) で区切ります。 |
-t, --tableName <arg> | 宛先テーブル名 |
オプションパラメーター:
| フラグ | デフォルト | 説明 |
|---|---|---|
-a, --createEmptyFinishFilePath <arg> | (空) | インポート完了時にマーカーファイルを作成します。無効にするには空白のままにします。 |
-b, --batchSize <arg> | 1 | `INSERT` バッチあたりの行数。最高のスループットを得るには 1024 ~ 4096 の範囲で設定します。 |
-B, --encryptPassword <arg> | false | Base64 パスワード暗号化を有効にします。 |
-c, --printRowCount <arg> | false | 各ファイルの後に宛先テーブルの行数を表示します。 |
-d, --skipHeader <arg> | false | 各ファイルの最初の行をスキップします。 |
-E, --escapeSlashAndSingleQuote <arg> | true | 列の値で \ および ' をエスケープします。データにこれらの文字がいずれも含まれていない場合は、false に設定します。 |
-I, --ignoreErrors <arg> | false | SQL エラーが発生してもインポートを続行します。 |
-k, --skipLineNum <arg> | 0 | IGNORE number LINES各ファイルの先頭でスキップする行数 (`IGNORE number LINES` と同様)。 |
-l, --delimiter <arg> | | | 列デリミタ。非表示文字の場合は、16進表記を使用します(例:\x07\x07 → hex0707)。 |
-m, --maxConcurrentNumOfFilesToImport <arg> | Integer.MAX_VALUE | フォルダーから同時に読み取られるファイルの最大数。 |
-n, --nullAsQuotes <arg> | false | false: 空のフィールド → null。true: 空のフィールド → ''。 |
-N, --printErrorSql <arg> | true | 実行に失敗した SQL ステートメントを表示します。 |
-O, --connectionPoolSize <arg> | 2 | データベース接続プールサイズ。 |
-o, --encoding <arg> | UTF-8 | ファイルエンコーディング。有効な値:GBK、UTF-8。 |
-Q, --disableInsertOnlyPrintSql <arg> | false | true: INSERT 文を実行せずに表示します。false: 実行します。 |
-s, --lineSeparator <arg> | \n | \x0d\x06\x08\x0ahex0d06080a行区切り文字。印刷不可能な文字には 16 進表記を使用します (例: `\x0d\x06\x08\x0a` -> `hex0d06080a`)。 |
-S, --printErrorStackTrace <arg> | false | SQL エラー発生時にスタックトレースを表示します。 |
-w, --windowSize <arg> | 128 | `INSERT` バッチのバッファプールサイズ。I/O を計算から分離してクライアントパフォーマンスを向上させます。 |
-x, --insertWithColumnNames <arg> | true | INSERT 文に列名を追加します(例:INSERT INTO tb(column1, column2))。 |
-y, --failureSqlPrintLengthLimit <arg> | 1000 | 失敗した SQL ステートメントに表示する最大文字数。 |
-z, --connectionUrlParam <arg> | ?characterEncoding=utf-8 | ?characterEncoding=utf-8&autoReconnect=true追加の JDBC 接続パラメーター。例: `?characterEncoding=utf-8&autoReconnect=true`。 |
例:
デフォルトパラメーターで単一ファイルをインポートします。
java -Xmx8G -Xms8G -jar adb-import-tool.jar \
-hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest \
--dataFile /data/lineitem.sample --tableName LINEITEM最大スループットでフォルダー内のすべてのファイルをインポートします。
java -Xmx16G -Xms16G -jar adb-import-tool.jar \
-hyourhost.ads.aliyuncs.com -uadbuser -ppassword -P3306 -Dtest \
--dataFile /data/tpch100g --tableName LINEITEM \
--concurrency 64 --batchSize 2048