|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
ASCRUSAlexander RyndinА сейчас говоришь про сегментацию и мастера, и детайла по PK. P.S. Ну ты сравнил файловую помойку Hadoop и Vertica. У них же вообще абсолютно разные принципы хранения данных, зеркалирования и прочее. Они даже близко не похожи. Поэтому поведение Хадупа на Вертику генерировать не корректно. Так же как и например поведение Нетизы, которая по принципам хотя и ближе к Вертике, но так же отличий столько, что поведение совершенно разное (я уж молчу про ГринПлам). BTW интересно, есть ли у хваленой вертики что-то подобное: https://www.google.com/patents/US20110093499 или http://www.teradata.com/web-seminars/PayPal-Dealing-with-Natural-Data-Skew/ ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:39 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984, Алгоритмы будут зависеть от ситуации (статистики и подходящих проекций). Если измерение небольшое, то все измерение просто зеркалируется по нодам, если большое, то произойдет BROADCAST по частям, если на факте висит сортировка по FK, то вместо обьединения через хэш-таблицы (HASH JOIN) произойдет соединение путем объедения записей упорядоченных значений колонок (MERGE JOIN). Ситуацию, чтобы Вертика не смогла эффективно распределить между серверами соединение или агрегацию, уведя большой объем работ на инициализирующую ноду и заставив ее все собирать я видел пару раз в жизни и то это были запросы на соединение больших фактовых таблиц и больших измерений с количеством джойнов более полсотни. Но опять же, под такие большие запросы имеет смысл делать реоптимизацию структуры хранения данных. Например, никто не мешает сделать JOIN проекцию на факт+измерения, если этим измерения всегда цепляются INNER JOIN. В таком случае без разницы, как сегментируются измерения и факты, их джойн проекция будет лежать сразу в одном месте по нужным полям измерений с фактами и все это лежат рядом на серверах. Этакая материальная проекция, позволяющая дематериализовать нужные поля измерений в факты без затрат по кодированию и сопровождению. В ситуации с 30 миллионами клиентов конечно смысла возится с такой проекцией нет, но вот если их хотя бы миллионов 100, наверное имеет смысл уже подумать ее сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:40 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Alexander RyndinОчень простой и довольно распространенный кейс: есть табличка-измерение - 30 млн. клиентов, а также табличка фактов с операциями этих клиентов (для простоты пускай это будут звонки/смс). Допустим 20% звонков/смс сделаны с 2-10 служебных номеров (Яндекс-такси, Сбербанковский информатор и т.д.). Как тогда будешь пилить данные между узлами? Стандартное решение дня МРР: сегментировать и то и то по своим ключам. Получаем равномерное распределение данных, но проблему джойнов. В Вертике можно измерению сказать unsegmented all nodes, тогда оно расклонируется по всем нодам, 30 млн записей - фигня, физического места займут немного, лицензий вообще не потратится дополнительных, зато не будет поражняка в сети кластера и производительность вырастет. Плюс у Вертики всегда есть доп.проекции, которые и сегментируются, и сортируются по другим правилам нежели таблица (суперпроекция). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:47 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
ASCRUS, у нас конкретный пример от Александра: есть 30 МЛН клиентов, есть операции по ним. Среди этих 30 МЛН есть 5 клиентов, чьи операции занимают 20% от всей таблицы. Допустим у нас 100 параллельных процессов обработки, на которых хранятся данные. Если размазывать данные по клиентам, то на 5 из 100 серверов данных окажется больше в разы. То, что называется skew. Если таблица с операциями будет распределена по своему ключу, то проблема встанет всё равно, т.к. предположительно все равно в момент join будет распределение по ключу клиента. Как конкретно в вертике решена эта проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:50 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984ASCRUS, у нас конкретный пример от Александра: есть 30 МЛН клиентов, есть операции по ним. Среди этих 30 МЛН есть 5 клиентов, чьи операции занимают 20% от всей таблицы. Допустим у нас 100 параллельных процессов обработки, на которых хранятся данные. Если размазывать данные по клиентам, то на 5 из 100 серверов данных окажется больше в разы. То, что называется skew. Если таблица с операциями будет распределена по своему ключу, то проблема встанет всё равно, т.к. предположительно все равно в момент join будет распределение по ключу клиента. Как конкретно в вертике решена эта проблема? В предыдущем посте ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:52 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984, Гм, а я недостаточно подробно объяснил как ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:58 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Vovakaloki1984ASCRUS, у нас конкретный пример от Александра: есть 30 МЛН клиентов, есть операции по ним. Среди этих 30 МЛН есть 5 клиентов, чьи операции занимают 20% от всей таблицы. Допустим у нас 100 параллельных процессов обработки, на которых хранятся данные. Если размазывать данные по клиентам, то на 5 из 100 серверов данных окажется больше в разы. То, что называется skew. Если таблица с операциями будет распределена по своему ключу, то проблема встанет всё равно, т.к. предположительно все равно в момент join будет распределение по ключу клиента. Как конкретно в вертике решена эта проблема? В предыдущем посте ответ. Не увидел в момент написания поста. По сути это то же самое, что гонять по сети эти 30 млн в момент join, только снижается нагрузка на сеть, зато растёт объём хранимых данных в N=кол-во параллельных процессов. В принципе справедливо, чем-то надо жертвовать. А вообще пример довольно надуманный конечно. Оракл его везде приводит, т.к. только в этом случае может потягаться с MPP. Если кол-во таких клиентов с большим числом операций будет больше чем кол-во единиц параллелизма, то проблема вообще исчезнет. Или если есть возможность распределить данные по паре ключей, опять же проблемы не будет. Например если у сети магазинов есть гипермаркеты и магазины у дома, остатки можно сегментировать по паре магазин+товар и skew не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:02 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
ASCRUS, вы нет, vovaka да. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:03 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984, Я с этим сталкивался просто :) Не из книжек пример. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:06 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
VovakaAlexander RyndinОчень простой и довольно распространенный кейс: есть табличка-измерение - 30 млн. клиентов, а также табличка фактов с операциями этих клиентов (для простоты пускай это будут звонки/смс). Допустим 20% звонков/смс сделаны с 2-10 служебных номеров (Яндекс-такси, Сбербанковский информатор и т.д.). Как тогда будешь пилить данные между узлами? Стандартное решение дня МРР: сегментировать и то и то по своим ключам. Получаем равномерное распределение данных, но проблему джойнов. В Вертике можно измерению сказать unsegmented all nodes, тогда оно расклонируется по всем нодам, 30 млн записей - фигня, физического места займут немного, лицензий вообще не потратится дополнительных, зато не будет поражняка в сети кластера и производительность вырастет. Плюс у Вертики всегда есть доп.проекции, которые и сегментируются, и сортируются по другим правилам нежели таблица (суперпроекция).Если это измерение из 30 млн. записей раскопировать по всем нодам, то, мне кажется, и JOIN будет происходить несколько медленее. А потом, когда я еще чего нибудь захочу сгруппировать по столбцам, отличным от ключа секционирования, то начнется еще большее веселье. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:09 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984Vovakaпропущено... В предыдущем посте ответ. А вообще пример довольно надуманный конечно. Оракл его везде приводит, т.к. только в этом случае может потягаться с MPP. Если кол-во таких клиентов с большим числом операций будет больше чем кол-во единиц параллелизма, то проблема вообще исчезнет. Хэш алгоритмы, которые распределяют данные по нодам не столь умны, чтобы каждого такого клиента положить на свою ноду. Есть ненулевая вероятность, что при разбиении на секции они могут упасть на одну ноду. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:12 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Alexander Ryndinloki1984, Я с этим сталкивался просто :) Не из книжек пример. Абонентскую базу явно проще клонировать по нодам MPP. Винты сейчас большие и недорогие. У Facebook кластер Вертики 255 серверов и на каждом 15 х 4ТБ дисков, какой raid не знаю правда, но все равно сильно. Кстати, на пилот в FB кроме Вертики не вышел ни один из вендоров больше, к чему бы это? :) Пилот правда был на 1 ПТ, но что это за проблема для именитых вендоров? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:12 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Alexander RyndinЕсли это измерение из 30 млн. записей раскопировать по всем нодам, то, мне кажется, и JOIN будет происходить несколько медленее. Это почему это? Джойны будут локально на нодах происходить. Alexander RyndinА потом, когда я еще чего нибудь захочу сгруппировать по столбцам, отличным от ключа секционирования, то начнется еще большее веселье. Ну да, тут хуже. Но в Вертике можно сделать проекцию и под такой запрос и опять все полетит, но в жертву принесем физическое место. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:17 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
loki1984ASCRUS, у нас конкретный пример от Александра: есть 30 МЛН клиентов, есть операции по ним. Среди этих 30 МЛН есть 5 клиентов, чьи операции занимают 20% от всей таблицы. Допустим у нас 100 параллельных процессов обработки, на которых хранятся данные. Если размазывать данные по клиентам, то на 5 из 100 серверов данных окажется больше в разы. То, что называется skew. Если таблица с операциями будет распределена по своему ключу, то проблема встанет всё равно, т.к. предположительно все равно в момент join будет распределение по ключу клиента. Как конкретно в вертике решена эта проблема? Еще раз. Данные фактов не будут размазываться по клиентам. Это контрпродуктивно. Так же, как и по городам, полу и прочему :) Данные фактов будут сегментироваться по уникальному ключу, чаще всего это PK. Но помимо сегментации данные фактов будут на каждом сервере храниться в упорядоченном виде, если в сортировке хранения проекции указать Код Клиента. С учетом того, что Вертика колонориентированный сервер, каждой ноде кластера получить с фактов список ключей клиентов и попросить другие ноды дослать ей по этому списку нужные записи для соединения дело миллисекунд. Не нужно будет даже полную копию измерения собирать со всех нод и рассылать на все ноды. BROADCAST будет минимальным. Если же на сам запрос к фактам еще накладывается общий фильтр по другим полям, это вообще будет замечательно выглядеть - оптимизатор наложит фильтр, очертит круг нужных записей, с них получит на каждой ноде ид клиентов, соберет по спискам с других нод, далее в зависимости от запроса сверху каждая нода проведет дальнейшие действия (сортировка, агрегация, окна, ...). Если же соединений очень много и измерения большие, то проще всего даже не зеркалировать их по нодам, указав Вертике в явном виде, а просто сделать преджойн проекцию с денормализацией звезды (полей измерений в факт). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:21 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
VovakaAlexander RyndinЕсли это измерение из 30 млн. записей раскопировать по всем нодам, то, мне кажется, и JOIN будет происходить несколько медленее. Это почему это? Джойны будут локально на нодах происходить. Alexander RyndinА потом, когда я еще чего нибудь захочу сгруппировать по столбцам, отличным от ключа секционирования, то начнется еще большее веселье. Ну да, тут хуже. Но в Вертике можно сделать проекцию и под такой запрос и опять все полетит, но в жертву принесем физическое место. А проекция это что?? эдакое Materialized view? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 10:28 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
ASCRUSкаждой ноде кластера получить с фактов список ключей клиентов и попросить другие ноды дослать ей по этому списку нужные записи для соединения дело миллисекунд. Не нужно будет даже полную копию измерения собирать со всех нод и рассылать на все ноды. BROADCAST будет минимальным. Клевая фича. Броадкаст будет не фактов а измерения. Кстати гринплам так не умеет. Он даже и сортировку внутри нод не делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 10:41 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Ivan DurakА проекция это что?? эдакое Materialized view? Ну больше всего похоже на матвью, да. Это набор колонок таблицы (или нескольких для преджойн проекций), которые хранятся (дублируя данные в суперпроекции) по своим правилам сортировки и сегментирования. Оптимизатор выбирает наиболее подходящую проекцию для запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 11:26 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Ivan DurakASCRUSкаждой ноде кластера получить с фактов список ключей клиентов и попросить другие ноды дослать ей по этому списку нужные записи для соединения дело миллисекунд. Не нужно будет даже полную копию измерения собирать со всех нод и рассылать на все ноды. BROADCAST будет минимальным. Клевая фича. Броадкаст будет не фактов а измерения. Кстати гринплам так не умеет. Он даже и сортировку внутри нод не делает. Там еще один нюанс - Вертике можно же указать способ хранения для столбцов (encoding). Возвращаясь к тому примеру с 20% 5 клиентов от всей таблицы. В фактовой таблице делаем сортировку по полю account_id и назначаем ему ENCODING RLE. Теперь этот столбец будет хранится как КодКлиента:КоличествоИдущихПодрядЗаписей. При чтении контейнеров для запроса Вертика изначально уже не будет просматривать значения колонки клиента по всем записям таблицы, которые легли в этот блок, там будет ровно столько записей на эту колонку, сколько уникальных значений во всех записях этого контейнера кода клиента там присутствует. То есть моментально, вне зависимости от размера контейнера (они по мере ухода в историчность еще и укрупняются, дефрагментируясь). В этом плане кодирование хранения великая штука. Например у нас есть большой символьный код группы, групп ограниченное число, поиск по нему идет, но сортировка не выгодна по каким то причинам. Делаем ENCODING BLOCK_DICT и Вертика в контейнерах вместо самих кодов хранит значения счетчика, а все коды, используемые в записях хранимого контейнера записывает как словарик в начало контейнера кодируя внутренним счетчиком. Теперь при работе с таким кодом группы достаточно просто считать заголовок контейнера и сразу увидеть все значения, которые присутствуют в этом контейнере по этому полю. Так как записей в одном контейенере на таблицу могут быть миллионы, очень экономичный способ поиска информации без дополнительных на хранение или процессорное время, как это происходит при алгоритмах индексации данных, упорядоченного хранения и т.д. Ну а если учесть, что на каждый хранимый контейнер в заголовок пишется его статистика по полям, то вообще быстрый поиск информации без полного просмотра данных на хороших скоростях шуршит. В Нетизе помнится тоже статистика по блокам хранения данных хранится, но в отличие от Вертики у них блоки фиксированной длины, на больших объемах их много просматривать приходится, у Вертики в этом плане склонность к автоматическому укрупнению хранения данных по мере их устаревания мне кажется правильно сделано. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2014, 13:32 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
а это как раз уже все умеют ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2014, 13:47 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Ivan DurakКлевая фича. Броадкаст будет не фактов а измерения. Кстати гринплам так не умеет. Он даже и сортировку внутри нод не делает. Вы хотите сказать что greenplum, сортировку делает только на мастер-ноде? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2014, 18:13 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
SQLMantisIvan DurakКлевая фича. Броадкаст будет не фактов а измерения. Кстати гринплам так не умеет. Он даже и сортировку внутри нод не делает. Вы хотите сказать что greenplum, сортировку делает только на мастер-ноде? нет, сортировку он делает на всех нодах паралельно. Но он НЕ ХРАНИТ данные отсортированными (так как я понял делает Вертика и Террадата) !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2014, 13:45 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
Ivan DurakSQLMantisпропущено... Вы хотите сказать что greenplum, сортировку делает только на мастер-ноде? нет, сортировку он делает на всех нодах паралельно. Но он НЕ ХРАНИТ данные отсортированными (так как я понял делает Вертика и Террадата) !!! проекция (поправте меня если я не прав) - это еще одна копия данных на ноде, которая отсортирована в порядке указанном при ее создании. Чем это отличается от индекса? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2014, 15:57 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
SQLMantisIvan Durakпропущено... нет, сортировку он делает на всех нодах паралельно. Но он НЕ ХРАНИТ данные отсортированными (так как я понял делает Вертика и Террадата) !!! проекция (поправте меня если я не прав) - это еще одна копия данных на ноде, которая отсортирована в порядке указанном при ее создании. Чем это отличается от индекса? Это вообще про какую субд вопрос??? В гринпламе никаких проекций нет ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2014, 20:55 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
SQLMantisпроекция (поправте меня если я не прав) - это еще одна копия данных на ноде, которая отсортирована в порядке указанном при ее создании. Чем это отличается от индекса? Да, так. При создании таблицы в Вертике создается суперпроекция со всеми колонками, сортированная, сегментированная, партиционированная по заданным правилам. Создание доп. проекций означает новую физическую копию части колонок таблицы (или колонок разных таблиц в преджойн проекциях) со своими правилами физического хранения (сортировка, сегментирование). Оптимизатор выберет наиболее подходящую. Больше всего это похоже на матвью. Индексы с успехом заменяют сортировка и формат кодирования хранения данных. Есть еще группировка колонок, когда можно указать набор колонок, которые физически будут храниться вместе. А-ля row storage внутри колоночного :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2014, 22:37 |
|
Украина - вперёд с Vertica!
|
|||
---|---|---|---|
#18+
VovakaДа, так. При создании таблицы в Вертике создается суперпроекция со всеми колонками, сортированная, сегментированная, партиционированная по заданным правилам. Создание доп. проекций означает новую физическую копию части колонок таблицы (или колонок разных таблиц в преджойн проекциях) со своими правилами физического хранения (сортировка, сегментирование). Оптимизатор выберет наиболее подходящую. Больше всего это похоже на матвью. Индексы с успехом заменяют сортировка и формат кодирования хранения данных. Есть еще группировка колонок, когда можно указать набор колонок, которые физически будут храниться вместе. А-ля row storage внутри колоночного :) Спасибо, большое. Стало интересно и я вчера почитал документацию. Действительно интересная возможность. А почему слияние только inner? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2014, 10:13 |
|
|
start [/forum/topic.php?fid=35&msg=38635748&tid=1552371]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
182ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 310ms |
0 / 0 |