FlyDataを利用した、MongoDBデータのAmazon Redshiftへのアップロード方法

はじめに

Mongo DBはドキュメント指向データベースであり、もっともポピュラーなNoSQLデータベースのひとつです。Mongo DBの利点はスキーマレスであり、最初に厳密にデータベースのスキーマを設計する必要がないことです。さらに、保存されるデータはJSONライクなデータで構成されるため、開発者がプログラムの中で処理するのに便利なフォーマットとなっています。
しかし、保存やアクセスが簡単な一方、データが大きくなったり件数が増えてくると、許容可能な時間内にクエリの実行結果を取得するのが難しくなってきます。このような背景から、私たちはMongoDBのユーザから何度か、MongoDBからAmazon Redshiftへの簡単なデータ投入方法について尋ねられました。
このチュートリアルでは、FlyData Autoloadを使用して、MongoDBからAmazon Redshiftへデータを転送する方法を説明します。FlyData AutoloadはJSONフォーマットをサポートしているので、あなたは簡単にMongoDBからエクスポートしたデータをアップロードすることができるでしょう。もし、あなたがMongoDBのデータをAmazon Redhisftで分析することを検討している場合にも、このチュートリアルは役に立つと思います。

必要条件

始める前に、(1) FlyDataアカウント、 (2) テストデータのあるMongoDBサーバ (3) FlyData AgentをインストールするLinuxサーバ、の3つが必要となります。
準備:

  • FlyDataアカウント
  • もしあなたがFlyDataアカウントをお持ちでない場合、こちら からサインアップできます(アカウント登録は無料です)。
  • MongoDB
  • FlyData AgentをインストールするLinuxサーバ

