Присоединяйтесь к теме Clickhouse Kafka:

У меня две (и более) темы Kafka, и мне нужно к ним присоединиться. Мой вопрос из того, что я читал в блогах / StackOverflow .... два варианта:

1) передать их оба, движок Clickhouse Kafka / потоковую передачу искры, в таблицы sperate, а затем запустить соединение, которое не рекомендуется в Clickhouse?

2) построить одну таблицу со всеми столбцами и использовать Clickhouse Engine / Spark streaming для обновления одного и того же входа?

Любой совет


person Arnon Rodman    schedule 06.03.2019    source источник


Ответы (2)


Как всегда, это действительно зависит от того, какие данные вы импортируете и как вы собираетесь их использовать, но я бы сказал, что в большинстве случаев лучше импортировать 2 темы в одну таблицу (так что вариант 2). Оттуда вы сможете быстро фильтровать и агрегировать записи. В зависимости от запросов, которые вы хотите выполнить, вы должны импортировать данные, используя соответствующие ORDER BY столбцы, что значительно ускорит ваши запросы.

Если вы предоставите более подробную информацию о схеме данных, к которым хотите присоединиться, я могу дать более конкретный ответ.

person valo    schedule 07.03.2019
comment
Спасибо за воспроизведение: если у меня есть две темы A {x, y, z, ts} и тема B {w, x, v, ts}, и я создал одну таблицу: столбцы x, y, z, w, v, A_ts, B_ts обновляет ли CH ту же запись со значением x? Это означает, что если мы сначала получим сообщение из темы A, а через 5-10 минут сообщение из темы B с тем же значением в поле x, обновит ли CH первую вставку? - person Arnon Rodman; 10.03.2019
comment
@Arnon Rodman: это невозможно сделать в CH. Чтобы объединить события из разных тем, нужно использовать некоторую предварительную обработку на основе Kafka Streams или Spark, а затем объединенные передают в CH. Я бы порекомендовал спросить у сообщества Kafka Stream / Spark. - person vladimir; 14.03.2019
comment
@vladimirG Спасибо за повтор, моя идея / мысль заключалась в том, чтобы создать вручную upsert / update, то есть чтение из двух тем Kafka (искра или другой движок CH Kafka) и создать приемник CH, но с командой обновления SQL. В моей таблице CH будут x, y, z, w, v .. - person Arnon Rodman; 15.03.2019
comment
@ArnonRodman, вы можете использовать ReplacingMergeTree и указать x в ORDER BY. Также есть параметр ver, который позволяет указать столбец версии, который будет использоваться для хранения записей с самой большой версией. Учтите, что дубликаты удаляются не сразу. Если вы запустите OPTIMIZE TABLE ... FINAL, дубликаты будут удалены, но для завершения этой оптимизации может потребоваться некоторое время. - person valo; 01.04.2019

Стандартный способ получить данные из Kafka в ClickHouse - создать «исходную» таблицу с Engine = Kafka и материализованным представлением, которое будет копировать данные в итоговую таблицу с помощью движка ReplicatedMergeTree.

Вы можете создать несколько материализованных представлений, которые будут писать в одну и ту же целевую таблицу, вот так.


CREATE TABLE kafka_topic1 ( ... ) Engine=Kafka ...;

CREATE TABLE kafka_topic2 ( ... ) Engine=Kafka ...;

CREATE TABLE clickhouse_table ( ... ) Engine=MergeTree ...;

CREATE MATERIALIZED VIEW kafka_topic1_reader
  TO clickhouse_table
  AS SELECT * FROM kafka_topic1;

CREATE MATERIALIZED VIEW kafka_topic2_reader
  TO clickhouse_table
  AS SELECT * FROM kafka_topic2;
person filimonov    schedule 14.03.2019
comment
Спасибо за повтор, будет ли итоговая таблица clickhouse_table содержать данные из обоих движков Kafakn? необработанные файлы с одним и тем же ключом будут объединены или мне нужно создать собственное задание вручную, которое будет объединяться / объединяться? - person Arnon Rodman; 15.03.2019
comment
По умолчанию обычный MergeTree просто сохраняет все вставленные необработанные данные, независимо от того, есть ли у него дубликаты или нет, и независимо от того, как данные были вставлены (материализованным представлением или напрямую). Таким образом, у вас будут все строки из обеих тем (с дубликатами, если они появятся). Дедупликация - еще одна (довольно большая) тема. - person filimonov; 15.03.2019
comment
СОЗДАТЬ ТАБЛИЦУ kafka_topic1 (x, y, z ...) Engine = Kafka ...; СОЗДАТЬ ТАБЛИЦУ kafka_topic2 (x, w, f ...) Engine = Kafka ...; СОЗДАТЬ ТАБЛИЦУ clickhouse_table (x, y, z, w Nullable (Int64), f ...) Engine = MergeTree ...; СОЗДАТЬ МАТЕРИАЛИЗОВАННЫЙ ВИД kafka_topic1_reader ДЛЯ clickhouse_table КАК ВЫБРАТЬ * FROM kafka_topic1; СОЗДАТЬ МАТЕРИАЛИЗОВАННЫЙ ВИД kafka_topic2_reader ДЛЯ clickhouse_table КАК ВЫБРАТЬ * FROM kafka_topic2; - person Arnon Rodman; 20.03.2019
comment
Когда я создаю первый СОЗДАТЬ МАТЕРИАЛИЗОВАННЫЙ ВИД kafka_topic1_reader, я получаю сообщение об ошибке в поле w Ожидаемый столбец w: при нажатии для просмотра tmp1. clickhouse_table. Можно ли создать clickhouse_table с облаками из обеих тем kafka, и каждый разный МАТЕРИАЛИЗОВАННЫЙ ВИД будет создавать сырые файлы с облаками тем - person Arnon Rodman; 20.03.2019
comment
Это довольно странно (я имею в виду размещение данных с разными столбцами в одной таблице). Но конечно можете. - person filimonov; 20.03.2019
comment
в вашем примере я вижу два разных движка тем Kafka с двумя МАТЕРИАЛИЗИРОВАННЫМИ ВИДАМИ, обновляющими одну и ту же таблицу clickhouse_table. Для этого clickhouse_table должен содержать все поля из обеих тем. Я ошибся? - person Arnon Rodman; 21.03.2019
comment
Я подумал, что вам просто нужно объединить данные одного и того же характера, поступающие из разных источников. Если это так и отличаются только несколько столбцов - конечно, ваша целевая таблица должна содержать столбцы из обеих тем. Но если набор столбцов значительно отличается (в вашем примере только один столбец одинаков) - возможно, было бы лучше хранить данные в 2 разных таблицах (при необходимости выполняя объединения), вместо того, чтобы иметь 1/2 столбца пустым для 1 / 2 ряда. - person filimonov; 22.03.2019
comment
Можете ли вы помочь с импортом clickhouse из проблемы с памятью CSV? stackoverflow.com/questions/56156682/ - person Arnon Rodman; 21.05.2019