1.1 miljard taxiritte: 108-kern ClickHouse-kluster

Die vertaling van die artikel is spesifiek vir die studente van die kursus voorberei Data Ingenieur.

1.1 miljard taxiritte: 108-kern ClickHouse-kluster

klikhuis is 'n oopbron kolom databasis. Dit is 'n wonderlike omgewing waar honderde ontleders vinnig navrae oor data kan doen, selfs wanneer tienmiljarde nuwe rekords per dag ingevoer word. Infrastruktuurkoste om so 'n stelsel te ondersteun kan so hoog as $100 10 per jaar wees, en moontlik die helfte daarvan, afhangend van gebruik. Op 'n stadium het die ClickHouse-installasie van Yandex Metrica XNUMX triljoen rekords bevat. Benewens Yandex, was ClickHouse ook suksesvol met Bloomberg en Cloudflare.

Twee jaar gelede het ek spandeer vergelykende analise databasisse wat een masjien gebruik, en dit het geword die vinnigste gratis databasis sagteware wat ek nog ooit gesien het. Sedertdien het ontwikkelaars nie opgehou om funksies by te voeg nie, insluitend ondersteuning vir Kafka, HDFS en ZStandard-kompressie. Verlede jaar het hulle ondersteuning bygevoeg vir kaskade-kompressiemetodes, en delta-van-delta kodering moontlik geword het. Wanneer tydreeksdata saamgepers word, kan maatwaardes goed saamgepers word met delta-kodering, maar vir tellers sal delta-van-delta-kodering beter wees. Goeie kompressie het die sleutel tot ClickHouse-prestasie geword.

ClickHouse bestaan ​​uit 170 235 reëls C++-kode, derdeparty-biblioteke uitgesluit, en is een van die kleinste kodebasisse vir verspreide databasisse. In vergelyking, SQLite ondersteun nie verspreiding nie en bestaan ​​uit 207 XNUMX reëls C-kode.Ten tyde van hierdie skrywe het XNUMX ingenieurs bygedra tot ClickHouse, en die pleegkoers het die afgelope tyd toegeneem.

In Maart 2017 het ClickHouse begin optree veranderingslogboek as 'n maklike manier om ontwikkeling op te spoor. Hulle het ook die monolitiese dokumentasielêer opgebreek in 'n Markdown-gebaseerde lêerhiërargie. Kwessies en kenmerke word nagespoor via GitHub, en oor die algemeen het hierdie sagteware die afgelope paar jaar baie meer toeganklik geword.

In hierdie artikel gaan ek kyk na die werkverrigting van 'n ClickHouse-kluster op AWS EC2 wat 36-kern verwerkers en NVMe-berging gebruik.

UPDATE: 'n Week na die oorspronklike publikasie van hierdie pos het ek die toets met 'n verbeterde konfigurasie weer laat loop en baie beter resultate behaal. Hierdie plasing is opgedateer om hierdie veranderinge te weerspieël.

Bestuur 'n AWS EC2-kluster

Ek sal drie c5d.9xlarge EC2-gevalle vir hierdie pos gebruik. Elkeen van hulle bevat 36 vCPU's, 72 GB RAM, 900 GB NVMe SSD-berging, en ondersteun 10 Gigabit-netwerke. Hulle kos $1,962 1/uur elk in eu-west-16.04 wanneer dit op aanvraag bekendgestel word. Ek sal Ubuntu Server XNUMX LTS as my bedryfstelsel gebruik.

Die firewall is so opgestel dat elke masjien sonder beperking met mekaar kan kommunikeer, en net my IPv4-adres word deur SSH in die cluster gewitlys.

NVMe ry in operasionele gereedheid

Vir ClickHouse om te werk, sal ek 'n EXT4-lêerstelsel op die NVMe-aandrywer op elk van die bedieners skep.

$ sudo mkfs -t ext4 /dev/nvme1n1
$ sudo mkdir /ch
$ sudo mount /dev/nvme1n1 /ch

Sodra alles opgestel is, kan jy die monteerpunt sien en 783 GB spasie beskikbaar op elke stelsel.

$ lsblk

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  87.9M  1 loop /snap/core/5742
loop1         7:1    0  16.5M  1 loop /snap/amazon-ssm-agent/784
nvme0n1     259:1    0     8G  0 disk
└─nvme0n1p1 259:2    0     8G  0 part /
nvme1n1     259:0    0 838.2G  0 disk /ch

