『DynamoDB:SSD Hot S3 Cold パターン』を試してみた。

記事タイトルとURLをコピーする

みなさん、こんにちは。

新規開発チームの小田切です。

最近は、仕事の合間にいろいろ検証を行ったりしているのですが、その中で見つけた「SSD Hot S3 Coldパターン」という物があり、気になったので、検証を行ってみました。

「SSD Hot S3 Coldパターン」は簡単にいうと、『SSD(DynamoDB)はストレージ料金がそれなりに高いから、使わないデータは価格の安いS3に移動させちゃいましょう』というパターンです。

イメージは以下のような感じになると思います。

ここで活躍するのが、DynamoDBとS3をつなぐ事の出来るEMR(Hive)です。

Dynamoには、すでにデータが入っている状態として話を進めて行きます。

EMRのJobFlowを作成する

まずは、EMRのJobFlowを作成し、HadoopとHiveのインストールされているインスタンスを作成する必要があります。

AWSのManagementConsoleから「Elastic MapReduce」を選択します。

上記の画面が表示されますので、「Create New Job Flow」をクリックします。リージョンは適宜選択してください。

EMRのJob Flowを作成するウィザードが表示されます。

ここでは、ジョブフローの名前と、Hadoopのバージョン、ジョブフローの種類を入力します。

ジョブフロー名は適当な名前をつけて頂き、「Choose a Job Type」のドロップダウンボックスで"Hive Program"を選択します。

 

次の画面では、「Start an Interactive Hive Session」にチェックをします。これで、Hiveに対して対話形式でSQLを実行する事が出来るようになります。

 

次の画面では、HadoopのMasterサーバへSSHでログインする際に私用するキーペアを指定します。

キーペアを作成されていない方は、先にキーペアを作成しておいてください。

あとは、デフォルトのまま「Continue」をクリックして行き、JobFlowの作成を完了します。

 

MasterサーバへSSHでログインする。

Job Flowの作成が完了し、少し待ちますと、Master・Slaveサーバのインスタンスが起動します。

ManagementConsoleで先ほど作成したJobを選択しますと、画面下に各設定内容が表示されます。

その中から「Description」より「Master Public DNS Name」を確認します。

ここで表示されたサーバへ、SSHでログインを行います。その際使用するキーはJob Flow作成時に指定した鍵を使用します。

また、ログインする際のユーザはhadoopユーザとなります。

各種コンソールから以下コマンドにて、サーバへログインします。(サーバ名、使用する鍵は各自の設定に合わせてください。)

ssh hadoop@ec2-54-248-58-230.ap-northeast-1.compute.amazonaws.com -i ~/foo.pem

 

Hiveを使用して、DynamoDBからS3へデータをエクスポートする

まずは、Hiveを起動します。

コンソールから

hive

と入力し、enterしますと、Hiveとの対話式のコンソールが起動します。(なお、ここで実行するコマンドはHiveQLと呼ばれるSQLライクな言語です。)

おそらく、みなさん東京リージョンを使っていると思われますので、以下コマンドでDynamoDBのEndPointを設定します。

SET dynamodb.endpoint=dynamodb.ap-northeast-1.amazonaws.com;

次からいよいよDynamoDBとHiveのテーブルの連携を行います。

CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "DynamoDBTableName", 
"dynamodb.column.mapping" = "col1:name,col2:year"); 

上記コマンドは、Hiveのテーブルを作成するコマンドです。

1行目では、"hiveTableName"というテーブルを作成し、カラムはcol1とcol2があるという事を宣言しています。

2行目で、このテーブルはDynamoDBからデータを取得する事を宣言しています。

3行目では、データの取得するDynamoDBのテーブル名を指定しています。

4行目で、Hiveのテーブルのカラムと、DynamoDBのカラムのマッピングを設定しています。

 

これで、DynamoDBとHiveの連携が出来ましたので、後は、データをS3へ出力します。

S3への出力は以下のコマンドを実行します。

INSERT OVERWRITE DIRECTORY 's3://[バケット名]/fromHive/'
SELECT * FROM hiveTableName;

コマンドを実行しますと、Map&Reduce処理が実行されて行きます。処理が完了しますと指定したS3のバケットのディレクトリへ、TSV形式でファイルが出力されています。

ここでは、全件をS3へ出力するようにしていますが、実際には何かしらに条件を付けてHiveQLを実行する事になると思います。

後は、必要の無くなったデータをDynamoDBから削除すれば『SSD Hot S3 Coldパターン』は完了です。

DynamoDBのデータはHiveからは削除できませんので、他の方法(JavaのAWS SDKを利用して削除する等)で削除します。

また、S3に置いてあるファイルをHiveのテーブルと関連づける事も可能です。そうする事で、DynamoDBのデータとS3に移動したデータの両方を利用して解析を行う事も可能です。

 

最後に

『SSD Hot S3 Coldパターン』は、DynamoDBから、よりコストの低いS3へ、必要の無いデータは移動し、AWS使用料を抑えましょうというパターンで、このパターン自体も非常に参考になったのですが、それ以上に、DynamoDBとEMR(Hive)、S3とEMR(Hive)の親和性の高さが面白いなと感じました。

これを利用すれば、DynamoDBのテーブルをHive上でJoinしたり、DynamoDBのテーブルとS3のデータをJoinしたりする事も出来てしまいます。

今まで仕事でEMRを使用する事が無かったので、そこまでEMR関連のドキュメントとかもしっかり見てなかったのですが、最近EMRはまってきています。

今後もEMRは追いかけて行こうと思っていますので、何か面白い使い方とかありましたらここで紹介して行きます。