2016-11-25 4 views
0

私の目標は、私の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

期待された動作に関するあらゆるポインタが本当に便利です。ありがとう。

答えて

1

私はここには答えを持っていないので、私はMongoDBの上でJIRAのバグを提出し、今のように、は、シャードのMongoDBクラスタに二次の地図-削減ジョブを実行することはできません、ということが分かりました。ここにはthe bug reportがあります。

+0

MongoDBのMRにジュースを提供しようとしている人々のために、これは重要なブログ投稿です: https://scalegrid.io/blog/mongodb-performance-running-mongodb-map-reduce-セカンダリ操作/ – Vaibhaw

関連する問題