$ df -h

Filesystem      Size  Used Avail Use% Mounted on
udev             35G     0   35G   0% /dev
tmpfs           6.9G  8.8M  6.9G   1% /run
/dev/nvme0n1p1  7.7G  967M  6.8G  13% /
tmpfs            35G     0   35G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            35G     0   35G   0% /sys/fs/cgroup
/dev/loop0       88M   88M     0 100% /snap/core/5742
/dev/loop1       17M   17M     0 100% /snap/amazon-ssm-agent/784
tmpfs           6.9G     0  6.9G   0% /run/user/1000
/dev/nvme1n1    825G   73M  783G   1% /ch

Die datastel wat ek in hierdie toets gaan gebruik, is 'n datastorting wat ek gegenereer het uit 1.1 miljard taxiritte in New York oor ses jaar. Blog 'n Biljoen taxiritte in rooiverskuiwing besonderhede oor hoe ek hierdie datastel versamel het. Hulle word in AWS S3 gestoor, so ek sal die AWS CLI opstel met my toegang en geheime sleutels.

$ sudo apt update
$ sudo apt install awscli
$ aws configure

Ek sal die kliënt se gelyktydige versoeklimiet op 100 stel sodat lêers vinniger laai as die verstekinstellings.

$ aws configure set 
    default.s3.max_concurrent_requests 
    100

Ek sal die taxiritdatastel van AWS S3 aflaai en dit op 'n NVMe-stasie op die eerste bediener stoor. Hierdie datastel is ~104 GB in GZIP saamgeperste CSV-formaat.

$ sudo mkdir -p /ch/csv
$ sudo chown -R ubuntu /ch/csv
$ aws s3 sync s3://<bucket>/csv /ch/csv

Installeer ClickHouse

Ek sal die OpenJDK-verspreiding vir Java 8 installeer, aangesien dit nodig is om Apache ZooKeeper te laat loop, wat nodig is vir 'n verspreide ClickHouse-installasie op al drie masjiene.

$ sudo apt update
$ sudo apt install 
    openjdk-8-jre 
    openjdk-8-jdk-headless

Toe stel ek die omgewingsveranderlike JAVA_HOME.

$ sudo vi /etc/profile
 
export JAVA_HOME=/usr
 
$ source /etc/profile

Ek sal dan Ubuntu se pakketbestuurstelsel gebruik om ClickHouse 18.16.1, glances en ZooKeeper op al drie masjiene te installeer.

$ sudo apt-key adv 
    --keyserver hkp://keyserver.ubuntu.com:80 
    --recv E0C56BD4
$ echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | 
    sudo tee /etc/apt/sources.list.d/clickhouse.list
$ sudo apt-get update

$ sudo apt install 
    clickhouse-client 
    clickhouse-server 
    glances 
    zookeeperd

Ek sal 'n gids vir ClickHouse skep en ook 'n paar konfigurasie-oorskrywings op al drie bedieners doen.

$ sudo mkdir /ch/clickhouse
$ sudo chown -R clickhouse /ch/clickhouse

$ sudo mkdir -p /etc/clickhouse-server/conf.d
$ sudo vi /etc/clickhouse-server/conf.d/taxis.conf

Dit is die konfigurasie-oorskrywings wat ek sal gebruik.

<?xml version="1.0"?>
<yandex>
    <listen_host>0.0.0.0</listen_host>
    <path>/ch/clickhouse/</path>

 <remote_servers>
        <perftest_3shards>
            <shard>
                <replica>
                    <host>172.30.2.192</host>
                    <port>9000</port>
                 </replica>
            </shard>
            <shard>
                 <replica>
                    <host>172.30.2.162</host>
                    <port>9000</port>
                 </replica>
            </shard>
            <shard>
                 <replica>
                    <host>172.30.2.36</host>
                    <port>9000</port>
                 </replica>
            </shard>
        </perftest_3shards>
    </remote_servers>

  <zookeeper-servers>
        <node>
            <host>172.30.2.192</host>
            <port>2181</port>
        </node>
        <node>
            <host>172.30.2.162</host>
            <port>2181</port>
        </node>
        <node>
            <host>172.30.2.36</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>

 <macros>
        <shard>03</shard>
        <replica>01</replica>
    </macros>
