clickhouse:在分布式和复制表中使用散列和内部复制

bxgwgixi  于 2021-06-05  发布在  Kafka
关注(0)|答案(1)|浏览(889)

我已经在分布式引擎文档中阅读了有关内部复制设置的内容。
如果此参数设置为“true”,则写入操作将选择第一个正常副本并向其写入数据。如果分布式表“查看”复制的表,请使用此替代方法。换句话说,如果要写入数据的表要自己复制它们。
如果设置为“false”(默认值),则数据将写入所有副本。本质上,这意味着分布式表复制数据本身。这比使用复制表更糟糕,因为复制副本的一致性没有得到检查,而且随着时间的推移,它们将包含略有不同的数据。
我用的是典型的 KafkaEngineMaterialized View (mv)设置,加上使用 Distributed table。我有一组示例,其中 ReplicatedReplacingMergeTree 以及 Distributed 上面的表格如下所示:

CREATE TABLE IF NOT EXISTS pageviews_kafka (
// .. fields
) ENGINE = Kafka
SETTINGS
  kafka_broker_list = '%%BROKER_LIST%%',
  kafka_topic_list = 'pageviews',
  kafka_group_name = 'clickhouse-%%DATABASE%%-pageviews',
  kafka_format = 'JSONEachRow',
  kafka_row_delimiter = '\n';

CREATE TABLE IF NOT EXISTS pageviews (
   // fields
) ENGINE ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/%%DATABASE%%/pageviews', '{replica}', processingTimestampNs)
PARTITION BY toYYYYMM(dateTime)
ORDER BY (clientId, toDate(dateTime), userId, pageviewId);

CREATE TABLE IF NOT EXISTS pageviews_d AS pageviews ENGINE = Distributed('my-cluster', %%DATABASE%%, pageviews, sipHash64(toString(pageviewId)));

CREATE MATERIALIZED VIEW IF NOT EXISTS pageviews_mv TO pageviews_d AS
SELECT
 // fields 
FROM pageviews_kafka;

问题:
我使用的是默认值 internal_replication 在分布式表中,这是错误的。这是否意味着分布式表正在将所有数据写入所有副本?所以,如果我 internal_replication 如果为true,那么replicatedreplacingmergetree的每个示例将只有其在整个表中的份额,而不是整个数据集,从而优化数据存储?如果是这样的话,复制也会受到影响—如何定义特定数量的复制副本?
我使用实体的id作为分发散列。我已经阅读了altinity的clickhouse kafka引擎常见问题,问题“q。如何在群集中使用kafka引擎表?”,如下所示:
另一种可能是将kafka引擎表中的数据刷新到分布式表中。不过,它需要更仔细的配置。特别是,分布式表需要有一些切分键(不是随机散列)。要使replicatedmergetree的重复数据消除正常工作,这是必需的。分布式表将重试对同一块的插入,这些插入可以通过clickhouse进行重复数据消除。
但是,我在这里使用了一个半随机散列(它是实体id,其思想是将同一实体示例的不同副本(在本例中是pageview)分组在一起)。它的实际问题是什么?为什么不鼓励?

0pizxfdo

0pizxfdo1#

我在分布式表中使用默认值internal\ u replication,它是false。
你不应该。一定是真的。您很幸运,由于插入重复数据消除,数据尚未复制。但最终它将被复制,因为您的分布式表在2个复制副本中执行了2个相同的插入,而复制表将插入的数据复制到另一个复制副本(在您的情况下,第二个复制副本会跳过分布式表的插入,因为您很幸运)。
然后,replicatedreplacingmergetree的每个示例将只有它在整个表中的份额
你错了。
分布式(internal_replication=true)插入到所有碎片中。
分布式(internal_replication=false)向所有碎片中插入+向所有副本中插入。
它需要更仔细的配置我在这里使用的是半随机散列
它需要更仔细的配置,你做到了!!!,使用-- sipHash64(toString(pageviewId)) 您可以更改顺序,如果重复插入,则相同的行将转到相同的分片,因为行的分片编号是使用 pageviewId 不是 rand() .

相关问题