
Alexey
04.08.2017
19:26:15

Vladimir
04.08.2017
19:26:35

Alexander
04.08.2017
19:26:46

Александр
04.08.2017
19:28:41

Google

Vladimir
04.08.2017
19:28:54

Alexander
04.08.2017
19:29:46

Vladimir
04.08.2017
19:30:08
Так да
Вопрос открыт
Хорошо что заработало но почему непонятно
все что делал и тестил писал тут в режиме реального времени и конфиги выкладывал
могу history из сервера выложить :)

Александр
04.08.2017
19:31:55
могу history из сервера выложить :)
Я думаю есть смысл это оформить в issue с описанием временного решения до тех пор пока не разберутся и не пофиксят, что бы другие в такое не впарывались

Vladimir
04.08.2017
19:37:13
Сейчас пришел все ок
Влило 9млрд строк и продолжает работать
очередей нет
parts до 1000.
зы конфигурация сети не менялась (чуть что все это запускалось AWS VPN)
Вот тут видно как мы выгребли интенсивно все из Кафки что там было и пошли выгребать со скоростью вставки


Alexey
04.08.2017
19:38:24
Тем кто советовал убрать время из ключа будет интересно наверное
было
2400 rows in set. Elapsed: 0.043 sec. Processed 3.17 million rows, 170.50 MB (73.01 million rows/s., 3.92 GB/s.)
стало
966 rows in set. Elapsed: 0.642 sec. Processed 16.49 million rows, 823.10 MB (25.67 million rows/s., 1.28 GB/s.)
Видно что просяду я неплохо по производительности, я бы даже сказал неприемлемо (кратно количество строк для сканирования возросло)
Если в SELECT условия с большей гранулярностью, чем дни (например, пол дня), то разумно иметь время в первичном ключе.
При этом в запросах следует писать условия и на время (первичный ключ) и на ключ даты, который обязательный для MergeTree. Ключ даты отвечает за выбор кусков для чтения. Для каждого куска будет просканирован какой-то (хоть минимальный) объём записей, поэтому отсутствие условия на дату негативно влияет на latency.
Если в первичном ключе есть timestamp с точностью до секунд, то указывать в нём что-то после timestamp бесполезно. То есть, первичный ключ будет заканчиваться на timestamp.


Vladimir
04.08.2017
19:39:26

Alexey
04.08.2017
19:40:54
> parts до 1000
Имеет смысл смотреть SELECT count() FROM system.parts WHERE active
- условие на active выбирает куски, которые активные для запросов. Остальные куски некоторое время держатся после мержей, а потом удаляются.
Или даже так:
SELECT partition, count() FROM system.parts WHERE active GROUP BY partition ORDER BY partition

Google

Vladimir
04.08.2017
19:41:52
я делал так
SELECT bytes FROM system.parts WHERE active order by bytes desc limit 2000;
Если в первичном ключе есть timestamp с точностью до секунд, то указывать в нём что-то после timestamp бесполезно. То есть, первичный ключ будет заканчиваться на timestamp.
такое бесполезно?
(zzz, timestamp, ddd, yyy)?
А если дисперсия ddd огромна?

Alexey
04.08.2017
19:44:32
Может быть полезна в очень редких случаях - если за одну секунду - для конкретного значения zzz, timestamp есть хотя бы миллионы записей. Только тогда условие на ddd позволит эффективно пропускать диапазоны в рамках конкретного zzz, timestamp.

Vladimir
04.08.2017
19:45:02
Ок, вроде все понятно
Спсб
Если хотите могу вернуть IP и будет возможность посмотреть что за баг был
Только не сегодня плиз

Alexey
04.08.2017
19:49:55


