Як запит до величезної бази даних повертається з незначною затримкою?


12

Наприклад, шукаючи щось у Google, результати повертаються майже миттєво.

Я розумію, що Google сортує та індексує сторінки з алгоритмами і т. Д., Але я вважаю це нездійсненним для індексації результатів кожного можливого запиту (а результати персоналізовані, що робить це ще більш нездійсненним)?

Крім того, хіба не буде затримка апаратного забезпечення в апараті Google величезною? Навіть якщо всі дані в Google зберігалися на TB / s SSD, я вважаю, що затримка апаратних засобів є величезною, враховуючи велику кількість даних для обробки.

Чи допомагає MapReduce вирішити цю проблему?

EDIT: Гаразд, тому я розумію, що популярні пошукові запити можуть зберігатися в пам'яті. А як же непопулярні пошуки? Навіть для самого незрозумілого пошуку, який я проводив, я не думаю, що пошук ніколи не був більшим за 5 секунд. Як це можливо?

Відповіді:


13

Ну, я не впевнений, чи вирішує проблему саме MapReduce, але, безумовно, не було б MapReduce самостійно вирішити всі ці питання, які ви порушили. Але ось важливі речі , які слід брати до уваги, і що робить його можливим , щоб мати таку низьку затримку на запити всіх цих терабайт даних в різних машинах:

  1. розподілене обчислення: поширення не означає, що індекси просто розподіляються на різних машинах, вони фактично реплікуються вздовж різних кластерів, що дозволяє багатьом користувачам виконувати різні запити з низьким часом пошуку (так, величезні компанії можуть дозволити собі стільки машин);
  2. кешування: кеші значно скорочують час виконання, будь то для кроку сканування, для пошуку сторінок або для ранжирування та виставлення результатів;
  3. багато налаштувань: всі вищезазначені та дуже ефективні алгоритми / рішення можуть бути ефективними лише в тому випадку, якщо реалізація також є ефективною. Існує багато оптимізацій (жорстко закодованих), таких як місцевість довідки, стиснення, кешування; всі вони, як правило, підходять до різних частин обробки.

Враховуючи це, давайте спробуємо вирішити ваші питання:

але я вважаю, що результати кожного можливого запиту неможливо індексувати

Так, було б і насправді неможливо мати результати для кожного можливого запиту . У світі існує нескінченна кількість термінів (навіть якщо ви припускаєте, що будуть введені лише правильно написані терміни), і існує експоненціальна кількість запитів із цих n -> infтермінів ( 2^n). Отже, що робиться? Кешування. Але якщо є так багато запитів / результатів, які кешувати? Політика кешування. Найчастіші / популярні / актуальні для користувача запити - це кешовані.

Хіба затримка в апаратному забезпеченні Google не була б величезною? Навіть якщо всі дані в Google були збережені в TB / s SSD

У наші дні з такими високорозвиненими процесорами люди схильні думати, що кожне можливе завдання, яке повинно закінчитися протягом секунди (або менше), і яке стосується стільки даних, повинно оброблятися надзвичайно потужними процесорами з декількома ядрами і великою кількістю пам'яті. Однак одне, що керує ринком, - це гроші, і інвестори не зацікавлені в тому, щоб їх витрачати. Отже, що робиться?

Перевагою є власне багато машин, кожна з яких використовує прості / доступні (з точки зору вартості) процесори, що знижує ціну на створення безлічі кластерів. І так, це працює. Основне вузьке місце завжди зводиться на диск, якщо враховувати прості вимірювання продуктивності . Але як тільки таких машин дуже багато, можна дозволити собі завантажувати речі до основної пам'яті, а не працювати на жорстких дисках.

Карти пам’яті дорогі нам, просто людським істотам, але вони дуже дешеві для підприємств, які купують багато таких карток відразу. Оскільки це не дорого, наявність великої кількості пам'яті, необхідної для завантаження індексів та збереження кеш-пам’яті, не є проблемою. А оскільки машин дуже багато, немає необхідності в надшвидких процесорах, оскільки ви можете направляти запити в різні місця та мати кластери машин, відповідальних за відвідування конкретних географічних регіонів , що дозволяє більш спеціалізоване кешування даних та ще кращу відповідь разів.

Чи допомагає MapReduce вирішити цю проблему?

Хоча я не думаю, що використання або не MapReduce є обмеженою інформацією всередині Google, я не розбираюся з цього приводу. Однак реалізація MapReduce від Google (яка, безумовно, не Hadoop) повинна мати багато оптимізацій, багато з яких стосуються аспектів, обговорених вище. Так, архітектура MapReduce, ймовірно, допомагає керувати тим, як обчислення фізично розподіляються, але є багато інших пунктів, які слід враховувати, щоб виправдати таку швидкість у часі запитів.

Гаразд, тому я розумію, що популярні пошукові запити можуть зберігатися в пам'яті. А як же непопулярні пошуки?

На графіку нижче представлена ​​крива того, як відбуваються види запитів. Ви можете бачити, що існує три основних види пошуку, кожен з яких займає приблизно 1/3 обсягу запитів (область нижче кривої). Сюжет показує закон про владу та підкреслює той факт, що найменші запити є найпопулярнішими. Другу третину запитів все ще можливо обробити, оскільки вони містять мало слів. Але набір так званих незрозумілих запитів , які зазвичай складаються із запитів не досвідчених користувачів, не є незначною частиною запитів.

Розповсюджений важкий хвіст