</yandex>

Dan sal ek ZooKeeper en die ClickHouse-bediener op al drie masjiene begin.

$ sudo /etc/init.d/zookeeper start
$ sudo service clickhouse-server start

Laai data op na ClickHouse

Op die eerste bediener sal ek 'n reistabel skep (trips) wat 'n datastel van taxiritte sal stoor deur die Log-enjin te gebruik.

$ clickhouse-client --host=0.0.0.0
 
CREATE TABLE trips (
    trip_id                 UInt32,
    vendor_id               String,

    pickup_datetime         DateTime,
    dropoff_datetime        Nullable(DateTime),

    store_and_fwd_flag      Nullable(FixedString(1)),
    rate_code_id            Nullable(UInt8),
    pickup_longitude        Nullable(Float64),
    pickup_latitude         Nullable(Float64),
    dropoff_longitude       Nullable(Float64),
    dropoff_latitude        Nullable(Float64),
    passenger_count         Nullable(UInt8),
    trip_distance           Nullable(Float64),
    fare_amount             Nullable(Float32),
    extra                   Nullable(Float32),
    mta_tax                 Nullable(Float32),
    tip_amount              Nullable(Float32),
    tolls_amount            Nullable(Float32),
    ehail_fee               Nullable(Float32),
    improvement_surcharge   Nullable(Float32),
    total_amount            Nullable(Float32),
    payment_type            Nullable(String),
    trip_type               Nullable(UInt8),
    pickup                  Nullable(String),
    dropoff                 Nullable(String),

    cab_type                Nullable(String),

    precipitation           Nullable(Int8),
    snow_depth              Nullable(Int8),
    snowfall                Nullable(Int8),
    max_temperature         Nullable(Int8),
    min_temperature         Nullable(Int8),
    average_wind_speed      Nullable(Int8),

    pickup_nyct2010_gid     Nullable(Int8),
    pickup_ctlabel          Nullable(String),
    pickup_borocode         Nullable(Int8),
    pickup_boroname         Nullable(String),
    pickup_ct2010           Nullable(String),
    pickup_boroct2010       Nullable(String),
    pickup_cdeligibil       Nullable(FixedString(1)),
    pickup_ntacode          Nullable(String),
    pickup_ntaname          Nullable(String),
    pickup_puma             Nullable(String),

    dropoff_nyct2010_gid    Nullable(UInt8),
    dropoff_ctlabel         Nullable(String),
    dropoff_borocode        Nullable(UInt8),
    dropoff_boroname        Nullable(String),
    dropoff_ct2010          Nullable(String),
    dropoff_boroct2010      Nullable(String),
    dropoff_cdeligibil      Nullable(String),
    dropoff_ntacode         Nullable(String),
    dropoff_ntaname         Nullable(String),
    dropoff_puma            Nullable(String)
) ENGINE = Log;

Ek pak dan elkeen van die CSV-lêers uit en laai in 'n reistabel (trips). Die volgende word in 55 minute en 10 sekondes voltooi. Na hierdie operasie was die grootte van die datagids 134 GB.

$ time (for FILENAME in /ch/csv/trips_x*.csv.gz; do
            echo $FILENAME
            gunzip -c $FILENAME | 
                clickhouse-client 
                    --host=0.0.0.0 
                    --query="INSERT INTO trips FORMAT CSV"
        done)

Die invoerspoed was 155 MB ongecomprimeerde CSV-inhoud per sekonde. Ek vermoed dit was as gevolg van 'n bottelnek in GZIP-dekompressie. Dit was dalk vinniger om alle gzip-lêers parallel te dekomprimeer deur xargs te gebruik en dan die gedekomprimeerde data af te laai. Hieronder is 'n beskrywing van wat tydens die CSV-invoerproses aangemeld is.

$ sudo glances

