ClickHouse
前書き
市場で最も人気のあるKFCパッケージのCはClickHouseです。リアルタイムとアーキテクチャを行う多くの学生がこのツールに精通しています。このツールを組み合わせて、ビジネスでの展開と使用、および放棄する理由について簡単に説明します。その後CK。
ClickHouseは、ロシア最大の検索エンジンであるYandexによって開発された列型ストレージOLAPデータベースです。スタンドアロンおよびクラスターのクエリパフォーマンスは高速です。OLAPには単一のテーブルクエリツールはありません。今日、Toutiao、Tencent、Ctrip、およびKuaishouはすべてCKを使用してPBレベルのデータを分析しています。
利点:
- 1.真の列指向DBMS
- 2.データ効率の高い圧縮=> 0.2
- 3.ディスクに保存されたデータ=>メモリ使用量を削減
- 4.マルチコア並列処理=>大規模クエリのマルチコアマルチノード並列化
- 5.複数のサーバーでの分散処理
- 6.SQL構文のサポート
- 7.順序付きデータストレージ=> ClickHouseは、テーブルを作成するときに特定の列に従ってデータを並べ替える指定をサポートしています。
- 8.主キーインデックス+スパースインデックス
ビルド(ドッカー)
Dockerfile
FROM centos:7
MAINTAINER clickhouse
RUN yum install -y curl
RUN curl -s https://packagecloud.io/install/repositories/Altinity/clickhouse/script.rpm.sh | bash
RUN yum install -y clickhouse-server clickhouse-client
RUN mkdir -p /var/clickhouse/log
RUN mkdir -p /var/clickhouse/data
ADD clickhouse-start.sh /
ENTRYPOINT ["sh","/clickhouse-start.sh"]
clickhouse-start.sh
#!/bin/bash
set -e
exec /etc/init.d/clickhouse-server start & tail -f /dev/null
config.xmlの基本構成については、これ以上詳しく説明しません。ここで、ログディレクトリとデータディレクトリを/ var / clickhouse / ...に変更します。個人的に
話す方法がわからない場合は、metrika.xmlを使用してください。クラスターの構成として理解できます。可用性の高いものが3つあります。シャーディング、例として2つのコピー、
このアーキテクチャについて簡単に説明します。一般的に、これらの問題を考慮せずに、最初に1台のマシンをセットアップします。高可用性クラスターを構築したい場合は、シャードとレプリカがある方が信頼性が高く、ckの使用法は、配布指定の実施形態を指定することです。たとえば、シャードmy_clusterの最初のクラスターはCK01とck02で構成されます。つまり、フラグメントです。 2つのコピーで構成されている場合、ck01マクロで指定されたマクロ変数は0101です。
機械 | シャード | レプリカ |
---|---|---|
ck01 | 01 | 01 |
ck02 | 01 | 02 |
ck03 | 02 | 01 |
ck04 | 02 | 02 |
ck05 | 03 | 01 |
ck06 | 03 | 02 |
<yandex>
<clickhouse_remote_servers>
<my_cluster>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck01</host>
<port>9000</port>
</replica>
<replica>
<host>ck02</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck03</host>
<port>9000</port>
</replica>
<replica>
<host>s-hadoop-log04</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck05</host>
<port>9000</port>
</replica>
<replica>
<host>ck06</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</clickhouse_remote_servers>
<!--zookeeper相关配置-->
<zookeeper-servers>
<node index="1">
<host>ck01</host>
<port>2181</port>
</node>
<node index="2">
<host>ck02</host>
<port>2181</port>
</node>
<node index="3">
<host>ck03</host>
<port>2181</port>
</node>
</zookeeper-servers>
<macros>
<shard>01</shard>
<replica>01</replica>
</macros>
<networks>
<ip>::/0</ip>
</networks>
<clickhouse_compression>
<case>
<min_part_size>10000000000</min_part_size>
<min_part_size_ratio>0.01</min_part_size_ratio>
<method>lz4</method>
</case>
</clickhouse_compression>
</yandex>
users.xml基本的なユーザー管理ユーザー名:デフォルトのパスワード:123456
<yandex>
<!-- Profiles of settings. -->
<profiles>
<!-- Default settings. -->
<default>
<!-- Maximum memory usage for processing single query, in bytes. -->
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
</default>
<!-- Profile that allows only read queries. -->
<readonly>
<readonly>1</readonly>
</readonly>
</profiles>
<!-- Users and ACL. -->
<users>
<default>
<password>123456</password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
<guest>
<password></password>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
</guest>
</users>
<!-- Quotas. -->
<quotas>
<!-- Name of quota. -->
<default>
<!-- Limits for time interval. You could specify many intervals with different limits. -->
<interval>
<!-- Length of interval. -->
<duration>3600</duration>
<!-- No limits. Just calculate resource usage for time interval. -->
<queries>0</queries>
<errors>0</errors>
<result_rows>0</result_rows>
<read_rows>0</read_rows>
<execution_time>0</execution_time>
</interval>
</default>
</quotas>
</yandex>
フォルダ
/ xxx / clickhouse / conf
/ xxx / clickhouse / log
/ xx / clickhouse / data / clickhouse-serverを作成します
docker-compose-server.yml
version: '3.7'
services:
clickhouse-server:
image: clickhouse:v20.5.4
restart: always
network_mode: "host"
container_name: "clickhouse-server"
ports:
- "9000:9000"
- "9440:9440"
- "9009:9009"
- "8123:8123"
volumes:
- "/xxx/clickhouse/conf:/etc/clickhouse-server"
- "/xxx/clickhouse/log:/var/clickhouse/log"
- "/xxx/clickhouse/data/clickhouse-server:/var/clickhouse/data"
- "/etc/localtime:/etc/localtime:ro"
アップグレード+拡張
アップグレードの前に手順をお読みください。通常、アップグレードはローリングアップグレードです。現在のイメージを再イメージ化して置き換えることができます。
拡張はmetrika.xmlで構成する方が簡単です。たとえば、さらに2台のマシンck07と
ck08があります。 my_clusterに追加されました。
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ck07</host>
<port>9000</port>
</replica>
<replica>
<host>ck08</host>
<port>9000</port>
</replica>
</shard>
次に、07と08のマクロの変数04-01と04-02をそれぞれ変更します。
使用する
アプリケーションシナリオは、ユーザーポートレートT + 1であり、高速サークル選択、機能スクリーニング、高速クエリ、およびレポート表示を提供します。
ui
http://ui.tabix.io/#!/login外部UIはログイン後に使用され、監視があります
テーブルを作成します(例としてユーザーポートレートテーブルを取り上げます)
-- 创建ck表 高可用表 ON CLUSTER my_cluster的意思是在这个集群上创建,不写只会在一台机器上有这个表
CREATE TABLE `user_profile` ON CLUSTER my_cluster (
user_id Bigint comment '用户id',
user_name String comment '用户名称',
user_desc String comment '用户简介',
card_name String comment '身份证姓名',
...
partition_date Int comment '时间分区'
)
-- {shard} {replica} 是你在metrika.xml指定的宏变量
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_profile', '{replica}')
PARTITION BY partition_date
ORDER BY user_id
SETTINGS index_granularity = 8192;
-- 创建ck表 分布式表,上边的表是每台机器上都有的本地表,不同分片之间的数据不会互通,只查询上表,数据是一个分片的数据,这个表是所有分片上表的一个映射,查询分布式表是所有分片数据的总和
create table user_profile_all ON CLUSTER my_cluster as user_profile
ENGINE = Distributed(my_cluster, default, user_profile, rand());
ハイブからテーブルをインポートする
hdfsからローカルにインポートし、ローカルからckにインポートします
。6クラスター、13Gデータ、4000万個、データ取得に4分、データのインポートに6分
#!/bin/bash
echo "select * from test.user_profile where partition_date=$1"
hive -e "SET hive.exec.compress.output=false; insert overwrite local directory '/home/tmp/test/user_profile/$1' row format delimited fields terminated by '\001' STORED AS TEXTFILE select * from test.user_profile where partition_date=$1"
echo "load csv to ck"
delimiter=$'\001'
cat ./$1/* | sed 's/"/\\"/g'| sed "s/'/\\\'/g"|clickhouse-client --host=ck01 --port=9000 --user=default --format_csv_delimiter="$delimiter" --query="INSERT INTO default.user_profile_all FORMAT CSV"
echo "load down! remove file"
rm -rf ./$1
-- 复杂数据类型,第47列是array[int]
cat 20200714/* | sed 's/"/\\"/g'| sed "s/'/\\\'/g" | sed "s/\x02/, /g" | awk -F '\x01' '{
for(i=1;i<=NF;i++) {
if(i==NF){print $i}
else if( i==47 ){printf "["$i"]""\x01"}
else {printf $i"\x01"}
}}' | clickhouse-client --host=ck01 --port=9000 --user=default --format_csv_delimiter=$'\001' --query="INSERT INTO default.user_user_profile_all FORMAT CSV"
dbガイドテーブル
CREATE TABLE tablename ENGINE = MergeTree ORDER BY id AS
SELECT *
FROM mysql('host:port', 'databasename', 'tablename', 'username', 'password')
変更
-- 删除分区
ALTER TABLE default.tablename ON CLUSTER my_cluster delete where partition_date=20200615
-- 添加列
alter table tablename ON CLUSTER my_cluster add column cost int default 0 after user_id
-- 删除列
alter table tablename ON CLUSTER my_cluster drop column cost
-- 注视
alter table tablename ON CLUSTER my_cluster comment column cost 'test'
-- 更改类型
alter table tablename ON CLUSTER my_cluster modify column cost String
-- 更改列名 (2020年9月初会更新至20.5.4,之后版本可用)
alter table default.tablename ON CLUSTER my_cluster rename column `oldname` to `newname`;
問題
これらの問題のため、ClickHouseをあきらめて使い続けましょう
- トランザクションをサポートせず、実際の削除/更新をサポートしません。実際には削除できますが、データの一部を非同期で削除するには1分かかります。
- 高い同時実行性はサポートされていません。公式の推奨事項は、qpsを100にすることです。構成ファイルを変更することで接続数を増やすことができますが、サーバーに十分な場合は、テストフェーズで問題ありません。
- SQLは日常的に使用される文法の80%以上を満たし、結合の記述方法は非常に特殊です。最新バージョンはすでにSQLと同様の結合をサポートしていますが、パフォーマンスは良くありません。
- ClickHouseの最下層は引き続き非同期データのマージを実行し、クエリのパフォーマンスに影響を与えるため、1,000を超えるバッチ書き込みを実行し、行ごとの挿入または小さなバッチの挿入、更新、削除操作を回避してください。リアルタイムのデータ書き込み。時間を避けてください。準リアルタイムの書き込みの状況に対応できません。
- Clickhouseは並列処理メカニズムを使用しているため高速です。クエリでもサーバーのCPUの半分を使用して実行されるため、ClickHouseは同時実行性の高い使用シナリオをサポートできません。デフォルトの単一クエリはサーバーコアの半分を使用します。サーバーコアの数は自動的に識別され、このパラメーターは構成ファイルを介して変更できます。
- C ++で書かれているため、中小企業は大規模に使用しており、誰も問題を解決できません。