代码之家  ›  专栏  ›  技术社区  ›  antony.trupe

如何在命名空间之间复制数据存储实体

  •  4
  • antony.trupe  · 技术社区  · 15 年前

    我想将一个名称空间(比如www.mysite.com)中的所有数据复制到另一个名称空间(比如nightly.latest.mysite.appspot.com)。最好的方法是什么?

    示例名称空间不是随机的:它们是由名称空间过滤器为应用程序提供服务的给定域设置的名称空间。

    我希望能够将所有“生产”数据拉入“非生产”命名空间进行测试。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Robert Kluin    15 年前
        2
  •  6
  •   Vladimir Prudnikov    15 年前

        3
  •  4
  •   Guido    15 年前

    appengine-mapreduce getting started guides

    __Stat_Kind__

    import java.util.logging.Logger;
    
    import org.apache.hadoop.io.NullWritable;
    
    import com.google.appengine.api.NamespaceManager;
    import com.google.appengine.api.datastore.DatastoreService;
    import com.google.appengine.api.datastore.DatastoreServiceFactory;
    import com.google.appengine.api.datastore.Entity;
    import com.google.appengine.api.datastore.Key;
    import com.google.appengine.api.datastore.KeyFactory;
    import com.google.appengine.tools.mapreduce.AppEngineMapper;
    
    public class DatastoreCopyMapper extends
            AppEngineMapper<Key, Entity, NullWritable, NullWritable> {
    
        private static final Logger log = Logger
                .getLogger(DatastoreCopyMapper.class.getName());
        private static String destination;
    
        public DatastoreCopyMapper() {
        }
    
        @Override
        public void taskSetup(Context context) {
            log.warning("Doing per-task setup");
            destination = context.getConfiguration().get("destination");
            log.warning("destination: " + destination);
        }
    
        @Override
        public void map(Key key, Entity value, Context context) {
    
            NamespaceManager.set(destination);
            String name = key.getName();
            long id = key.getId();
            Key destinationKey = null;
            if (name != null) {
                destinationKey = KeyFactory.createKey(key.getKind(), name);
            } else if (id != 0) {
                destinationKey = KeyFactory.createKey(key.getKind(), id);
            }
            Entity destinationEntity = new Entity(destinationKey);
            destinationEntity.setPropertiesFrom(value);
            DatastoreService datastore = DatastoreServiceFactory
                    .getDatastoreService();
    
            datastore.put(destinationEntity);
    
        }
    }
    

    <configurations>
      <configuration name="Copy between namespaces">
        <property>
          <name>mapreduce.map.class</name>
          <value>com.mysite.server.DatastoreCopyMapper</value>
        </property>
        <property>
          <name>mapreduce.inputformat.class</name>
          <value>com.google.appengine.tools.mapreduce.DatastoreInputFormat</value>
        </property>
        <property>
          <name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
          <value template="optional">User</value>
        </property>
    
        <property>
          <name human="Destination Namespace">mapreduce.mapper.inputformat.datastoreinputformat.destination</name>
          <value template="optional">dev.mysite.com</value>
        </property>
    
      </configuration>
    </configurations>