もしテストデータがない場合、MongoDBのウェブページからサンプルのデータセットをインポートすることができます ( http://docs.mongodb.org/manual/tutorial/aggregation-zip-code-data-set/ )。このチュートリアルはこのサンプルデータを使って説明していきます。

# mongoDBのzipダンプファイルをダウンロード	 	 
$ curl -L http://media.mongodb.org/zips.json?_ga=1.201356177.1291086112.1430178289 > zips.dump	 	 
# zips.dumpをあなたのMongoDBへインポート	 	 
mongoimport --host --port --username --password --collection zips --db test --file zips.dump

サンプルデータは以下のようになります。

{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" }	 	 
{ "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" }	 	 
...

MongoDBのデータをRedshiftクラスタへアップロードする

ステップ1. FlyDataで新しいアプリケーションを作成する

FlyDataの設定画面( https://console.flydata.com/settings )にアクセスし、新しいアプリケーションを作成します。

もしFlyDataアカウントを作成したばかりであれば、FlyData Autloadのセットアップウィザードを使って設定することも可能です。または、ウィザードを閉じて、次の手順にしたがって設定することもできます。

図1. FlyDataの設定で、新しいアプリケーションを作成する

 

 

ヘッダナビゲーションのドロップダウンメニューから、作成したアプリケーションに切り替える

図2. アプリケーションを切り替える

 

ステップ2. FlyData上でRedshiftクラスタの設定を行う

もしまだあなたがFlyDataでRedshiftクラスタの設定を行っていない場合、FlyDataの設定ページ( https://console.flydata.com/settings )にアクセスし、Redshiftクラスタの情報をFlyDataに登録してください。

図3. Redshiftクラスタの設定

 

FlyDataでは、テスト用のサンドボックスクラスタもご用意しています。もし、あなたのMongoDBのデータをサンドボックスに保存してもよければ、「まだAmazon Redshiftクラスタをお持ちでない方へ」から「サンドボックスクラスタを設定します」をクリックしてください。
図4. Redshiftサンドボックスクラスタの設定

ステップ3. データエントリの設定

次に、ダッシュボード( https://console.flydata.com/dashboard )にアクセスし、データソースを特定するためのデータエントリを作成します。「ログのパス」にはJSONダンプファイルを保存する場所を指定します。しかし、FlyDataのデータエントリの設定がすべて完了するまで、このファイルが存在していけません

図5. データエントリの設定

ステップ4. FlyData Agentのインストール

さあ、データをAmazon Redhsiftに送信するため、flydata-agent をインストールする時です。実にシンプルですが、あなたのLinuxサーバで、ダッシュボード( https://console.flydata.com/dashboard )に表示されているインストールコマンドを実行してください。
図6. Flydata インストールコマンド

$ bash <(curl -L https://console.flydata.com/i/xxxxxxxxx)

Installing FlyData Agent. This will take several minutes to complete… ………………………………………………. Congratulations! FlyData has started uploading your data.

すぐに、FlyData Agentはあなたが指定したファイルパスの変更を監視し始めます。

ステップ5. MongoDBのコレクションデータのエクスポート

“mongoexport”コマンドを使い、MongoDBのコレクションデータをJSONフォーマットでダンプします。

mongoexport --host --port --username --password --collection zips --db test --file /home/ubuntu/data/zips.json

FlyDataは自動的にエクスポートされたデータをRedshiftクラスタにアップロードし始めます。通常、10分ほどでアップロードは完了しますが、データセットが大きい場合、かかる時間は変化します。

ステップ6. Redshiftにデータが転送されたことを確認する

Redshiftクラスタに転送されたデータを見てみましょう。データを見るためには、ご自身で用意したpsqlなどのPostgresqlのクライアントを使用するか、Redshiftコンソール( https://console.flydata.com/redshift_console )にアクセスしてください。

  • zips table スキーマの表示
psql# \d zips;	 	 
Table "fsb_schema_37_0eba8697.zips"	 	 
Column | Type | Modifiers	 	 
--------+------------------------+-----------	 	 
id | bigint |	 	 
_id | character varying(256) |	 	 
city | character varying(256) |	 	 
pop | integer |	 	 
state | character varying(256) |
  • Show zips table schema
psql# \d zips_loc;	 	 
Table "fsb_schema_37_0eba8697.zips_loc"	 	 
Column | Type | Modifiers	 	 
---------+------------------+-----------	 	 
zips_id | bigint |	 	 
index | integer |	 	 
value | double precision |
  • zipsテーブルのレコードの表示
psql# select * from zips limit 5;	 	 
id | _id | city | pop | state	 	 
---------------------+-------+--------------+-------+-------	 	 
6006569820881944865 | 01002 | CUSHMAN | 36963 | MA	 	 
6006569820890333729 | 01010 | BRIMFIELD | 3706 | MA	 	 
6006569820894527777 | 01012 | CHESTERFIELD | 177 | MA	 	 
6006569820898722081 | 01020 | CHICOPEE | 31495 | MA	 	 
6006569820898722593 | 01026 | CUMMINGTON | 1484 | MA	 	 
(5 rows)
  • zipsテーブルのレコードを表示(location付)
  • FlyData generate another table for nested JSON elements.
psql# select _id, city, pop, state, zips_loc.index as loc_index, zips_loc.value as loc_value from zips inner join zips_loc on zips.id = zips_loc.zips_id order by id, index limit 6;	 	 
_id | city | pop | state | loc_index | loc_value	 	 
-------+---------+-------+-------+-----------+------------	 	 
01001 | AGAWAM | 15338 | MA | 0 | -72.622739	 	 
01001 | AGAWAM | 15338 | MA | 1 | 42.070206	 	 
01002 | CUSHMAN | 36963 | MA | 0 | -72.51565	 	 
01002 | CUSHMAN | 36963 | MA | 1 | 42.377017	 	 
01005 | BARRE | 4546 | MA | 0 | -72.108354	 	 
01005 | BARRE | 4546 | MA | 1 | 42.409698	 	 
(6 rows)

興味があれば、こちらにFlyData AutoloadがどのようにJSONフォーマットのデータを処理しているかについてのドキュメントがありますのでご覧ください。

まとめ

ご覧いただいたように、FlyData Autoloadを使えば、簡単にあなたのMongoDBのデータをAmazon Redshiftにアップロードすることができます。Amazon Redshiftは独自にS3上のJSONデータをインポートする仕組みを持っていますが、データをS3に手動でアップロードしたり、Redshiftクラスタにテーブルを作成したり、アップロードのためのマニフェストファイルを書いたりと、いくつかの追加の手順が必要となります。FlyData Autoload はテーブル作成や既存テーブルのカラム追加まで含めて自動的にそれらを行うことができます。あなたがMongoDBのユーザで、Amazon Redshiftを使いたいとお考えなら、試してみる価値はありますよ。

関連記事

  1. AuroraからRedshiftへのレプリケーションが可能に

  2. Syncの手法:FlyData DirectとFlyData Agen…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。