日本語 | English
概要
参照テーブルの作成で、
いかに良い感じに4200万件のデータをDynamoDBに書き込むかの挑戦。
24hで終わればいいなという考え。
公式ドキュメント)AWS DataPipeline
参考)DynamoDBでデータのexport/importを行う | Developers.IO
S3からDynamoDBへインポート!
インポートファイルを作る
以下の形式でファイル出力してS3におき、DynamoDBからインポートすればよい。
制御文字でのフォーマットは古いようです(2016/07 時点)
AWSに問い合わせて新フォーマットを教えてもらった。
サンプル)
{"id":{"s":"a"},"name":{"s":"apple"},"price":{"n":"120"}} {"id":{"s":"b"},"name":{"s":"book"},"price":{"n":"540"}} {"id":{"s":"c"},"name":{"s":"cup"},"price":{"n":"480"}}
インポート時に指定できるのがフォルダまでなので、
対象のフォルダにインポートするファイルだけがある状態がよい。
ファイルの拡張子はなんでもいい。なくてもいい。
実行の仕組み
・ import/export には DataPipelineが必須
・ 裏でEMRが稼動する
・ DynamoDBの現状キャパシティの何パーセント分で処理させるかを設定する
これをもとに大体の費用を考えてみよう。
実際にやってみた
費用的な面
公式ドキュメントにあるとおり、
EMRはデフォルトでm1.small1台、m1.xlargeが1台起動する。
DynamoDBの書き込みキャパシティーユニット数上限は10,000。
想定処理時間 | DynamoDB費用 | EMR費用 | トータル |
---|---|---|---|
24h | $8.6(W:500) | $15.7 | $24.3(=2435円) |
4h | $9.8(W:3000) | $2.6 | $12.4(=1243円) |
2h | $9.9(W:6000) | $1.3 | $11.2(=1122円) |
※ 4200万件を24hで書き込む計算で、4200万 / (24×60×60) = 486.111...
っという感じ。
今回はEMRの処理性能も未知なので 24hプラン
で処理してる。
速度的な面
・ 結局6GB
のインポートファイルになった
・ S3アップに10分くらい
、ブラウザからアップした
・ インポート実行時のDataPipelineとかEMRの起動とかで20分くらい
・ インポート処理自体に24時間くらい
(計算通り)
そんな感じだった。
性能や負荷的な面
・ DynamoDBのキャパシティをキレイに使い切ってくれた
・ 24hプラン
ではEMRのCPU使用率は2%ほどで遷移しており余裕の様子
・ \ 2hプランも可能かもしれない /
終わりに
SDKとかで自前で書き込ませるという手もあるけれど、
キャパシティ使い切るには並列処理で書き込み実行させることとなる ↓ 1プロセスがどのくらい処理をさばけるかはサーバスペックなどに依存 ↓ 設定ユニット数を超えたり余らせたりして効率を上げるのが割りと不毛
という経験もあったので、大量のデータをDynamoDBに書き込むには
S3インポートが一番手間が少なくスマートで良いと思った。
以上!ステキなDynamoライフを!