ip-172-30-2-200 (Ubuntu 16.04 64bit / Linux 4.4.0-1072-aws)                                                                                                 Uptime: 0:11:42
CPU       8.2%  nice:     0.0%                           LOAD    36-core                           MEM      9.8%  active:    5.20G                           SWAP      0.0%
user:     6.0%  irq:      0.0%                           1 min:    2.24                            total:  68.7G  inactive:  61.0G                           total:       0
system:   0.9%  iowait:   1.3%                           5 min:    1.83                            used:   6.71G  buffers:   66.4M                           used:        0
idle:    91.8%  steal:    0.0%                           15 min:   1.01                            free:   62.0G  cached:    61.6G                           free:        0

NETWORK     Rx/s   Tx/s   TASKS 370 (507 thr), 2 run, 368 slp, 0 oth sorted automatically by cpu_percent, flat view
ens5        136b    2Kb
lo         343Mb  343Mb     CPU%  MEM%  VIRT   RES   PID USER        NI S    TIME+ IOR/s IOW/s Command
                           100.4   1.5 1.65G 1.06G  9909 ubuntu       0 S  1:01.33     0     0 clickhouse-client --host=0.0.0.0 --query=INSERT INTO trips FORMAT CSV
DISK I/O     R/s    W/s     85.1   0.0 4.65M  708K  9908 ubuntu       0 R  0:50.60   32M     0 gzip -d -c /ch/csv/trips_xac.csv.gz
loop0          0      0     54.9   5.1 8.14G 3.49G  8091 clickhous    0 S  1:44.23     0   45M /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
loop1          0      0      4.5   0.0     0     0   319 root         0 S  0:07.50    1K     0 kworker/u72:2
nvme0n1        0     3K      2.3   0.0 91.1M 28.9M  9912 root         0 R  0:01.56     0     0 /usr/bin/python3 /usr/bin/glances
nvme0n1p1      0     3K      0.3   0.0     0     0   960 root       -20 S  0:00.10     0     0 kworker/28:1H
nvme1n1    32.1M   495M      0.3   0.0     0     0  1058 root       -20 S  0:00.90     0     0 kworker/23:1H

Ek sal spasie op die NVMe-stasie vrymaak deur die oorspronklike CSV-lêers uit te vee voordat ek voortgaan.

$ sudo rm -fr /ch/csv

Skakel om na kolomvorm

Die Log ClickHouse-enjin sal data in 'n string-georiënteerde formaat stoor. Om die data vinniger te bevraagteken, skakel ek dit om na 'n kolomformaat deur die MergeTree-enjin te gebruik.

$ clickhouse-client --host=0.0.0.0

Die volgende word in 34 minute en 50 sekondes voltooi. Na hierdie operasie was die grootte van die datagids 237 GB.

