Почему MapReduce в CouchDB называется инкрементным?

Я читаю книгу O'Reilly CouchDB. Меня озадачивает раздел «уменьшить / повторно уменьшить / инкрементально-MapReduce» на странице 64. Слишком много осталось для риторики в книге О'Рейли с предложением

Если вы заинтересованы в продвижении функциональности постепенного сокращения CouchDB, взгляните на статью Google о Sawzall, ...

Если я правильно понимаю слово "инкрементальный", оно относится к некоторой операции сложения в структуре данных B-дерева. Я пока не могу понять, почему это что-то особенное по сравнению с обычным map-reduce, вероятно, еще не понимая этого. В CouchDB упоминается, что при использовании функции карты нет побочных эффектов - верно ли это и для сокращения?

Почему MapReduce в CouchDB называется «инкрементным»?

Вопросы помощника

  1. Объясните цитату об инкрементальном MapReduce с Sawzall.
  2. Почему два члена обозначают одно и то же, то есть сокращение? Уменьшить и снова уменьшить?

использованная литература

  1. Документ Google о Sawzall.
  2. Введение в представления CouchDB в вики-странице CouchDB и множество размытых ссылок в блогах.
  3. Книга CouchDB O'Reilly

person hhh    schedule 28.06.2012    source источник
comment
... Я еще не уверен, какова цель термина, но у меня есть некоторые смутные идеи, возможно, связанные с репликацией, структурой данных или логикой работы mapreduce - исследования.   -  person hhh    schedule 28.06.2012


Ответы (2)


Эта страница, на которую вы указали ссылку, объяснила это.

Представление (которое является всей точкой уменьшения карты в CouchDB) может быть обновлено путем повторной индексации только тех документов, которые изменились с момента последнего обновления индекса. Это инкрементная часть.

Этого можно достичь, требуя, чтобы функция сокращения была ссылочно прозрачной, что означает, что она всегда возвращает один и тот же вывод для заданного ввода.

Функция сокращения также должна быть коммутативной и ассоциативной для ввода значения массива, что означает, что если вы запустите редуктор на выходе того же редуктора, вы получите тот же результат. На этой вики-странице это выражается так:

f(Key, Values) == f(Key, [ f(Key, Values) ] )

Rereduce - это когда вы берете результат нескольких вызовов редуктора и снова запускаете его через редуктор. Иногда это требуется, потому что CouchDB отправляет данные через редуктор партиями, поэтому иногда не все ключи, которые необходимо сократить, будут отправлены за один раз.

person nickgroenke    schedule 28.06.2012

Просто чтобы немного добавить к тому, что сказал user1087981, функция сокращения является инкрементальной из-за того, как процесс сокращения выполняется CouchDB.

CouchDB использует B-Tree, которое он создает из функции представления, и, по сути, выполняет вычисления сокращения в группах значений. Вот очень простой макет B-дерева из O'Reilly Guide, показывающий листовые узлы для пример в разделе, который вы процитировали.

Уменьшить B-дерево

Итак, почему это происходит постепенно? Итак, окончательное сокращение выполняется только во время запроса, и все вычисления reduce сохраняются в индексе представления B-Tree. Итак, предположим, что вы добавляете в свою БД новое значение, которое является другим значением "fr". Вычисления для 1-го, 2-го и 4-го узлов выше не нужно повторять. Новое значение "fr" добавляется, и функция сокращения пересчитывается только для этого 3-го конечного узла.

Затем во время запроса выполняется окончательное (rereduce=true) вычисление для индексированных значений и возвращается окончательное значение. Вы можете видеть, что этот инкрементный характер сокращения позволяет время, необходимое для пересчета, относительно только добавляемых новых значений, а не размера существующего набора данных.

Отсутствие побочных эффектов - еще одна важная часть этого процесса. Если, например, ваши функции сокращения полагались на какое-то другое состояние, поддерживаемое при просмотре всех значений, тогда это могло бы работать для самого первого прогона, но затем, когда добавляется новое значение и выполняется расчет постепенного уменьшения, он не будет у него нет того же состояния, доступного для него - и поэтому он не сможет привести к правильному результату. Вот почему функции сокращения должны быть свободными от побочных эффектов или, как выразился пользователь 1087981, "ссылочно прозрачными"

person smathy    schedule 28.06.2012
comment
Извините, в чем разница между "reduce" и "rereduce"? Это одна и та же операция в разных местах, например, на листе или родительском элементе? - person hhh; 28.06.2012