Vladimir
04.08.2017
19:59:37
Пока детально непонятно но рецепт такое
1. Если у вас растет очередь на вставки в реплики ( select * from system.replicas format Vertical » inserts_in_queue: 0)
2. Если у вас растат неконтролируемо количество parts (SELECT partition, count() FROM system.parts WHERE active GROUP BY partition ORDER BY partition)
3. Если у вас куча такого в логах
2017.08.04 10:13:12.511175 [ 39 ] <Debug> default.measures (StorageReplicatedMergeTree): Fetching part 20161202_20161207_104_104_0 from /clickhouse/tables/02/measures/replicas/2
2017.08.04 10:13:12.511362 [ 39 ] <Trace> ReadWriteBufferFromHTTP: Sending request to http://localhost:9009/?endpoint=DataPartsExchange:%2Fclickhouse%2Ftables%2F02%2Fmeasures%2Freplicas%2F2&part=20161202_20161207_104_104_0&shard=&compress=false
2017.08.04 10:13:12.511506 [ 4079 ] <Trace> InterserverIOHTTPHandler-factory: HTTP Request for InterserverIOHTTPHandler-factory. Method: POST, Address: 127.0.0.1:32894, User-Agent: none
2017.08.04 10:13:12.511534 [ 4079 ] <Trace> InterserverIOHTTPHandler: Request URI: ?endpoint=DataPartsExchange:%2Fclickhouse%2Ftables%2F02%2Fmeasures%2Freplicas%2F2&part=20161202_20161207_104_104_0&shard=&compress=false
2017.08.04 10:13:12.519303 [ 4079 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/02/measures/replicas/2, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x29b2626]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10b079f]
2. clickhouse-server(DB::InterserverIOHTTPHandler::processQuery(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&)+0xbc8) [0x10cdd28]
3. clickhouse-server(DB::InterserverIOHTTPHandler::handleRequest(Poco::Net::HTTPServerRequest&, Poco::Net::HTTPServerResponse&)+0x4b) [0x10ce98b]
4. clickhouse-server(Poco::Net::HTTPServerConnection::run()+0x2fe) [0x32bf69e]
5. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x32b47af]
6. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x32babeb]
7. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3525be7]
8. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x34f1c25]
9. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f16979386ba]
10. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f1696f593dd]
2017.08.04 10:13:12.530746 [ 39 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
Vladimir Tretyakov, [04.08.17 12:13]
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x29b2626]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10b079f]
2. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPartImpl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)+0x1cc7) [0x2bb1cb7]
3. clickhouse-server(DB::DataPartsExchange::Fetcher::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool)+0x76) [0x2bb2766]
4. clickhouse-server(DB::StorageReplicatedMergeTree::fetchPart(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, unsigned long)+0x25a) [0x2a98b1a]
5. clickhouse-server(DB::StorageReplicatedMergeTree::executeLogEntry(DB::ReplicatedMergeTreeLogEntry const&)+0x1bcf) [0x2a9b35f]
6. clickhouse-server() [0x2a9d22d]
7. clickhouse-server(DB::ReplicatedMergeTreeQueue::processEntry(std::function<std::shared_ptr<zkutil::ZooKeeper> ()>, std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&, std::function<bool (std::shared_ptr<DB::ReplicatedMergeTreeLogEntry>&)>)+0x4a) [0x2b263da]
8. clickhouse-server(DB::StorageReplicatedMergeTree::queueTask()+0x150) [0x2a88930]
9. clickhouse-server(DB::BackgroundProcessingPool::threadFunction()+0x3dc) [0x2b74edc]
10. clickhouse-server() [0x36d9f1f]
11. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7f16979386ba]
12. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f1696f593dd]
Смотрите что-то с именами или IP серверов
Перепроверьте что ничего подозрительного нет в /etc/hosts что /etc/hostname прописанно правильно и в конфигах CH тоже все имена правильные.


Alexander
04.08.2017
20:04:28
Ok. А можно повтор вопроса тогда старого: window-join и подобного пока даже в далёких планах нет? Ну чтоб не ковыряться напрасно если вдруг.

Alexey
04.08.2017
20:08:35

Alexander
04.08.2017
20:11:43
Те в следующем году может уже будет обсуждение. Ясно, спасибо.

Александр
04.08.2017
20:44:20
В этом вроде как update / delete планируется впилить
Судя по roadmap

Nikita
04.08.2017
21:27:39
Вот это было бы просто неоценимо

Ilya
04.08.2017
21:54:29

Alexander
04.08.2017
22:10:55
update / delete наверняка будут по партишенам. Сейчас тоже самое можно, но немного больше движений. После того как будет деление по дням - ещё проще.

Ilya
05.08.2017
06:13:16

Slach
05.08.2017
06:48:27
Всем привет, не сделал ли случайно кто нибудь уже какую нибудь систему у правления конфигами clickhouse ?
ну вот типовая задача "добавить ноду в кластер"?
там же надо везде прописывать в config.xml <remote_servers>? может это кто-то автоматизировал уже?

Александр
05.08.2017
07:16:41
Произвольное партиционирование и update, delete строк и я готов буду поклоняться Алексею и команде )

Ilya
05.08.2017
07:17:42

Google

Александр
05.08.2017
07:20:04
У нас просто получается так, что факты мы вычисляем и периодически пишем в мускуль из-за отсутствия собственно обновления и удаления строк. У нас очень хитрая логика вычисления фактов и некоторые агрегации приходится делать в mysql, который к слову не очень хорошо себя ведет в этом направлении

Roman
05.08.2017
08:20:30

