MapReduceジョブのマップからMongoDBにドキュメントを挿入しています。一連の文字列がマップに与えられ、文字列ごとにSHA-1メッセージが生成され、MongoDBに挿入されます。約4億の文字列があります(HDFS上のファイルからの読み取り)。3つのモンゴを含む10個のシャードを使用しており、レプリケーションはありません。64ビットLinuxでMongoDB2.2.0を使用しています。ただし、このMRジョブは完了せず、ログに次の2種類の例外が表示されます。
MongoDBの各シャードへの接続が多すぎます(約250接続)。ログに次の例外が表示されます
com.mongodb.DBTCPConnector fetchMaxBsonObjectSize WARNING: Exception determining maxBSONObjectSize java.net.SocketException: Connection reset
Task attempt_***** failed to report status for 600 seconds. Killing!
クラスターには16個のノードがあり、いつでも256個のマップタスクが実行されているようです(hadoopログで通知されます)。
私は最初のエラー/例外を探し回ったところ、MongoDBのホストあたりの接続数を増やす必要があると誰かが言った。MongoOptionsクラスを使用してそれを10から20に増やし、Mongosインスタンスの初期化中にそれを提供します。しかし、それは問題を解決していません-これが例外の理由ですか?
map()のconfigure()メソッドでMongoのインスタンスを作成し、close()で閉じています。Mongoインスタンスを作成するためのより良い方法はありますか?
HadoopとMongoDBの組み合わせで作業しているときに、誰かがこれらのエラーに遭遇しましたか?この組み合わせを使用する際に注意する必要がある他の何かがありますか?
PS:この質問をMongoDBユーザーリストに投稿しましたが、より多くのユーザーにこの質問を確認してもらいたいので、ここに再投稿しました。