І там є простір для нових рішень. Оскільки це не лише один чи два запити (але третина з них), вони повинні мати відповідні результати. Якщо ви наберете в чому - то занадто затінювати в пошуку Google, воно не повинно зайняти більше часу , щоб повернути список результатів, але, швидше за все , показати вам дещо - що виведений ви хочете сказати. Або може просто сказати, що не було жодного документа з такими термінами - або навіть скоротити ваш пошук до 32 слів (що зі мною щойно трапилось у випадковому тесті).

Є десятки застосовної евристики, які можуть бути або ігнорувати деякі слова, або намагатися розбити запит на більш дрібні, і зібрати найпопулярніші результати. І всі ці рішення можуть бути налаштовані та налаштовані на дотримання можливих час очікування , скажімо, менше секунди? : D


Я відредагував питання, щоб додати ще один запит.
resgh

@namehere я намагався звернутися до вашої редакції; сподіваємось, це допоможе відповісти на питання.
Рубенс

10

MapReduce не має нічого спільного з реальним часом. Це пакетно-орієнтована система обробки, яка підходить для деяких офлайн-завдань, таких як ETL та створення індексу. Зараз Google перейшов з MapReduce для більшості робочих місць, і навіть екосистема Hadoop робить те ж саме.

Відповідь на низьку затримку, як правило, зберігає попередньо обчислені показники в пам'яті. Все, що торкається диска, важко зробити швидким та масштабним. Ось як, наприклад, SQL-двигуни нового типу Hadoop, такі як Impala, отримують таку швидкість порівняно з інфраструктурою на основі MapReduce, як Hive .

Пошукова інфраструктура не може кешувати результати кожного запиту. Але він впевнено може кешувати проміжні результати, або, більш повні результати для найкращих запитів. Трохи кешуючи, ви можете обслуговувати результати для значної меншості всіх запитів.

Пошук також розділений між серверами. Таким чином, одна машина може делегувати до 100, щоб кожен отримав частину результату, а потім об'єднав їх.

Ви також можете піти з деяким ступенем наближення. Google буквально не формує тисячу сторінок результатів пошуку; він просто повинен отримати першу сторінку про право.

Майте на увазі, що Google має мільйони комп’ютерів по всьому світу. Ваші запити надходять у центр обробки даних, розташований поблизу вас, і він обслуговує лише вашу географію. Це виключає більшу частину затримок, що є мережею та не обробляє час у центрі обробки даних.


Спочатку я редагував питання, щоб додати ще один запит. Також: Я думаю, що навіть якщо попередньо обчислюється значна меншість, решта запиту все ще потребує тривалого часу. Крім того, коли процес делеговано з однієї машини на 100 машин, чи не збільшується фактично затримка (мережева затримка між машинами, а загальна затримка є максимальною затримкою всіх машин)?
resgh

Я маю на увазі, що відповідь на запит "спагетті алмаз", який є дивним рідкісним запитом, може бути прискорений за попередньо обчисленими результатами для "спагетті" та "алмазу" окремо. Внутрішньо-постійні з'єднання дуже швидкі та з низькою затримкою. Додатковий скачок або два всередині - це ніщо в порівнянні з ~ 20 стрибками між вашим комп'ютером та постійним струмом. Домінуюча проблема в розподілі праці - проблема бродячого; вам доведеться скинути результати з якогось підмножини, якщо вони не вчасно відреагують. Це все грубі узагальнення, але вказують у правильному напрямку.
Шон Оуен

4

MapReduce не використовується для пошуку. Він був використаний дуже давно для побудови індексу; але це структура пакетної обробки, і більшість веб-сайтів не змінюється весь час, тому новіші архітектури все поступово замість пакетної орієнтації.

Пошук в Google багато в чому працюватиме так само, як і в Lucene та Elastic Search, за винятком багатьох тонких налаштувань додаткової ваги та оптимізацій. Але в самому серці вони будуть використовувати якусь форму перевернутого покажчика . Іншими словами, вони не шукають кілька терабайт під час введення пошукового запиту (навіть коли він не кешований). Вони, ймовірно, взагалі не дивляться на фактичні документи. Але вони використовують таблицю пошуку, в якій перераховуються документи, які відповідають вашому терміну запиту (із попередньою обробкою, написанням помилок, синонімами тощо). Вони, ймовірно, отримують список найпопулярніших 10000 документів на кожне слово (10 к цілих чисел - всього кілька кб!) Та обчислюють найкращі відповідники з цього. Тільки якщо в цих списках немає хороших збігів, вони розширюються до наступних таких блоків тощо.

Запити до загальних слів можна легко кешувати; і за допомогою попередньої обробки ви можете скласти список найпопулярніших результатів 10k, а потім перезапустити їх відповідно до профілю користувача. Нічого не можна отримати і шляхом обчислення "точної" відповіді. Перегляд найкращих результатів 10k, ймовірно, досить; немає правильної відповіді; і якщо кращий результат десь у положенні 10001 буде пропущений, ніхто не дізнається і не помітить (або піклується). Ймовірно, він вже був класифікований в попередній обробці і не ввійшов би в топ-10, який представлений користувачеві в кінці (або в топ-3, користувач насправді дивиться)

З іншого боку, рідкісні терміни теж не викликають труднощів - один із списків містить лише декілька відповідних документів, і ви можете негайно відмовитись від усіх інших.

Рекомендую прочитати цю статтю:

Анатомія великої масштабної гіпертекстуальної веб-пошукової системи
Сергія Бріна та Лоуренса Сторінки
Кафедра комп'ютерних наук, Стенфордський університет, Стенфорд, Каліфорнія 94305
http://infolab.stanford.edu/~backrub/google.html

І так, це засновники Google, які це написали. Це не остання держава, але вона вже працюватиме в досить великих масштабах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.