Slach
05.08.2017
08:42:38
Makefile)
каждый раз когда русскоязычный программист в русскоязычном чате импульсивно и неконструктивно включает sarcasm mode, в мире появляется еще 100 китайских программистов, которые в итоге таки напишут кривой и косой ИИ, который оставит детей именно этого программиста без средств к существованию, либо именно этого программиста без работы ;)

Александр
05.08.2017
08:43:08

Roman
05.08.2017
08:43:52

Slach
05.08.2017
08:51:12
с другой стороны, если вы пришлете ссылку на github с примером Makefile который хотя бы приблизительно решает задачу "раскидать новый config.xml" на 10-20 хостов полученных из zookeeper, то буду благодарен

Alexey
05.08.2017
08:54:09
может тут всеж смотреть на что-то вроде ansible/puppet/chef?
мы делаем это с помощью ansible

Slach
05.08.2017
08:55:00
где нибудь в github?
или там все "проектно-специфическое" оторвать не получится?

Alexey
05.08.2017
08:55:47
ды... пока не доводилось. не уверен что мои роли прям достойны общественного внимания в виде гитхаб репы

Alexey
05.08.2017
08:55:52
но если интерес есть...
вообще там никакой особой специфика CH нет

Slach
05.08.2017
08:56:01
Интерес есть

Alexey
05.08.2017
08:56:15
и наше внутренней специфики нет
и есть еще что улучшать
но в общем вполне рабочее
сегодня постараюсь выложить тогда и закину сюда ссыль

Slach
05.08.2017
08:58:32
ну почему нет?
ну вот типичная задача "добавить ноду в кластер"
она же требует чего то вроде
1) катим роль на новую ноду, указав ей zookeeper
2) ждем когда CH на новой ноде появится в Zookeper
3) генерим по zookeper новый config.xml в части remote_servers
4) раскатываем этот xml по всем нодам
5) ждем когда CH на всех нодах перечитает конфиг (или шлем sighub ?)

Google

Alexey
05.08.2017
09:00:19
ты хочешь прям роль по добавлению узла в кластер?
почему ты хочешь из зукипера брать конфиг?
не очень понимаю
почему не из текущего инвентори ansible

Slach
05.08.2017
09:02:06
да, согласен, мысль более правильная юзать inventory ansible
там же не обязательно чтобы в config.xml все хосты были "живыми", надо просто общую конфигурацию кластера генерть

Evgeny
05.08.2017
09:27:58
подскажите зачем в кроне после установки clickhouse такая задача:
*/10 * * * * root /etc/init.d/clickhouse-server condstart 1>/dev/null 2>&1

Admin
ERROR: S client not available

Alexey
05.08.2017
09:56:41
как я понял, это такой вотчдог простой
который переподнимает CH если тот упал


Alexey
05.08.2017
10:02:00
Добрый день. Помогите, пожалуйста, с импортом.
Импортирую TabSeparated таблицу с городами, выгруженными из MySQL.
Встречаются Null-значения для столбца регионов (UInt32) и столбцов с их именами (String).
В тексте импортируемого файла они как "\N". Как их загрузить?
Может, можно как-то поддержку Null у столбцов указывать? Движок таблицы сейчас Log
Возникает следующая ошибка:
# zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Code: 27. DB::Exception: Cannot parse input: expected \t before: \\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМо▒: (at row 1)
Row 1:
Column 0, name: city_id, type: UInt32, parsed text: "1"
Column 1, name: country_id, type: UInt32, parsed text: "1"
Column 2, name: important, type: UInt8, parsed text: "1"
Column 3, name: region_id, type: UInt32, ERROR: text "<BACKSLASH>N<TAB>Мос▒" is not like UInt32
ClickHouse вообще умеет Null ?


Александр
05.08.2017
10:14:28
Добрый день. Помогите, пожалуйста, с импортом.
Импортирую TabSeparated таблицу с городами, выгруженными из MySQL.
Встречаются Null-значения для столбца регионов (UInt32) и столбцов с их именами (String).
В тексте импортируемого файла они как "\N". Как их загрузить?
Может, можно как-то поддержку Null у столбцов указывать? Движок таблицы сейчас Log
Возникает следующая ошибка:
# zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Code: 27. DB::Exception: Cannot parse input: expected \t before: \\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМо▒: (at row 1)
Row 1:
Column 0, name: city_id, type: UInt32, parsed text: "1"
Column 1, name: country_id, type: UInt32, parsed text: "1"
Column 2, name: important, type: UInt8, parsed text: "1"
Column 3, name: region_id, type: UInt32, ERROR: text "<BACKSLASH>N<TAB>Мос▒" is not like UInt32
Можно, где то в тестах в репозитории кх есть пример с nullable колонками, но они еще в бете (последняя информация была такой). Точно не могу скинуть как сделать nullable, с телефонп не совсем удобно искать