CREATE TABLE trips_mergetree
    ENGINE = MergeTree(pickup_date, pickup_datetime, 8192)
    AS SELECT
        trip_id,
        CAST(vendor_id AS Enum8('1' = 1,
                                '2' = 2,
                                'CMT' = 3,
                                'VTS' = 4,
                                'DDS' = 5,
                                'B02512' = 10,
                                'B02598' = 11,
                                'B02617' = 12,
                                'B02682' = 13,
                                'B02764' = 14)) AS vendor_id,
        toDate(pickup_datetime)                 AS pickup_date,
        ifNull(pickup_datetime, toDateTime(0))  AS pickup_datetime,
        toDate(dropoff_datetime)                AS dropoff_date,
        ifNull(dropoff_datetime, toDateTime(0)) AS dropoff_datetime,
        assumeNotNull(store_and_fwd_flag)       AS store_and_fwd_flag,
        assumeNotNull(rate_code_id)             AS rate_code_id,

        assumeNotNull(pickup_longitude)         AS pickup_longitude,
        assumeNotNull(pickup_latitude)          AS pickup_latitude,
        assumeNotNull(dropoff_longitude)        AS dropoff_longitude,
        assumeNotNull(dropoff_latitude)         AS dropoff_latitude,
        assumeNotNull(passenger_count)          AS passenger_count,
        assumeNotNull(trip_distance)            AS trip_distance,
        assumeNotNull(fare_amount)              AS fare_amount,
        assumeNotNull(extra)                    AS extra,
        assumeNotNull(mta_tax)                  AS mta_tax,
        assumeNotNull(tip_amount)               AS tip_amount,
        assumeNotNull(tolls_amount)             AS tolls_amount,
        assumeNotNull(ehail_fee)                AS ehail_fee,
        assumeNotNull(improvement_surcharge)    AS improvement_surcharge,
        assumeNotNull(total_amount)             AS total_amount,
        assumeNotNull(payment_type)             AS payment_type_,
        assumeNotNull(trip_type)                AS trip_type,

        pickup AS pickup,
        pickup AS dropoff,

        CAST(assumeNotNull(cab_type)
            AS Enum8('yellow' = 1, 'green' = 2))
                                AS cab_type,

        precipitation           AS precipitation,
        snow_depth              AS snow_depth,
        snowfall                AS snowfall,
        max_temperature         AS max_temperature,
        min_temperature         AS min_temperature,
        average_wind_speed      AS average_wind_speed,

        pickup_nyct2010_gid     AS pickup_nyct2010_gid,
        pickup_ctlabel          AS pickup_ctlabel,
        pickup_borocode         AS pickup_borocode,
        pickup_boroname         AS pickup_boroname,
        pickup_ct2010           AS pickup_ct2010,
        pickup_boroct2010       AS pickup_boroct2010,
        pickup_cdeligibil       AS pickup_cdeligibil,
        pickup_ntacode          AS pickup_ntacode,
        pickup_ntaname          AS pickup_ntaname,
        pickup_puma             AS pickup_puma,

        dropoff_nyct2010_gid    AS dropoff_nyct2010_gid,
        dropoff_ctlabel         AS dropoff_ctlabel,
        dropoff_borocode        AS dropoff_borocode,
        dropoff_boroname        AS dropoff_boroname,
        dropoff_ct2010          AS dropoff_ct2010,
        dropoff_boroct2010      AS dropoff_boroct2010,
        dropoff_cdeligibil      AS dropoff_cdeligibil,
        dropoff_ntacode         AS dropoff_ntacode,
        dropoff_ntaname         AS dropoff_ntaname,
        dropoff_puma            AS dropoff_puma
    FROM trips;

Dit is hoe die blikuitset gelyk het tydens die operasie:

ip-172-30-2-200 (Ubuntu 16.04 64bit / Linux 4.4.0-1072-aws)                                                                                                 Uptime: 1:06:09
CPU      10.3%  nice:     0.0%                           LOAD    36-core                           MEM     16.1%  active:    13.3G                           SWAP      0.0%
user:     7.9%  irq:      0.0%                           1 min:    1.87                            total:  68.7G  inactive:  52.8G                           total:       0
system:   1.6%  iowait:   0.8%                           5 min:    1.76                            used:   11.1G  buffers:   71.8M                           used:        0
idle:    89.7%  steal:    0.0%                           15 min:   1.95                            free:   57.6G  cached:    57.2G                           free:        0

NETWORK     Rx/s   Tx/s   TASKS 367 (523 thr), 1 run, 366 slp, 0 oth sorted automatically by cpu_percent, flat view
ens5         1Kb    8Kb
lo           2Kb    2Kb     CPU%  MEM%  VIRT   RES   PID USER        NI S    TIME+ IOR/s IOW/s Command
                           241.9  12.8 20.7G 8.78G  8091 clickhous    0 S 30:36.73   34M  125M /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
DISK I/O     R/s    W/s      2.6   0.0 90.4M 28.3M  9948 root         0 R  1:18.53     0     0 /usr/bin/python3 /usr/bin/glances
loop0          0      0      1.3   0.0     0     0   203 root         0 S  0:09.82     0     0 kswapd0
loop1          0      0      0.3   0.1  315M 61.3M 15701 ubuntu       0 S  0:00.40     0     0 clickhouse-client --host=0.0.0.0
nvme0n1        0     3K      0.3   0.0     0     0     7 root         0 S  0:00.83     0     0 rcu_sched
nvme0n1p1      0     3K      0.0   0.0     0     0   142 root         0 S  0:00.22     0     0 migration/27
nvme1n1    25.8M   330M      0.0   0.0 59.7M 1.79M  2764 ubuntu       0 S  0:00.00     0     0 (sd-pam)

In die laaste toets is verskeie kolomme omgeskakel en herbereken. Ek het gevind dat sommige van hierdie funksies nie meer behoorlik op hierdie datastel werk nie. Om hierdie probleem op te los, het ek die onvanpaste funksies verwyder en die data gelaai sonder om na meer fynkorrelige tipes om te skakel.

