Updating documentation [#METR-21710].

This commit is contained in:
Alexey Milovidov 2016-06-14 21:32:07 +03:00
parent 21b0167125
commit 6188c018e5
3 changed files with 135 additions and 29 deletions

View File

@ -389,7 +389,7 @@ inline void writeProbablyBackQuotedString(const String & s, WriteBuffer & buf)
/** Выводит строку в для формата CSV.
* Правила:
* - строка выводится в кавычках;
* - кавычка внутри строки выводится как двойная кавычка.
* - кавычка внутри строки выводится как две кавычки подряд.
*/
template <char quote = '"'>
void writeCSVString(const char * begin, const char * end, WriteBuffer & buf)

View File

@ -36,13 +36,14 @@ body
h1
{
font-family: 'Yandex Sans Display Web', Arial, sans-serif;
margin: 0;
}
h2
{
font-family: 'Yandex Sans Display Web', Arial, sans-serif;
margin-top: 30px;
margin-bottom: 10px;
}
h3
@ -53,7 +54,6 @@ h3
p
{
line-height: 20px;
white-space: pre-wrap;
}
@ -180,8 +180,8 @@ a:hover
.head-anchor
{
float: right;
color: #aaa;
margin-top: 10px;
}
.head-anchor:hover

View File

@ -101,7 +101,6 @@ ClickHouse - столбцовая СУБД для OLAP (Columnar DBMS).
В обычной, "строковой" СУБД, данные хранятся в таком порядке:
%%
5123456789123456789 1 Евробаскет - Греция - Босния и Герцеговина - example.com 1 2011-09-01 01:03:02 6274717 1294101174 11409 612345678912345678 0 33 6 http://www.example.com/basketball/team/123/match/456789.html http://www.example.com/basketball/team/123/match/987654.html 0 1366 768 32 10 3183 0 0 13 0\0 1 1 0 0 2011142 -1 0 0 01321 613 660 2011-09-01 08:01:17 0 0 0 0 utf-8 1466 0 0 0 5678901234567890123 277789954 0 0 0 0 0
5234985259563631958 0 Консалтинг, налогообложение, бухгалтерский учет, право 1 2011-09-01 01:03:02 6320881 2111222333 213 6458937489576391093 0 3 2 http://www.example.ru/ 0 800 600 16 10 2 153.1 0 0 10 63 1 1 0 0 2111678 000 0 588 368 240 2011-09-01 01:03:17 4 0 60310 0 windows-1251 1466 0 000 778899001 0 0 0 0 0
@ -126,7 +125,6 @@ ClickHouse - столбцовая СУБД для OLAP (Columnar DBMS).
То есть, значения из разных столбцов хранятся отдельно, а данные одного столбца - вместе.
Примеры столбцовых СУБД: Vertica, Paraccel (Actian Matrix) (Amazon Redshift), Sybase IQ, Exasol, Infobright, InfiniDB, MonetDB (VectorWise) (Actian Vector), LucidDB, SAP HANA, Google Dremel, Google PowerDrill, Metamarkets Druid, kdb+ и т. п.
Разный порядок хранения данных лучше подходит для разных сценариев работы.
Сценарий работы с данными - это то, какие производятся запросы, как часто и в каком соотношении; сколько читается данных на запросы каждого вида - строк, столбцов, байт; как соотносятся чтения и обновления данных; какой рабочий размер данных и насколько локально он используется; используются ли транзакции и с какой изолированностью; какие требования к дублированию данных и логической целостности; требования к задержкам на выполнение и пропускной способности запросов каждого вида и т. п.
@ -2414,27 +2412,6 @@ calcs - имя кластера в конфигурационном файле
Кластеры задаются следующим образом:
%%
&lt;!-- Группы удалённых серверов, которые могут быть подключены в таблицах типа Distributed. --&gt;
&lt;remote_servers&gt;
&lt;test&gt;
&lt;node&gt;
&lt;host&gt;example01-01-1&lt;/host&gt;
&lt;port&gt;9000&lt;/port&gt;
&lt;weight&gt;1&lt;/weight&gt; &lt;!-- Не обязательно. Вес шарда при записи данных. По умолчанию, 1.--&gt;
&lt;/node&gt;
&lt;node&gt;
&lt;host&gt;example01-01-2&lt;/host&gt;
&lt;port&gt;9001&lt;/port&gt;
&lt;/node&gt;
&lt;/test&gt;
&lt;/remote_servers&gt;
%%
Здесь задан кластер с именем test, состоящий из двух серверов (шардов).
Также возможно задать кластер, состоящий из шардов и реплик:
%%
&lt;remote_servers&gt;
&lt;logs&gt;
@ -2490,7 +2467,7 @@ calcs - имя кластера в конфигурационном файле
Для просмотра имеющихся кластеров, вы можете использовать системную таблицу system.clusters.
Движок Distributed позволяет работать с кластером, как с локальным сервером. При этом, кластер является неэластичным: вы должны прописать его конфигурацию в конфигурационный файл сервера (лучше всех серверов кластера), система сама не переносит данные между серверами.
Движок Distributed позволяет работать с кластером, как с локальным сервером. При этом, кластер является неэластичным: вы должны прописать его конфигурацию в конфигурационный файл сервера (лучше всех серверов кластера).
Не поддерживаются Distributed таблицы, смотрящие на другие Distributed таблицы (за исключением случаев, когда у Distributed таблицы всего один шард). Вместо этого, сделайте так, чтобы Distributed таблица смотрела на "конечные" таблицы.
@ -2519,7 +2496,7 @@ calcs - имя кластера в конфигурационном файле
Простой остаток от деления является довольно ограниченным решением для шардирования и подходит не для всех случаев. Он подходит для среднего и большого объёма данных (десятки серверов), но не для очень больших объёмов данных (сотни серверов и больше). В последнем случае, лучше использовать схему шардирования, продиктованную требованиями предметной области, и не использовать возможность записи в Distributed таблицы.
Ещё раз отметим, что Distributed таблица не умеет автоматически перешардировать данные. Во многих случаях можно обойтись без этого. Запросы SELECT отправляются на все шарды, и работают независимо от того, каким образом данные распределены по шардам (они могут быть распределены полностью случайно). При добавлении нового шарда, можно не переносить на него старые данные, а записывать новые данные с большим весом - данные будут распределены слегка неравномерно, но запросы будут работать корректно и достаточно эффективно.
В случае использования реплицированных таблиц, есть возможность перешардировать данные - смотрите раздел "Перешардирование". Но во многих случаях лучше обойтись без этого. Запросы SELECT отправляются на все шарды, и работают независимо от того, каким образом данные распределены по шардам (они могут быть распределены полностью случайно). При добавлении нового шарда, можно не переносить на него старые данные, а записывать новые данные с большим весом - данные будут распределены слегка неравномерно, но запросы будут работать корректно и достаточно эффективно.
Беспокоиться о схеме шардирования имеет смысл в следующих случаях:
- используются запросы, требующие соединение данных (IN, JOIN) по определённому ключу - тогда если данные шардированы по этому ключу, то можно использовать локальные IN, JOIN вместо GLOBAL IN, GLOBAL JOIN, что кардинально более эффективно.
@ -3016,6 +2993,85 @@ min_bytes, max_bytes - условие на количество байт в бу
Если вы продолбали ZooKeeper, то вы можете сохранить данные, переместив их в нереплицируемую таблицу, как описано в пункте выше.
==Перешардирование==
%%ALTER TABLE t RESHARD [COPY] [PARTITION partition] TO описание кластера USING ключ шардирования%%
Запрос работает только для Replicated-таблиц и для Distributed-таблиц, смотрящих на Replicated-таблицы.
При выполнении, запрос сначала проверяет корректность запроса, наличие свободного места на серверах и кладёт в ZooKeeper по некоторому пути задачу, которую нужно сделать. Дальнейшее выполнение делается асинхронно.
Для того, чтобы использовать перешардирование, в конфигурационном файле каждого сервера должен быть указан путь в ZooKeeper к очереди задач:
%%
&lt;resharding&gt;
&lt;task_queue_path&gt;/clickhouse/task_queue&lt;/task_queue_path&gt;
&lt;/resharding&gt;
%%
При выполнении запроса %%ALTER TABLE t RESHARD%%, узел в ZooKeeper создаётся, если его не было.
Описание кластера - список шардов с весами, на которые нужно перераспределить указанные данные.
Шард указывается в виде адреса таблицы в ZooKeeper. Например, %%/clickhouse/tables/01-03/hits%%
Относительный вес шарда (не обязательно, по-умолчнию, 1) может быть указан после ключевого слова %%WEIGHT%%.
Пример:
%%
ALTER TABLE merge.hits
RESHARD PARTITION 201501
TO
/clickhouse/tables/01-01/hits WEIGHT 1,
/clickhouse/tables/01-02/hits WEIGHT 2,
/clickhouse/tables/01-03/hits WEIGHT 1,
/clickhouse/tables/01-04/hits WEIGHT 1
USING UserID
%%
Ключ шардирования (в примере: %%UserID%%) имеет такой же смысл, как для Distributed таблиц. Вы можете указать %%rand()%% в качестве ключа шардирования для случайного перераспределения данных.
При выполнении запроса, сразу проверяется:
- совпадение структур таблиц локально и на всех указанных шардах.
- наличие на локальном сервере свободного места в количестве, равном размеру партиции в байтах, с запасом в 10%.
- наличие на всех репликах всех указанных шардов, кроме являющейся локальной, если такая есть, свободного места в количестве равном размеру партиции, домноженном на отношение веса шарда к суммарному весу, с запасом в 10%.
Далее, асинхронное выполнение задачи состоит из следующих шагов:
1. Нарезка партиции на кусочки на локальном сервере.
Для этого делается слияние всех кусков, входящих в партицию и, одновременно, разбиение их на несколько, согласно ключу шардирования.
Результат складывается в директорию /reshard в директории с данными таблицы.
Исходные куски никак не модифицируются и весь процесс не влияет на рабочие данные таблицы.
2. Копирование всех кусков на удалённые серверы (на каждую реплику соответствующих шардов).
3. Выполнение запроса %%ALTER TABLE t DROP PARTITION%% на локальном сервере, выполнение запросов %%ALTER TABLE t ATTACH PARTITION%% на всех шардах.
Замечание: это делается неатомарно. Есть момент времени, в течение которого пользователь может увидеть отсутствие данных партиции.
В случае указания в запросе слова %%COPY%%, исходные данные не удаляются. Это подходит для копирования данных с одного кластера на другой с одновременным изменением схемы шардирования.
4. Удаление временных данных с локального сервера.
При наличии нескольких запросов на перешардирование, соответствующие задачи будут делаться последовательно.
Указанный выше запрос предназначен для того, чтобы перешардировать одну партицию.
Если не указать партицию в запросе, то в задачи на перешардирование будут добавлены все партиции. Пример:
%%
ALTER TABLE merge.hits
RESHARD
TO ...
%%
В этом случае, последовательно вставляются задачи на перешардирование каждой партиции.
В случае перешардирования Distributed-таблицы, производится перешардирование каждого шарда (соответствующий запрос отправляется на каждый шард).
Вы можете перешардировать Distributed-таблицу как в саму себя, так и в другую таблицу.
Перешардирование предназначено для перераспределения "старых" данных: в случае, если во время работы, перешардируемая партиция была изменена, то перешардирование этой партиции отменяется.
На каждом сервере, перешардирование осуществляется в один поток, чтобы в процессе длительных операций перешардирования, не мешать другим задачам.
По состоянию на июнь 2016, перешардирование находится в состоянии "бета": тестировалось лишь на небольшом объёме данных - до 5 ТБ.
</div>
<div class="island">
@ -3581,6 +3637,22 @@ world%%
Формат подходит только для записи, но не для чтения.
==CSV==
Формат comma separated values (<a href="https://tools.ietf.org/html/rfc4180">RFC</a>).
При записи, строки выводятся в двойных кавычках. Двойная кавычка внутри строки выводится как две двойные кавычки подряд. Других правил экранирования нет. Даты и даты-с-временем выводятся в двойных кавычках. Числа выводятся без кавычек. Значения разделяются запятыми. Строки разделяются unix переводом строки (LF). Массивы сериализуются в CSV следующим образом: сначла массив сериализуется в строку, как в формате TabSeparated, а затем полученная строка выводится в CSV в двойных кавычках. Кортежи в формате CSV сериализуются, как отдельные столбцы (то есть, теряется их вложенность в кортеж).
При чтении, все значения могут парситься как в кавычках, так и без кавычек. Поддерживаются как двойные так и одинарные кавычки. В том числе, строки могут быть расположены без кавычек - тогда они парсятся до запятой или перевода строки (CR или LF). В нарушение RFC, в случае парсинга строк не в кавычках, начальные и конечные пробелы и табы игнорируются. В качестве перевода строки, поддерживаются как Unix (LF), так и Windows (CR LF) и Mac OS Classic (LF CR) варианты.
Формат CSV поддерживает вывод totals и extremes аналогично TabSeparated.
==CSVWithNames==
Выводит также заголовок, аналогично TabSeparatedWithNames.
==RowBinary==
Пишет данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей.
@ -3796,6 +3868,13 @@ JSON совместим с JavaScript. Для этого, дополнитель
%%
==JSONEachRow==
Выводит данные в виде отдельных JSON объектов для каждой строки.
==Null==
Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности.
@ -3866,6 +3945,33 @@ JSON совместим с JavaScript. Для этого, дополнитель
То есть, при работе с датой в виде текста (например, при сохранении текстовых дампов), следует иметь ввиду о проблемах с неоднозначностью во время перевода стрелок назад, и о проблемах с соответствием данных, при смене часового пояса.
==Enum==
Enum8 или Enum16. Представляет собой конечное множество строковых значений, сохраняемых более эффективно, чем это делает тип данных %%String%%. Пример:
%%Enum8('hello' = 1, 'world' = 2)%%
- тип данных с двумя возможными значениями - 'hello' и 'world'.
Для каждого из значений прописывается число в диапазоне -128..127 для %%Enum8%% или в диапазоне -32768..32767 для %%Enum16%%. Все строки должны быть разными, числа - тоже. Разрешена пустая строка. При указании такого типа (в определении таблицы), числа могут идти не подряд и в произвольном порядке. При этом, порядок не имеет значения.
В оперативке столбец такого типа представлен так же, как %%Int8%% или %%Int16%% соответствующими числовыми значениями.
При чтении в текстовом виде, парсит значение как строку и ищет соответствующую строку из множества значений Enum-а. Если не находит - кидается исключение.
При записи в текстовом виде, записывает значение как соответствующую строку. Если в данных столбца есть мусор - числа не из допустимого множества, то кидается исключение. При чтении и записи в бинарном виде, оно осуществляется так же, как для типов данных %%Int8%%, %%Int16%%.
Неявное значение по-умолчанию - это значение с минимальным номером.
При %%ORDER BY%%, %%GROUP BY%%, %%IN%%, %%DISTINCT%% и т. п., Enum-ы ведут себя так же, как соответствующие числа. Например, при %%ORDER BY%% они сортируются по числовым значениям. Функции сравнения на равенство и сравнения на отношение порядка двух Enum-ов работают с Enum-ами так же, как с числами.
Сравнивать Enum с числом нельзя. Можно сравнивать Enum с константной строкой - при этом, для строки ищется соответствующее значение Enum-а; если не находится - кидается исключение. Поддерживается оператор IN, где слева стоит Enum, а справа - множество строк. В этом случае, строки рассматриваются как значения соответствующего Enum-а.
Большинство операций с числами и со строками не имеет смысла и не работают для Enum-ов: например, к Enum-у нельзя прибавить число.
Для Enum-а естественным образом определяется функция %%toString%%, которая возвращает его строковое значение.
Также для Enum-а определяются функции %%to<i>T</i>%%, где <i>T</i> - числовой тип. При совпадении T с типом столбца Enum-а, преобразование работает бесплатно.
При ALTER, есть возможность бесплатно изменить тип Enum-а, если меняется только множество значений. При этом, можно добавлять новые значения; можно удалять старые значения (это безопасно только если они ни разу не использовались, так как это не проверяется). В качестве "защиты от дурака", нельзя менять числовые значения у имеющихся строк - в этом случае, кидается исключение.
При ALTER, есть возможность поменять Enum8 на Enum16 и обратно - так же, как можно поменять Int8 на Int16.
==Array(T)==
Массив из элементов типа T. Типом T может быть любой тип, в том числе, массив.