Alexey
05.08.2017
10:15:08

Александр
05.08.2017
10:16:26
Нашел

Alexey
05.08.2017
10:17:48
Синтаксис понял, спасибо большое!

Александр
05.08.2017
10:17:59
Я лично нулы не использую, пишу 0 или пустую строку


Tima
05.08.2017
10:42:13
Добрый день. Помогите, пожалуйста, с импортом.
Импортирую TabSeparated таблицу с городами, выгруженными из MySQL.
Встречаются Null-значения для столбца регионов (UInt32) и столбцов с их именами (String).
В тексте импортируемого файла они как "\N". Как их загрузить?
Может, можно как-то поддержку Null у столбцов указывать? Движок таблицы сейчас Log
Возникает следующая ошибка:
# zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Code: 27. DB::Exception: Cannot parse input: expected \t before: \\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМосква\t\\N\t\\N\tМо▒: (at row 1)
Row 1:
Column 0, name: city_id, type: UInt32, parsed text: "1"
Column 1, name: country_id, type: UInt32, parsed text: "1"
Column 2, name: important, type: UInt8, parsed text: "1"
Column 3, name: region_id, type: UInt32, ERROR: text "<BACKSLASH>N<TAB>Мос▒" is not like UInt32
Я явно указываю дефолты: для чисел 0, длядат - 0000-00-00 и т.п
Для колонок, где нет значений


Alexey
05.08.2017
10:46:58
Прокатило с Nullable(UInt32) и Nullable(String). А что, можно было при импорте указать, какое значение на какое менять?

Google

Evgeny
05.08.2017
10:47:36
Подскажите по движку GraphiteMergeTree он удаляет старые данные которые по дате больше максимального retension или это руками нужно удалять патриции?

Slach
05.08.2017
10:58:45
кто нибудь работал с этим драйвером
https://github.com/kshvakov/clickhouse
в кластере?
там можно как нибудь сделать запрос на создание локальных таблиц в каждой ноде кластера?
просто драйвер от ROI-stat не умеет авторизацию... а драйвер от Кирила, похоже любой запрос пробрасывает только на одну ноду из кластера?

Tima
05.08.2017
11:13:02
"а драйвер от Кирила, похоже любой запрос пробрасывает только на одну ноду из кластера" - чтобы запрос задействовал весь кластер, нужно делать его к Disturbed-таблице

Alexey
05.08.2017
11:23:32

Tima
05.08.2017
11:24:11

Alexey
05.08.2017
11:24:26
т.е. в коде MySQL ? чё-то не хочется

Tima
05.08.2017
11:24:43
Тогда jdbc-драйвер не будет подставлять \N для пустых колонок

Alexey
05.08.2017
11:31:35
Опишите, как данные попадают из MySQL в CH
Они выгружаются в файл силами mysqldump с ключом —tab, что означает в ClickHouse TabSeparated values.
Далее гзипуются и передаются на vps. И импортируются так
zcat _cities.txt.gz | clickhouse-client —query="INSERT INTO geodata._cities_log FORMAT TabSeparated"
Задача эта уже решена, если что, правильным созданием таблицы - с полями, позволяющими Null.
Т.е. помощи уже пока не нужно.
Сейчас проблема в том, что оперативки VPS у не хватает, так что буду скриптить разбиение данных на части.
Далее вангуется проблема с переносом из Log в MergeTree, т.к. там не нужное доп.поле EventDate.

Tima
05.08.2017
11:33:23


Alexey
05.08.2017
11:37:56
Хорошо. По поводу перехода на MergeTree - вообще нет никакого поля с датой?
да, нету. И функцией её не хочет ипортировать.
Тренировался на регионах (их меньше) и такое не прокатило:
INSERT INTO geodata._regions SELECT today() as EventDate, * FROM geodata._regions_log;
таблицы отличаются только движком и отсутствием даты в _regions_log
INSERT INTO geodata._regions SELECT
today() AS EventDate,
*
FROM geodata._regions_log
Ok.
0 rows in set. Elapsed: 0.025 sec. Processed 3.72 thousand rows, 1.48 MB (150.20 thousand rows/s., 59.73 MB/s.)
:)
при этом селект отдельно от инсерта - работает

Tima
05.08.2017
11:42:51
Может попробовать сделать дефолт для EventDate
https://clickhouse.yandex/docs/ru/query_language/queries.html#id2
Типа такого
CREATE TABLE ...
(
EventDate DEFAULT today()
...
) Engine=MergeTree(...)
?
А при интсерте в запросе с INSERT INTO указать явно все столбцы, без EventDate

Alexey
05.08.2017
11:43:54
последнее пробовал - результат такой же. А пересоздать таблицу попробую, спасибо