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に無駄が生じることを受け入れるのが楽。
この事象がバグなのか仕様なのかは知らない。