ClickHouseの基本的な使い方まとめ

システム構成の表示

システムテーブルを表示する

system.clusters から * を選択します。

Zookeeper を確認する
#Zookeeper が現在のデータベース クリックハウスで正しく構成されているかどうかを確認する

SELECT * FROM system.zookeeper WHERE パス = '/clickhouse';

テーブルを構築する

ローカルテーブルを作成する


MergeTree はエンジン自体にレプリカを同期する機能はありませんが、ReplicaMergeTree を指定すると対応するレプリカに同期されます。一般に、実際のアプリケーションでは、分散テーブルの作成ではレプリカのテーブルを指定します。

分散テーブル自体はデータを格納せず、データの格納は実際にはローカル テーブル t_cluster によって行われます。この dist_t_cluster はプロキシとしてのみ機能します。

いずれかのノードでテーブルが作成された後、他のノードがテーブル構造と同期できる場合、クラスターが有効になったことを意味します。

MergeTree の置換の使用

CREATE TABLE default.test ON CLUSTER clickhouse_cluster
(
    name String DEFAULT 'lemonNan' COMMENT '姓名',
    age int DEFAULT 18 COMMENT '年龄',
    gongzhonghao String DEFAULT 'lemonCode' COMMENT '公众号',
    my_time DateTime64(3, 'UTC') COMMENT '时间'
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(my_time)
ORDER BY my_time

マージツリーを使用する 

CREATE TABLE t_cluster ON CLUSTER clickhouse_cluster (
id Int16,
name String,
birth Date
)ENGINE = MergeTree()
PARTITION BY toYYYYMM(birth)

ORDER BY id

クリックハウスはいつ ReplacingMergeTree エンジンを使用しますか? MergeTree エンジンをいつ使用するか? 
ReplacingMergeTree エンジンと MergeTree エンジンはどちらも ClickHouse で一般的に使用されるエンジン タイプですが、適用可能なシナリオは若干異なります。

ReplacingMergeTree エンジンは、データの更新時に履歴データを保存する必要があるシナリオに適していますエンジンはデータを挿入するときに、新しいデータが既存のデータと競合するかどうかを検出し、競合がある場合は古いデータを新しいデータに置き換え、古いデータの削除時刻を記録しますこのようにして、クエリ時に履歴データを保存したり、履歴データを元に戻したり復元したりできます。

MergeTree エンジンは、最も一般的な OLAP シナリオに適しています。このエンジンはデータを迅速に並べ替えて圧縮でき、高速なクエリと集計を実現するために 1 つ以上の列によるパーティション分割をサポートします。MergeTree エンジンは、大量のデータや同時実行性の高いクエリ要求の処理に適しています。

したがって、データ更新時に履歴データを保持する必要がある場合は ReplacingMergeTree エンジンを使用でき、通常の OLAP クエリのみを実行する必要がある場合は MergeTree エンジンを使用できます
 

ClickHouse は、新しいデータが既存のデータと競合するかどうかを判断するためにどのような基準を使用しますか?

ClickHouse が ReplacingMergeTree エンジンを使用する場合、テーブル内の指定された主キーに基づいて、新しいデータが既存のデータと競合するかどうかを判断します具体的には、ClickHouse は主キー値に従って照合します。新しいデータの主キー値が既存データの主キー値と同じである場合、2 つのデータは競合しているとみなされます。

主キーが指定されていない場合、ClickHouse はすべての列をマージキーとして使用して、新しいデータを既存のデータと比較します。すべての列の値が同じ場合、2 つのデータは競合しているとみなされます。

データの競合を判断する場合、ClickHouse ではデータ型と大文字小文字の厳密な比較が行われるため、データの精度と形式に注意を払う必要があります。同時に、ClickHouseは、より柔軟なビジネスニーズに応えるために、特定の条件下で判断するカスタム機能もサポートしています。

たとえば、次は名前フィールドを主キーとして指定します。

CREATE TABLE default.test88 ON CLUSTER clickhouse_cluster
(
    name String   NOT NULL   COMMENT '姓名',
    age int DEFAULT 18 COMMENT '年龄',
    gongzhonghao String DEFAULT 'lemonCode' COMMENT '公众号',
    my_time DateTime64(3, 'UTC') COMMENT '时间',
    PRIMARY KEY (name)
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(my_time)
ORDER BY name

分散テーブルを作成する

CREATE TABLE default.dist_t_cluster
 ON CLUSTER clickhouse_cluster as t_cluster 
engine = Distributed(clickhouse_cluster, default, t_cluster, rand());

テスト データを挿入する
さらにいくつかのエントリを挿入し、任意のノード上の分散テーブルを表示すると、データを確認できます。

insert into dist_t_cluster values(1, 'aaa', '2021-02-01'), (2, 'bbb', '2021-02-02');

分散テーブル エンジンの作成テンプレート:

Distributed(clusterName,databaseName,tableName[,sharding_key])
1.
クラスター識別子 (clusterName) は、コピー テーブル マクロ内の識別子ではなく、<remote_servers> で指定された識別子であることに注意してください。
2. ローカル テーブルが存在するデータベースの名前 (databaseName)
3. ローカル テーブルの名前 (tableName)
4. (オプション) シャーディング キー (シャーディング キー)

このキーは、config.xml で構成された断片化の重み (重み) と合わせて、分散テーブルに書き込むときのルーティング、つまりデータが最終的にどの物理テーブルに置かれるかを決定します。これは、テーブル内の列の元のデータ (site_id など) である場合もあれば、ランダム値 rand() を使用した上記の SQL ステートメントなどの関数呼び出しの結果である場合もあります。キーはデータが均等に分散されていることを確認する必要があることに注意してください。もう 1 つの一般的な操作は、intHash64(user_id) など、高度に区別された列のハッシュ値を使用することです。

分散DDL

ClickHouse でテーブルの作成やテーブルの削除などの DDL 操作は面倒です。DDL ステートメントを実行するには、クラスター内の各ノードにログインする必要があります。この操作を簡素化するにはどうすればよいですか?

ClickHouse (つまり CH) はクラスター モードをサポートします。ON CLUSTER <cluster_name> の構文を DDL ステートメントに追加すると、DDL ステートメントを一度実行するとクラスター内のすべてのインスタンスで実行できるため、簡単で便利です。

クラスターには 1 つ以上のノードがあります。
CREATE、ALTER、DROP、RENAME、TRUNCATE などの DDL ステートメントはすべて分散実行をサポートしています
。つまり、DDL ステートメントがクラスター内のいずれかのノードで実行される場合、クラスター内の各ノードは同じステートメントを同じ順序で実行します。
これにより、単一ノードに移動して DDL を順番に実行する手間が省けます]
 

出典:分散 DDL の使用例の Clickhouse クラスターベースの実装と、cluster_java プログラミング アート ブログの Pits_clickhouse の挿入 - CSDN ブログ

パーティション パーティション

テーブル内のデータは、指定されたフィールドに従ってパーティション化して保存することができ、各パーティションはファイル システム内のディレクトリの形式で存在します。時間フィールドは一般にパーティション フィールドとして使用されます。大量のデータを含むテーブルは時間ごとにパーティション化でき、少量のデータを含むテーブルは日または月ごとにパーティション化できます。クエリを実行するときは、パーティション フィールドを次のように使用します。 Where 条件。結果セット以外の多数のデータを効果的に除外できます。

フィールドで区切る

create table partition_table_test(
id UInt32,
name String,
city String
) engine = MergeTree()
 order by id
partition by city;

時間で区切る

CREATE TABLE default.test ON CLUSTER clickhouse_cluster
(
    name String DEFAULT 'lemonNan' COMMENT '姓名',
    age int DEFAULT 18 COMMENT '年龄',
    gongzhonghao String DEFAULT 'lemonCode' COMMENT '公众号',
    my_time DateTime64(3, 'UTC') COMMENT '时间'
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(my_time)
ORDER BY my_time

#パーティション関連情報のクエリ 

select database, table, partition, partition_id, name, path from system.parts where database = 'data_sync' and table = 'test';

#パーティションの削除

alter table data_sync.test drop partition '202203'

 出典:クリックハウス データ テーブル、データ パーティションの基本操作 パーティション_クリックハウス ドロップ パーティション_Bulut0907 のブログ-CSDN ブログ

ClickHouse と Kafak 間の同期

同期フローチャート

データシート


# データテーブルを作成する

CREATE DATABASE IF NOT EXISTS data_sync;
CREATE TABLE IF NOT EXISTS data_sync.test
(
    name String DEFAULT 'lemonNan' COMMENT '姓名',
    age int DEFAULT 18 COMMENT '年龄',
    gongzhonghao String DEFAULT 'lemonCode' COMMENT '公众号',
    my_time DateTime64(3, 'UTC') COMMENT '时间'
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(my_time)
ORDER BY my_time

エンジンテーブル


# Kafka エンジン テーブルを作成します。アドレス: 172.16.16.4、トピック:レモンコード

CREATE TABLE IF NOT EXISTS data_sync.test_queue(
    name String,
    age int,
    gongzhonghao String, 
    my_time DateTime64(3, 'UTC')
) ENGINE = Kafka
SETTINGS
  kafka_broker_list = '172.16.16.4:9092',
  kafka_topic_list = 'lemonCode',
  kafka_group_name = 'lemonNan',
  kafka_format = 'JSONEachRow',
  kafka_row_delimiter = '\n',
  kafka_schema = '',
  kafka_num_consumers = 1

注: 設定には 2 つの重要なパラメータがあります。

Kafka データをサブスクライブするkafka_thread_per_consumerパラメーターは、kafka_num_consumersコンシューマー スレッドの数に関連します。具体的な機能は以下の通りです。

  • kafka_thread_per_consumerパラメーター: このパラメーターは、各 Kafka コンシューマーのスレッド数を示します。デフォルトは 1 で、各コンシューマが 1 つのスレッドを使用することを意味します。消費速度を上げる必要がある場合は、このパラメータの値を増やしてコンシューマ スレッドの数を増やすことができます。

  • kafka_num_consumersパラメーター: このパラメーターは、作成された Kafka コンシューマーの数を示します。デフォルト値は 1 で、コンシューマが 1 つだけ作成されることを意味します。消費速度を上げる必要がある場合は、このパラメータの値を増やしてコンシューマの数を増やすことができます。

コンシューマ スレッドの数とコンシューマの数を増やすと、消費速度が向上する可能性がありますが、ClickHouse サーバーの負荷も増加することに注意してください。したがって、これらのパラメータを設定する際には、実際の状況に応じてトレードオフを行う必要があります。同時に、Kafka パーティションの数やデータのサイズなどの要因に応じて、適切な調整を行う必要があります。


 マテリアライズドビュー


# マテリアライズドビューを作成する

CREATE MATERIALIZED VIEW IF NOT EXISTS data_sync.test_mv TO data_sync.test AS 
SELECT name, age, gongzhonghao, my_time FROM data_sync.test_queue;

Kafka のサブスクリプションのアイデア

1. Kafka データを分散テーブルに送信して、クラスター ストレージを利用できます。

ローカルテーブルを作成します。

CREATE TABLE data_sync.test ON CLUSTER clickhouse_cluster
(
    name String   NOT NULL   COMMENT '姓名',
    age int DEFAULT 18 COMMENT '年龄',
    gongzhonghao String DEFAULT 'lemonCode' COMMENT '公众号',
    my_time DateTime64(3, 'UTC') COMMENT '时间',
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(my_time)
ORDER BY name

分散テーブルを作成します。

CREATE TABLE data_sync.test_dist
 ON CLUSTER clickhouse_cluster as test 
engine = Distributed(clickhouse_cluster, data_sync, test, rand());

エンジン テーブルを作成します。

CREATE TABLE IF NOT EXISTS data_sync.test_queue(
    name String,
    age int,
    gongzhonghao String, 
    my_time DateTime64(3, 'UTC')
) ENGINE = Kafka
SETTINGS
  kafka_broker_list = '172.16.16.4:9092',
  kafka_topic_list = 'lemonCode',
  kafka_group_name = 'lemonNan',
  kafka_format = 'JSONEachRow',
  kafka_row_delimiter = '\n',
  kafka_schema = '',
  kafka_num_consumers = 1

マテリアライズド ビュー:

対象テーブルは分散テーブルに割り当てられることに注意してください。

CREATE MATERIALIZED VIEW IF NOT EXISTS data_sync.test_mv TO data_sync.test_dist AS 
SELECT name, age, gongzhonghao, my_time FROM data_sync.test_queue;

 2. エンジン テーブルとマテリアライズド ビューは複数のノード上に作成でき、複数のノードが同時に Kafka データにアクセスできます。

データシミュレーション


以下にシミュレーション開始フローチャートのデータ傾向を示しますが、Kafka をインストール済みの方はインストール手順を省略できます。

kafka をインストールします。
kafka は、デモ用のスタンドアロン インストールです。

# 動物園の飼育員を開始する

docker run -d --name zookeeper -p 2181:2181  wurstmeister/zookeeper


# kafka を開始します。KAFKA_ADVERTISED_LISTENERS の後の IP アドレスはマシンの IP です

docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --link zookeeper -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.16.16.4:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka


kafka コマンドを使用してデータを送信します
# プロデューサを起動し、トピック LemonCode にメッセージを送信します

kafka-console-producer.sh --bootstrap-server 172.16.16.4:9092 --topic lemonCode


# 次のメッセージを送信します

{"name":"lemonNan","age":20,"gongzhonghao":"lemonCode","my_time":"2022-03-06 18:00:00.001"}
{"name":"lemonNan","age":20,"gongzhonghao":"lemonCode","my_time":"2022-03-06 18:00:00.001"}
{"name":"lemonNan","age":20,"gongzhonghao":"lemonCode","my_time":"2022-03-06 18:00:00.002"}
{"name":"lemonNan","age":20,"gongzhonghao":"lemonCode","my_time":"2022-03-06 23;59:59.002"}


Clickhouse のデータシートを表示する

select * from data_sync.test;

ソース:

https://www.cnblogs.com/wuhaonan/p/15978470.html

他のコマンド

テーブル構造を変更したり、他のターゲット テーブルを調整する必要がある場合は、まずデータ サブスクリプションを停止し、変更が完了した後にサブスクリプションを開始できます。

複数のノードにエンジン テーブルがある場合、各ノードがそれを実行する必要があることに注意してください。

#購読をやめる

DETACH TABLE data_sync.test_queue;

# サブスクリプションを開始する

アタッチテーブル data_sync.test_queue;

 ビューを削除します:

ビュー data_sync.test_mv をドロップします。

おすすめ

転載: blog.csdn.net/csdncjh/article/details/131007974