0

我正在将文档从 MapReduce 作业中的地图插入 MongoDB。为映射提供了一堆字符串,它为每个字符串生成 SHA-1 消息并将它们插入到 MongoDB 中。大约有 4 亿个字符串(从 HDFS 上的文件中读取)。我正在使用 10 个分片和 3 个 mongos,并且没有复制。我在 64 位 Linux 上使用 MongoDB 2.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 个 map 任务在运行(在 hadoop 日志中注意到它)。

我四处寻找第一个错误/异常,有人提到必须增加 MongoDB 每个主机的连接数。我使用 MongoOptions 类将其从 10 增加到 20,并在初始化 Mongos 实例时提供。但这并没有解决问题——这是异常的原因吗?

我在 map() 的 configure() 方法中创建一个 Mongo 实例,并在 close() 中关闭它。有没有更好的方法来创建 Mongo 实例?

有人在使用 Hadoop + MongoDB 组合时遇到这些错误吗?在使用这种组合时,我还有什么需要注意的吗?

PS:我将此问题发布到 MongoDB 用户列表,但希望让更广泛的受众检查此问题,因此在此处重新发布。

4

1 回答 1

2

检查主机上 ulimit -n 的值。听起来您可能会达到计算机上的文件描述符限制。

但总的来说,在 MapReduce 作业期间使用驱动程序连接在 Mongo 中存储文档是一种反模式。最好让 mapreduce 输出只生成包含所需数据的文档,而不是尝试创建与 Mongo 的额外连接并在带外写入更多数据。

于 2012-09-28T23:29:08.823 回答