Verspreiding van groepdata

Ek sal data oor al drie cluster nodusse versprei. Om te begin, sal ek hieronder 'n tabel op al drie masjiene skep.

$ clickhouse-client --host=0.0.0.0

CREATE TABLE trips_mergetree_third (
    trip_id                 UInt32,
    vendor_id               String,
    pickup_date             Date,
    pickup_datetime         DateTime,
    dropoff_date            Date,
    dropoff_datetime        Nullable(DateTime),
    store_and_fwd_flag      Nullable(FixedString(1)),
    rate_code_id            Nullable(UInt8),
    pickup_longitude        Nullable(Float64),
    pickup_latitude         Nullable(Float64),
    dropoff_longitude       Nullable(Float64),
    dropoff_latitude        Nullable(Float64),
    passenger_count         Nullable(UInt8),
    trip_distance           Nullable(Float64),
    fare_amount             Nullable(Float32),
    extra                   Nullable(Float32),
    mta_tax                 Nullable(Float32),
    tip_amount              Nullable(Float32),
    tolls_amount            Nullable(Float32),
    ehail_fee               Nullable(Float32),
    improvement_surcharge   Nullable(Float32),
    total_amount            Nullable(Float32),
    payment_type            Nullable(String),
    trip_type               Nullable(UInt8),
    pickup                  Nullable(String),
    dropoff                 Nullable(String),

    cab_type                Nullable(String),

    precipitation           Nullable(Int8),
    snow_depth              Nullable(Int8),
    snowfall                Nullable(Int8),
    max_temperature         Nullable(Int8),
    min_temperature         Nullable(Int8),
    average_wind_speed      Nullable(Int8),

    pickup_nyct2010_gid     Nullable(Int8),
    pickup_ctlabel          Nullable(String),
    pickup_borocode         Nullable(Int8),
    pickup_boroname         Nullable(String),
    pickup_ct2010           Nullable(String),
    pickup_boroct2010       Nullable(String),
    pickup_cdeligibil       Nullable(FixedString(1)),
    pickup_ntacode          Nullable(String),
    pickup_ntaname          Nullable(String),
    pickup_puma             Nullable(String),

    dropoff_nyct2010_gid    Nullable(UInt8),
    dropoff_ctlabel         Nullable(String),
    dropoff_borocode        Nullable(UInt8),
    dropoff_boroname        Nullable(String),
    dropoff_ct2010          Nullable(String),
    dropoff_boroct2010      Nullable(String),
    dropoff_cdeligibil      Nullable(String),
    dropoff_ntacode         Nullable(String),
    dropoff_ntaname         Nullable(String),
    dropoff_puma            Nullable(String)
) ENGINE = MergeTree(pickup_date, pickup_datetime, 8192);

Dan sal ek seker maak dat die eerste bediener al drie nodusse in die groepie kan sien.

SELECT *
FROM system.clusters
WHERE cluster = 'perftest_3shards'
FORMAT Vertical;
Row 1:
──────
cluster:          perftest_3shards
shard_num:        1
shard_weight:     1
replica_num:      1
host_name:        172.30.2.192
host_address:     172.30.2.192
port:             9000
is_local:         1
user:             default
default_database:
Row 2:
──────
cluster:          perftest_3shards
shard_num:        2
shard_weight:     1
replica_num:      1
host_name:        172.30.2.162
host_address:     172.30.2.162
port:             9000
is_local:         0
user:             default
default_database:

Row 3:
──────
cluster:          perftest_3shards
shard_num:        3
shard_weight:     1
replica_num:      1
host_name:        172.30.2.36
host_address:     172.30.2.36
port:             9000
is_local:         0
user:             default
default_database:

Dan sal ek 'n nuwe tabel op die eerste bediener definieer wat op die skema gebaseer is trips_mergetree_third en gebruik die Distributed-enjin.

CREATE TABLE trips_mergetree_x3
    AS trips_mergetree_third
    ENGINE = Distributed(perftest_3shards,
                         default,
                         trips_mergetree_third,
                         rand());

Dan sal ek die data van die MergeTree-gebaseerde tabel na al drie bedieners kopieer. Die volgende word in 34 minute en 44 sekondes voltooi.

INSERT INTO trips_mergetree_x3
    SELECT * FROM trips_mergetree;

