Совокупный запрос mongodb Ограничение 64 МБ

У меня есть таблица с более чем миллиардом объектов, как показано ниже:

{
    "_id" : ObjectId("5893ae4f7a5449caebba5848"),
    "id" : NumberLong(1234567890),
    "inserted_at" : ISODate("2017-02-02T22:10:23.812Z")
}

Сохранено на mongodb 3.2.11.

Каждую неделю я вставляю почти 50 миллионов новых записей, и мне нужно сравнить записи новой недели с записями предыдущей недели.

Поэтому я построил такой запрос:

db.getCollection('table').aggregate(
   [
        {"$group" : {
            "_id": {
                "year": { "$year": "$inserted_at"},
                "week": { "$week": "$inserted_at"}},
            "Content_IDs": { "$push": "$id"}}},
        { "$sort": {'_id.year': -1, '_id.week': -1}},
        { "$limit": 2},



        { "$group": {
             "_id": null,
             "Last": { $first: "$Content_IDs" },
             "Previous": { $last: "$Content_IDs"}
        }},

        { $project: {
            "Outgoing": { $setDifference: [ "$Previous", "$Last" ] },
            "Incoming": { $setDifference: [ "$Last", "$Previous" ] }}},
   ],
   {allowDiskUse:true}
)

Однако mongodb не может вычислить результат из-за размера данных.

Ошибка следующая:

assert: команда не выполнена: { "ok" : 0, "errmsg" : "BufBuilder попытался увеличить () размер до 134217728 байт, превысив ограничение в 64 МБ.", "code" : 13548 }

Я попытался извлечь все записи в среду Python, чтобы вычислить там результат, но получил ту же ошибку при запуске следующего конвейера на pymongo.aggregate:

[
            {"$group" : {
                "_id": {
                    "year": { "$year": "$inserted_at"},
                    "week": { "$week": "$inserted_at"}},
                "Content_IDs": { "$push": "$id"}}},
            { "$sort": SON([('_id.year', -1), ('_id.week', -1)])},
            { "$limit": 2}
        ]

Он работает с меньшим масштабом данных. Как сделать этот запрос более масштабируемым? Какие-либо предложения?

Огромное спасибо!


person user2386488    schedule 15.02.2017    source источник


Ответы (1)


Я столкнулся с аналогичной проблемой, и я начал использовать Spark (и Scala) для управления своими данными. Ограничений по памяти не так много, можно использовать в кластере, и это быстрее, чем nodejs.

person Israel Zinc    schedule 16.02.2017
comment
Думаю, мне нужно некоторое разъяснение по этому поводу. У меня нет опыта ни в Spark, ни в Scala. Вы предлагаете использовать -Spark, т.е.- вместе с MongoDB через MongoDB Connector для Spark? В этом случае, может ли MongoDB предоставить такой большой объем данных Spark для обработки, в то время как он не может предоставить Python? Спасибо - person user2386488; 16.02.2017
comment
Эй, у Spark есть коннектор как для Scala, так и для Python, и, по-видимому, оба работают нормально. Я просто чувствую, что автономный mongodb не может справиться с работой. Spark будет распространять данные и делать некоторые трюки для выполнения вашего анализа. Но, пожалуйста, имейте в виду, что я новичок в этом, поэтому я могу говорить кучу чуши. - person Israel Zinc; 16.02.2017