share facebook facebook2 twitter menu hatena pocket slack

2014.04.18 FRI

Treasure Dataに大量にデータをアップロードする td import 機能

吉田 真吾

WRITTEN BY吉田 真吾

cloudpackエバンジェリストの吉田真吾@yoshidashingo)です。

Treasure Data をいじってます。
トレジャーデータ | データ収集、保存、分析のためのエンドツーエンドでサポートされたクラウドサービスです。

大量にデータをアップロードしたい

ログのデータをtd-agentを使ってTDにためて行く方法については情報が多いですが、検証や過去データの移行などで一度に大量のデータをTDに入れてしまいたいというニーズも一定数あると思います。

TDに大量にデータをアップロードするときは、データをmsgpack形式に圧縮してからアップロードできる td import 機能を使いましょう。

SIOS ビッグデータ技術ブログ: TreasureDataのtd import:prepare機能の比較検証

トレジャーデータのWebサイトにあるマニュアルでも、Bulk Import の章で説明がされています。

Bulk Import Internal | Treasure Data

処理の流れ

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 ,,... --time-column  --time-format  -o .

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種類の方式を試したので記載しておきます。

MySQLからデータをインポートする

$ td import:upload   --format MySQL --db-url jdbc:MySQL://<endpoint URL>/<データベース名> --db-user  --db-password 

ただ、今回は手元やm3.2xlargeから投入してもOutOfMemoryになったので私のほうで完全には試せてないです。

CSVからデータをインポートする

$ td import:upload --auto-create . --format csv --columns ,,... --column-types ,,... --time-column  --time-format  --auto-perform --auto-commit -o . 

100バイト内におさまるくらいのレコードを1億件持つ、複数のCSVで試してみて、30分〜2時間ちょっとくらいでインポートできちゃいました。
あと、トレジャーデータのサポートチャットは日本語で素早く答えてくれて超ありがたいです。

こちらの記事はなかの人(yoshidashingo)監修のもと掲載しています。
元記事は、こちら

吉田 真吾

吉田 真吾