Mapreduce ライブラリを使用して、ライブの App Engine アプリでデータストア スキーマを移行しようとしています。
私のマッパーは DatastoreKeyInputReader を使用します。各マップ操作は、古いスキーマを使用して古いエンティティをフェッチし、データ操作を行ってから、新しいエンティティを (新しい種類で) 新しいスキーマに書き込みます。トランザクション オプション「force_writes」を True に設定して、NDB を使用してエンティティをトランザクション的に取得および配置します。
アプリは稼働中なので、マッパーのトランザクション書き込みを除いて、移行中は他のすべてのデータストア書き込みをブロックしたいと考えています。残念ながら、個々のマップ操作は、書き込みが無効になっているアプリで force_writes を True に設定して正しく実行できますが、実際には Mapreduce ジョブを開始できません。Mapreduce ライブラリ自体が独自のブックキーピングで force_writes を採用していないため、CapabilityDisabledError がトリガーされます。仕事の。
明らかなハックは、書き込みを有効にしてジョブを開始し、ジョブが開始されたらすぐに無効にすることです。ただし、特に私のアプリは通常の条件下で毎秒数回の書き込みを行うため、これは私にはかなり危険に思えます。さらに、クリーンアップに間に合うように書き込みが再度有効にされない限り、ジョブが終了するとおそらく壊れます。
では、データストアへの書き込みも無効にする必要がある場合、Mapreduce ジョブを開始するにはどうすればよいでしょうか? mapreduce.yaml がジョブの force_writes オプションをサポートするのが最もきれいなようです...