package com.mongodb.hadoop.splitter; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.mongodb.MongoClientURI; import com.mongodb.hadoop.testutils.BaseHadoopTest; import com.mongodb.hadoop.util.MongoConfigUtil; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.InputSplit; import org.bson.types.MaxKey; import org.bson.types.MinKey; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; public class ShardChunkMongoSplitterTest extends BaseHadoopTest { private ShardChunkMongoSplitter splitter = new ShardChunkMongoSplitter(); private DBObject createChunk(final String key, final Object min, final Object max, final String shardName) { return new BasicDBObjectBuilder() .push("min").add(key, min).pop() .push("max").add(key, max).pop() .append("shard", shardName).get(); } @Test public void testSplitPreferredLocations() throws SplitFailedException, IOException, InterruptedException { // Create list of chunks. List<DBObject> chunksList = new ArrayList<DBObject>(){{ add(createChunk("i", new MinKey(), 500, "sh01")); add(createChunk("i", 500, new MaxKey(), "sh02")); }}; // Create shards map. Map<String, List<String>> shardsMap = new HashMap<String, List<String>>() {{ put("sh01", Arrays.asList("mongo.sh01.dc1:27017", "mongo.sh01.dc2:27017")); put("sh02", Arrays.asList("mongo.sh02.dc1:27027", "mongo.sh02.dc2:27027")); }}; Configuration conf = new Configuration(); MongoConfigUtil.setInputMongosHosts( conf, Arrays.asList("mongo.sh01.dc1:27018", "mongo.sh02.dc2:27018")); MongoConfigUtil.setInputURI( conf, new MongoClientURI("mongodb://mongo.dc1:27018,mongo.dc2:27018/hadoop.test")); splitter.setConfiguration(conf); List<InputSplit> splits = splitter.calculateSplitsFromChunks(chunksList, shardsMap); assertEquals("mongo.sh01.dc1:27018", splits.get(0).getLocations()[0]); assertEquals("mongo.sh02.dc2:27018", splits.get(1).getLocations()[0]); } }