ClickHouseの簡単な展開とアプリケーション

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 ++で書かれているため、中小企業は大規模に使用しており、誰も問題を解決できません。

おすすめ

転載: blog.csdn.net/jklcl/article/details/112971187