Skip to content
Last updated

MySQL Import Integration CLI

TD Consoleが利用できない場合やご利用いただけない場合でも、CLIからMySQLデータコネクタを使用できます。以下の手順では、CLIを使用してデータをインポートする方法を説明します。

前提条件

  • Treasure Dataの基本的な知識
  • MySQLの基本的な知識
  • Treasure Dataから到達可能なMySQLインスタンス

MySQL Community Server 5.6および5.7を使用していてSSLを使用したい場合は、コネクタの基盤となるライブラリとの互換性の問題を解決するために、パラメータenabledTLSProtocolsとTLSv1.2を設定してください。他のMySQLバージョンでは、統合は自動的に最高のTLSバージョンを使用しようとします。

'td'コマンド v0.11.9以降のインストール

最新のTD Toolbeltをインストールしてください。

設定ファイルの作成

MySQLアクセス情報を含む設定ファイル(例:load.yml)を以下のように準備してください。

in:
  type: mysql
  host: mysql_host_name
  port: 3306
  user: test_user
  password: test_password
  database: test_database
  table: test_table
  select: "*"
out:
  mode: replace

この例では、テーブル内のすべてのレコードをダンプします。追加パラメータを使用して、より詳細な制御が可能です。

SSLオプションを使用する場合は、以下のオプションを使用してください:

  • requireSSL
  • useSSL
  • verifyServerCertificate
in:
  type: mysql
  host: mysql_host_name
  port: 3306
  user: test_user
  password: test_password
  options:
    requireSSL: true
    useSSL: true
    verifyServerCertificate: false
  database: test_database
  table: test_table
  select: "*"
out:
  mode: replace

利用可能なoutモードの詳細については、付録を参照してください。

データのプレビュー(オプション)

td connector:previewコマンドを使用して、インポートされるデータをプレビューできます。

$ td connector:preview load.yml
+---------+--------------+----------------------------------+------------+---------------------------+
| id:long | name:string  | description:string               | price:long | created_at:timestamp      |
+---------+--------------+----------------------------------+------------+---------------------------+
| 1       | "item name1" | "26e3c3625366591bc2ffc6e262976e" | 2419       | "2014-02-16 13:01:06 UTC" |
| 2       | "item name2" | "3e9dd9474dacb78afd607f9e0a3366" | 1298       | "2014-05-24 13:59:26 UTC" |
| 3       | "item name3" | "9b6c9e4a140284d3951681e9e047f6" | 9084       | "2014-06-21 00:18:21 UTC" |
| 4       | "item name4" | "a11faf5e63c1b02a3d4c2b5cbb7331" | 669        | "2014-05-02 03:44:08 UTC" |
| 6       | "item name6" | "6aa15471c373ddc8a6469e1c918f98" | 3556       | "2014-03-29 08:30:23 UTC" |
+---------+--------------+----------------------------------+------------+---------------------------+

ロードジョブの実行

ロードジョブを送信します。データサイズによっては数時間かかる場合があります。ユーザーは、データが保存されているデータベースとテーブルを指定する必要があります。

Treasure Dataのストレージは時間でパーティション分割されているため(アーキテクチャも参照)、--time-columnオプションを指定することを推奨します。このオプションを指定しない場合、Data Connectorは最初のlong型またはtimestamp型のカラムをパーティショニング時間として選択します。--time-columnで指定するカラムの型は、long型またはtimestamp型のいずれかである必要があります。

データに時間カラムがない場合は、add_timeフィルタオプションを使用して追加できます。詳細はadd_timeフィルタプラグインを参照してください。

$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at

上記のコマンドは、*database(td_sample_db)table(td_sample_table)*を既に作成していることを前提としています。TDにdatabaseまたはtableが存在しない場合、このコマンドは成功しません。TD Consoleを使用してdatabaseとtableを作成するか、td connector:issueコマンドで--auto-create-tableオプションを使用して、databaseとtableを自動作成してください。

$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at --auto-create-table

"--time-column"オプションで、Time Format列を"Partitioning Key"に割り当てることができます。

Scheduled Execution

高可用性スケジューラを使用して、定期的なMySQLインポートのためのData Connector実行をスケジュールできます。この機能を使用することで、ローカルデータセンターにcronデーモンを設置する必要がなくなります。

Incremental load

incremental_columnsパラメータにテーブルのカラムを指定することで、レコードを段階的にロードできます。オプションで、last_recordパラメータに初期値を指定することもできます。

