我正在从MapReduce作业中的地图将文档插入MongoDB。一堆字符串被赋予地图,它为每个字符串生成SHA-1消息并将它们插入MongoDB。大约有4亿个字符串(从HDFS上的文件中读取)。我使用10个碎片与3个mongos,没有复制。我在64位linux上使用MongoDB 2.2.0。但是,此MR作业未完成,我在日志中看到以下两种类型的异常。
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用户列表中发布了这个问题,但想让更广泛的受众检查这个问题,所以请在此处重新发布。
答案 0 :(得分:2)
检查主机上ulimit -n的值。听起来你可能会在你的机器上达到文件描述符限制。
通常,在MapReduce作业期间使用驱动程序连接在Mongo中存储文档是一种反模式。你最好让mapreduce输出只生成包含你需要的数据的文档,而不是尝试创建与Mongo的额外连接并在带外写入更多数据。