cloudpackエバンジェリストの吉田真吾(@yoshidashingo)です。
最近、Treasure Data をいじってます。
CDP(カスタマーデータプラットフォーム)のトレジャーデータ - 散らばった顧客データをひとつにまとめる。 - Treasure Data
大量にデータをアップロードしたい
ログのデータをtd-agentを使ってTDにためて行く方法については情報が多いですが、検証や過去データの移行などで一度に大量のデータをTDに入れてしまいたいというニーズも一定数あると思います。
TDに大量にデータをアップロードするときは、データをmsgpack形式に圧縮してからアップロードできる td import 機能を使いましょう。
http://sstd-bigdata.blogspot.jp/2013/09/treasuredatatd-importprepare.html
トレジャーデータのWebサイトにあるマニュアルでも、Bulk Import の章で説明がされています。
http://docs.treasuredata.com/articles/bulk-import-internal
処理の流れ
Treasure Dataのサインアップ、tdコマンドはインストールは済んでいる前提で。
ヘルプを見る
td help <コマンド名> でヘルプが見られます。まずは td help:all でどんなコマンドがあるか確認するのがよいでしょう。
$ td help:all
jarの更新
まずはインポート用のjarファイルを最新化しておきます。
$ td import:jar_update
Installed td-import.jar is latest version
$ td import:java_version
td-import-java 0.4.11 via import:jar_update
セッションの作成からコミットまでの流れ
次に以下がインポート元およびファイル形式(MySQL,CSV,JSON)に関わらず共通した処理の流れです。
1.セッションを作成する(td import:create)
以下でデータベースの特定のテーブルに対するセッションを作成し、インポートジョブのステータス管理を行います。
$ td import:create <セッション名> <データベース名> <テーブル名>
2.データを分割して msgpack 形式へ圧縮する(td import:prepare)
アップロードするファイルを小分けにして圧縮することで、通信エラーが起きたときにリトライするサイズを小さくできます。今回はデフォルト値のまま実行しましたが、指定可能なパラメータ全体は td help import:prepare で確認できます。
$ td import:prepare <ファイル名> --format <入力ファイルのフォーマット指定> --columns <カラム名>,<カラム名>,...<カラム名> --column-types <カラム属性(string,int,long)>,<カラム属性>,...<カラム属性> --time-column
3.アップロードする(td import:upload)
小分けにできたファイルを作成したセッション名を指定してアップロードします。
$ td import:upload <セッション名> <ファイル名>
4.インポートする(td import:perform)
アップロードされたファイルの整合性確認やデータの変換(TD内の処理)を実行します。
$ td import:perform <セッション名>
5.コミットする(td import:commit)
最後にセッションをコミットしてテーブルに全てのデータを反映します。
$ td import:commit <セッション名>
【随時】セッションの状態を確認する
$ td import:list
1回のコマンド実行でOK
上記の一連の処理を、一回のコマンド実行で処理することもできます。MySQLから直接投入する方法と、手元のCSVファイルから投入する2種類の方式を試したので記載しておきます。
1. MySQLからデータをインポートする
$ td import:upload <セッション名> <インポート元のテーブル名> --format mysql --db-url jdbc:mysql://<endpoint URL>/<データベース名> --db-user <データベースのユーザ名> --db-password <パスワード>
ただ、今回は手元やm3.2xlargeから投入してもOutOfMemoryになったので私のほうで完全には試せてないです。
2. CSVからデータをインポートする
$ td import:upload --auto-create. --format csv --columns <カラム名>,<カラム名>,...<カラム名> --column-types <カラム属性(string,int,long)>,<カラム属性>,...<カラム名> --time-column --time-format --auto-perform --auto-commit -o .
100バイト内におさまるくらいのレコードを1億件持つ、複数のCSVで試してみて、30分〜2時間ちょっとくらいでインポートできちゃいました。
あと、トレジャーデータのサポートチャットは日本語で素早く答えてくれて超ありがたいです。