私の目標は、私のMongoDBクラスタの断片の二次的に常にMap-Reduceジョブを実行することです。MongoDBは、シャードされたクラスタでMapReduceを実行しているときにreadPreferenceを無視しますか?
私はreadPreference
をセカンダリに設定し、MapReduceコマンドのout
パラメータをinline
に設定しています。これはシャードされていないレプリカセットで正常に動作します。ジョブはセカンダリで実行されます。ただし、シャードされたクラスタでは、このジョブはプライマリで実行されます。
なぜこのようなことが起こったのか説明したり、関連文書を指摘できますか? relevant documentationで何も見つかりませんでした。二次から
public static final String mapfunction = "function() { emit(this.custid, this.txnval); }";
public static final String reducefunction = "function(key, values) { return Array.sum(values); }";
...
private void mapReduce() {
...
MapReduceIterable<Document> iterable = collection.mapReduce(mapfunction, reducefunction);
...
}
...
Builder options = MongoClientOptions.builder().readPreference(ReadPreference.secondary());
MongoClientURI uri = new MongoClientURI(MONGO_END_POINT, options);
MongoClient client = new MongoClient(uri);
...
ログこれは、レプリカ・セット上で実行されるとき:
2016-11-23T15:05:26.735 + 0000 I COMMAND [conn671]コマンドtest.txnsコマンド:MapReduceの{のMapReduce: "txns"、マップ:function(){emit(this.custid、this.txnval); }、reduce:function(key、values){戻り値Array.sum(values);} }}、out:{inline:1}、クエリ:null、ソート:null、確定:null、スコープ:null、冗長:true} planSummary:COUNT個のkeyUpdates:0 writeConflicts:0 numYields:7 reslen:4331 locks:収集:{acquireCount:{r:3}}}プロトコル:op_query 124ms
シャードされたコレクション:シャード-0のプライマリから
mongos> db.txns.getShardDistribution()
Shard Shard-0 at Shard-0/primary.shard0.example.com:27017,secondary.shard0.example.com:27017
data : 498KiB docs : 9474 chunks : 3
estimated data per chunk : 166KiB
estimated docs per chunk : 3158
Shard Shard-1 at Shard-1/primary.shard1.example.com:27017,secondary.shard1.example.com:27017
data : 80KiB docs : 1526 chunks : 3
estimated data per chunk : 26KiB
estimated docs per chunk : 508
Totals
data : 579KiB docs : 11000 chunks : 6
Shard Shard-0 contains 86.12% data, 86.12% docs in cluster, avg obj size on shard : 53B
Shard Shard-1 contains 13.87% data, 13.87% docs in cluster, avg obj size on shard : 53B
ログ:
2016-11-24T08:46:30.828 + 0000 I COMMAND [conn357]コマンド試験$ CMDコマンド:mapreduce.shardedfinishは{mapred uce.shardedfinish:{mapreduce: "txns"、map:function(){emit(this.custid、this.txnval); }、reduce:function(key、values){戻り値Array.sum(values);} }、out:{ 行:1}、クエリ:null、ソート:null、確定:null、スコープ:null、冗長:true、$ queryOptions:{$ readPreference:{mode: "secondary"}}}、inputDB: "test"、shardedOutputCollection: "tmp.mrs.txns_1479977190_0"、シャード:{Shard-0/primary.shard0.example.com:27017、secondary.shard0.example.com:27017:{result : "tmp.mrs.txns_1479977190_0"、timeMillis:123、タイミング:{mapTime:51、emitLoop:116、reduceTime:9、モード: "mixed"、合計:123}、カウント:{input:9474、emit:9474、シャード-1/primary.shard1.example.com:27017(最終的には、タイムスタンプ1479977190000 | 103、electionId:ObjectId( '7fffffff0000000000000001')}}) 、secondary.shard1.example.com:27017:{結果: "tmp.mrs.txns_1479977190_0"、timeMil lis:71、timing: {mapTime:8、emitLoop:63、reduceTime:4、mode: "mixed"、合計:71}、カウント:{input:1526、emit:1526、reduce:197、output:101} 、OK:1.0、$ gleStats:{lastOpTime:タイムスタンプ1479977190000 | 103、electionId:ObjectId( '7fffffff0000000000000001')}}、shardCounts:{Sha rd-0/primary.shard0.example.com:27017、secondary.shard0 .example.com:27017:{input:9474、emit:9474、reduce:909、output:101}、Shard-1/primary.shard1.example.com:27017、secondary.shard1.example.com:27017:{ keyUpdates:0 writeConflicts:0 numYields:0 reslen {0,1} {0}}}}}}}}}}}}}}} :4368ロック:{global:{acquireCount:{r:2}}、データベース:{acquireCount:{r:1}}、コレクション:{ ireCount:{r:1}}}プロトコル:op_command 115ms 2016- 11-24T08:46 :30.830 + 0000 I COMMAND [conn46]コマンド:drop test.tmp.mrs。txns_1479977190_0
期待された動作に関するあらゆるポインタが本当に便利です。ありがとう。
MongoDBのMRにジュースを提供しようとしている人々のために、これは重要なブログ投稿です: https://scalegrid.io/blog/mongodb-performance-running-mongodb-map-reduce-セカンダリ操作/ – Vaibhaw