Na bogenoemde operasie het ek ClickHouse 15 minute gegee om verby die maksimum stoormerk te kom. Die datagidse was uiteindelik onderskeidelik 264 GB, 34 GB en 33 GB op elk van die drie bedieners.

ClickHouse-klusterprestasie-evaluering

Wat ek volgende gesien het, was die vinnigste tyd wat ek gesien het toe ek elke navraag verskeie kere op die tafel uitgevoer het trips_mergetree_x3.

$ clickhouse-client --host=0.0.0.0

Die volgende word in 2.449 sekondes voltooi.

SELECT cab_type, count(*)
FROM trips_mergetree_x3
GROUP BY cab_type;

Die volgende word in 0.691 sekondes voltooi.

SELECT passenger_count,
       avg(total_amount)
FROM trips_mergetree_x3
GROUP BY passenger_count;

Die volgende word in 0 sekondes gedoen.

SELECT passenger_count,
       toYear(pickup_date) AS year,
       count(*)
FROM trips_mergetree_x3
GROUP BY passenger_count,
         year;

Die volgende word in 0.983 sekondes voltooi.

SELECT passenger_count,
       toYear(pickup_date) AS year,
       round(trip_distance) AS distance,
       count(*)
FROM trips_mergetree_x3
GROUP BY passenger_count,
         year,
         distance
ORDER BY year,
         count(*) DESC;

Ter vergelyking het ek dieselfde navrae uitgevoer op 'n MergeTree-gebaseerde tabel wat uitsluitlik op die eerste bediener woon.

Enkelnode prestasie-evaluering ClickHouse

Wat ek volgende gesien het, was die vinnigste tyd wat ek gesien het toe ek elke navraag verskeie kere op die tafel uitgevoer het trips_mergetree_x3.

Die volgende word in 0.241 sekondes voltooi.

SELECT cab_type, count(*)
FROM trips_mergetree
GROUP BY cab_type;

Die volgende word in 0.826 sekondes voltooi.

SELECT passenger_count,
       avg(total_amount)
FROM trips_mergetree
GROUP BY passenger_count;

Die volgende word in 1.209 sekondes voltooi.

SELECT passenger_count,
       toYear(pickup_date) AS year,
       count(*)
FROM trips_mergetree
GROUP BY passenger_count,
         year;

Die volgende word in 1.781 sekondes voltooi.

SELECT passenger_count,
       toYear(pickup_date) AS year,
       round(trip_distance) AS distance,
       count(*)
FROM trips_mergetree
GROUP BY passenger_count,
         year,
         distance
ORDER BY year,
         count(*) DESC;

Besinning oor resultate

Dit is die eerste keer dat 'n gratis SVE-gebaseerde databasis 'n GPU-gebaseerde databasis in my toetse kon vaar. Daardie GPU-gebaseerde databasis het sedertdien twee hersienings ondergaan, maar steeds is die werkverrigting wat ClickHouse op 'n enkele nodus getoon het, baie indrukwekkend.

Terselfdertyd, wanneer navraag 1 op 'n verspreide enjin uitgevoer word, is die oorhoofse koste 'n orde van grootte hoër. Ek hoop ek het iets in my navorsing vir hierdie pos gemis, want dit sal lekker wees om te sien dat navraagtye afneem namate ek meer nodusse by die groep voeg. Dit is egter merkwaardig dat wanneer ander navrae uitgevoer word, prestasie met ongeveer 2 keer toegeneem het.

Dit sal lekker wees as ClickHouse ontwikkel in die rigting om berging en berekening te skei sodat hulle onafhanklik kan skaal. Ondersteuning vir HDFS, wat verlede jaar bygevoeg is, kan 'n stap hiertoe wees. In terme van rekenaars, as 'n enkele navraag versnel kan word deur meer nodusse by die groepering te voeg, sal die toekoms van hierdie sagteware baie blink wees.

Dankie dat jy die tyd geneem het om hierdie pos te lees. Ek bied konsultasie-, argitektuur- en praktiese ontwikkelingsdienste vir kliënte in Noord-Amerika en Europa. As jy wil bespreek hoe my voorstelle jou besigheid kan help, kontak my asseblief deur LinkedIn.

Bron: will.com

Voeg 'n opmerking