DynamoDBのExport/Import時に遭遇した問題

AWSにて、Data PipelineでDynamoDBのデータのExportとImportをしていた中で遭遇した事象についてまとめてみます。


実施したことと遭遇した事象

AWSコンソールのDynamoDBの画面から、複数のテーブルのデータをExportした。
Data PipelineおよびElastic MapReduceにより実行した。

⇒その結果、テーブルAはS3上に4個のファイル、テーブルBは10個のファイルとしてExportされた。

新しく作ったテーブルにExportしたデータをImportした。
Exportと同様に、Data PipelineおよびElastic MapReduceにより実行した。
Importの設定画面で、Data Pipelineに割り当てる Throughput Rateを100% にした。

テーブルのThroughputのWrite Capasityの利用率が100%を大きく下回る事象に遭遇した。

詳細と実験と観察

テーブルAのImport処理はEMR上で4個のタスクに分割され、4並列で実行された。
4並列の実行中はWrite Capasityの利用率はほぼ100%だった。
(Write Capasityの割り当ては512で、利用量もほぼ512だった。)

1つだけタスクが終わると、利用量が384(75%)に低下した。
そこで、Write Capasityの割り当てを400に下げたところ、利用量は300(75%)になった。
もしやと思い、割り当てを800に上げたところ、利用量は600(75%)になった。

テーブルBのImport処理はEMR上で10個のタスクに分割され、最大8並列で実行された。
8並列の実行中はWrite Capasityの利用率はほぼ100%だった。
タスクが順調に減り、最後の1タスクだけを実行している間は、Write Capasityの利用率は8分の1程度だった。

推測

Throughput Rateに設定した値は、Mapジョブ全体の上限になるのではない。
(Mapジョブ全体で100%利用する、という設定になるのではない。)

Mapタスク(あるいはスロット)に均等に分けられて、Mapタスクごとの利用上限になる。
(テーブルAの場合、MapタスクごとにWrite Capasityの25%が利用上限になる。)
(テーブルBの場合、Mapスロットごとに12.5%が利用上限になる。)

考察

Capasityが100%利用されるようにするには、Importするファイルの数はMapスロット数以下(またはMapスロット数の整数倍)にし、かつファイルのサイズを均等にする。

むしろ、Importするファイルは1つの大きなファイルでも良さそう。
ボトルネックはEMRの分散部分よりもDynamoDBのスループットなので。

しかし、そのためにはExportしたファイルに何らかの加工が必要なので、手間を考えるとCapasityに無駄が生じることを受け入れるのが楽。

この事象がバグなのか仕様なのかは知らない。