in:
  type: mysql
  options: {useLegacyDatetimeCode: false}
  host: mysql_host_name
  port: 3306
  user: test_user
  password: test_password
  database: test_database
  table: test_table
  incremental: true
  incremental_columns: [id, created_at]
  last_record: [10000, '2014-02-16T13:01:06.000000Z']
out:
  mode: append
  exec: {}

フルテーブルスキャンを避けるために、incremental\_columns:オプションを使用して関連するカラムにインデックスを作成してください。 この例では、以下のインデックスを作成します。

CREATE INDEX embulk_incremental_loading_index ON test_table (id, created_at);

Connectorは自動的にクエリを作成し、値をソートします。

-- when last_record wasn't given
SELECT * FROM(
    ...original query is here
)
ORDER BY id, created_at
-- when last_record was given
SELECT * FROM(
    ...original query is here
)
WHERE id > 10000 OR (id = 10000 AND created_at > '2014-02-16T13:01:06.000000Z')
ORDER BY id, created_at

Connectorは自動的にlast_recordを取得し、次のスケジュール実行時に使用します。

in:
  type: mysql
  options:
    useLegacyDatetimeCode: false
  ...
out:
  ...

Config Diff
---
in:
  last_record:
  - 20000
  - '2015-06-16T16:32:14.000000Z'

incremental: trueを設定すると、queryオプションは使用できません。 incremental_columnsとしてサポートされているのは、文字列、整数、datetimeおよびtimestamp型のみです。 datetime/timestamp型のカラムをincremental_columnsとして使用する場合は、GUIでJDBC接続オプションとして、または設定ファイルのoptionsとしてuseLegacyDatetimeCode: falseを設定してください。

スケジュールの作成

新しいスケジュールは、td connector:createコマンドを使用して作成できます。スケジュール名、cron形式のスケジュール、データの保存先となるデータベースとテーブル、およびData Connector設定ファイルが必要です。

$ td connector:create \
    daily_mysql_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml

cronパラメータは、@hourly@daily@monthlyの3つのオプションも受け付けます。 デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、任意のタイムゾーンでスケジュールを設定できます。--timezoneオプションは、'Asia/Tokyo'や'America/Los_Angeles'などの拡張タイムゾーン形式のみをサポートしています。PST、CSTなどのタイムゾーン略語は*サポートされておらず*、予期しないスケジュールになる可能性があります。

スケジュールの一覧表示

現在スケジュールされているエントリの一覧は、td connector:listで確認できます。

$ td connector:list
+--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+
| Name               | Cron         | Timezone | Delay | Database     | Table           | Config                  |
+--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+
| daily_mysql_import | 10 0 * * *   | UTC      | 0     | td_sample_db | td_sample_table | {"type"=>"mysql", ... } |
+--------------------+--------------+----------+-------+--------------+-----------------+-------------------------+

スケジュールの詳細表示

td connector:showは、スケジュールエントリの実行設定を表示します。

% td connector:show daily_mysql_import
Name     : daily_mysql_import
Cron     : 10 0 * * *
Timezone : UTC
Delay    : 0
Database : td_sample_db
Table    : td_sample_table

td connector:historyは、スケジュールエントリの実行履歴を表示します。各実行の結果を調査するには、td job jobidを使用してください。

% td connector:history daily_mysql_import
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
| JobID  | Status  | Records | Database     | Table           | Priority | Started                   | Duration |
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
| 578066 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-18 00:10:05 +0000 | 160      |
| 577968 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-17 00:10:07 +0000 | 161      |
| 577914 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-16 00:10:03 +0000 | 152      |
| 577872 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-15 00:10:04 +0000 | 163      |
| 577810 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-14 00:10:04 +0000 | 164      |
| 577766 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-13 00:10:04 +0000 | 155      |
| 577710 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-12 00:10:05 +0000 | 156      |
| 577610 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-11 00:10:04 +0000 | 157      |
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
8 rows in set

スケジュールの削除

td connector:deleteは、スケジュールを削除します。

$ td connector:delete daily_mysql_import

付録

outプラグインのモード

load.ymlのoutセクションでファイルインポートモードを指定できます。

たとえば、Treasure Data内の既存のテーブルにデータを追加するか、データを置き換えるかを選択できます。

モード説明
Appendレコードがターゲットテーブルに追加されます。in: ... out: mode: append
Always Replaceターゲットテーブルのデータを置き換えます。ターゲットテーブルに対して手動で行われたスキーマ変更は保持されます。in: ... out: mode: replace
Replace on new dataインポートする新しいデータがある場合にのみ、ターゲットテーブルのデータを置き換えます。in: ... out: mode: replace_on_new_data