0

MapReduceジョブのマップからMongoDBにドキュメントを挿入しています。一連の文字列がマップに与えられ、文字列ごとにSHA-1メッセージが生成され、MongoDBに挿入されます。約4億の文字列があります(HDFS上のファイルからの読み取り)。3つのモンゴを含む10個のシャードを使用しており、レプリケーションはありません。64ビットLinuxでMongoDB2.2.0を使用しています。ただし、このMRジョブは完了せず、ログに次の2種類の例外が表示されます。

  1. MongoDBの各シャードへの接続が多すぎます(約250接続)。ログに次の例外が表示されます

    com.mongodb.DBTCPConnector fetchMaxBsonObjectSize                                                                                                                                 
    WARNING: Exception determining maxBSONObjectSize                                                                                                                                                          
    java.net.SocketException: Connection reset 
    
  2. 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ユーザーリストに投稿しましたが、より多くのユーザーにこの質問を確認してもらいたいので、ここに再投稿しました。

4

1 に答える 1

2

ホストのulimit-nの値を確認してください。マシンのファイル記述子の制限に達している可能性があるようです。

ただし、一般的に、MapReduceジョブ中にドライバー接続を使用してMongoにドキュメントを保存することは、アンチパターンです。Mongoへの追加の接続を作成して帯域外でより多くのデータを書き込もうとするよりも、mapreduce出力で必要なデータを含むドキュメントを生成する方がよいでしょう。

于 2012-09-28T23:29:08.823 に答える