1.1 milljarður leigubílaferða: 108 kjarna ClickHouse þyrping

Þýðing greinarinnar var unnin sérstaklega fyrir nemendur námskeiðsins "gagnaverkfræðingur".

1.1 milljarður leigubílaferða: 108 kjarna ClickHouse þyrping

smellahús er opinn dálkagagnagrunnur. Þetta er frábært umhverfi þar sem hundruð greiningaraðila geta leitað ítarlegra gagna á fljótlegan hátt, jafnvel þótt tugir milljarða nýrra skráa séu færðar inn á dag. Innviðakostnaður til að styðja slíkt kerfi gæti verið allt að $100 á ári, og hugsanlega helmingur það eftir notkun. Á einum tímapunkti innihélt ClickHouse uppsetningin frá Yandex Metrics 10 trilljón færslur. Auk Yandex hefur ClickHouse einnig náð árangri með Bloomberg og Cloudflare.

Fyrir tveimur árum eyddi ég samanburðargreiningu gagnagrunna með einni vél, og það varð hraðasti ókeypis gagnagrunnshugbúnað sem ég hef nokkurn tíma séð. Síðan þá hafa verktaki ekki hætt að bæta við eiginleikum, þar á meðal stuðningi við Kafka, HDFS og ZStandard þjöppun. Á síðasta ári bættu þeir við stuðningi við samþjöppunaraðferðir, og delta-frá-delta kóðun varð möguleg. Þegar tímaraðagögn eru þjappað saman er hægt að þjappa mæligildum vel með því að nota delta kóðun, en fyrir teljara væri betra að nota delta-fyrir-delta kóðun. Góð þjöppun er orðin lykillinn að frammistöðu ClickHouse.

ClickHouse samanstendur af 170 þúsund línum af C++ kóða, að þriðja aðila bókasöfnum undanskildum, og er einn minnsti dreifði kóðagrunnur gagnagrunnsins. Til samanburðar styður SQLite ekki dreifingu og samanstendur af 235 þúsund línum af C kóða. Þegar þetta er skrifað hafa 207 verkfræðingar lagt sitt af mörkum til ClickHouse og styrkleiki skuldbindinga hefur verið að aukast að undanförnu.

Í mars 2017 hóf ClickHouse að framkvæma breytingarskrá sem auðveld leið til að fylgjast með þróun. Þeir skiptu einnig upp einhæfu skjalaskránni í Markdown-undirstaða skráastigveldi. Mál og eiginleikar eru raktar í gegnum GitHub og almennt hefur hugbúnaðurinn orðið mun aðgengilegri á síðustu árum.

Í þessari grein ætla ég að skoða frammistöðu ClickHouse klasa á AWS EC2 sem notar 36 kjarna örgjörva og NVMe geymslu.

UPPFÆRSLA: Viku eftir upphaflega birtingu þessarar færslu endurkeyrði ég prófið með bættri uppsetningu og náði mun betri árangri. Þessi færsla hefur verið uppfærð til að endurspegla þessar breytingar.

Opnar AWS EC2 klasa

Ég mun nota þrjú c5d.9xlarge EC2 tilvik fyrir þessa færslu. Hver þeirra inniheldur 36 sýndar örgjörva, 72 GB af vinnsluminni, 900 GB af NVMe SSD geymslu og styður 10 Gigabit net. Þeir kosta $1,962/klst hver á eu-west-1 svæðinu þegar þeir keyra á eftirspurn. Ég mun nota Ubuntu Server 16.04 LTS sem stýrikerfi.

Eldveggurinn er stilltur þannig að hver vél getur átt samskipti sín á milli án takmarkana og aðeins IPv4 vistfangið mitt er á hvítlista af SSH í klasanum.

NVMe drif í rekstrarviðbúnaði

Til að ClickHouse virki mun ég búa til skráarkerfi á EXT4 sniði á NVMe drifi á hverjum netþjóni.

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

Þegar allt hefur verið stillt geturðu séð festingarpunktinn og 783 GB af plássi sem er í boði á hverju kerfi.

$ 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

Gagnapakkinn sem ég mun nota í þessu prófi er gagnahaugur sem ég bjó til úr 1.1 milljarði leigubílaferða sem teknar voru í New York borg á sex árum. Á blogginu Einn milljarður leigubílaferða í rauðvik upplýsingar um hvernig ég safnaði þessu gagnasetti. Þau eru geymd í AWS S3, svo ég mun stilla AWS CLI með aðganginum mínum og leynilyklum.

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

Ég mun stilla samtímis beiðni viðskiptavinarins á 100 þannig að skrám hleðst niður hraðar en sjálfgefnar stillingar.

$ aws configure set 
    default.s3.max_concurrent_requests 
    100

Ég mun hlaða niður gagnagrunni fyrir leigubílaferðir frá AWS S3 og geyma það á NVMe drifi á fyrsta netþjóninum. Þetta gagnasafn er ~104GB á GZIP-þjöppuðu CSV-sniði.

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

ClickHouse uppsetning

Ég mun setja upp OpenJDK dreifingu fyrir Java 8 þar sem það er nauðsynlegt til að keyra Apache ZooKeeper, sem er nauðsynlegt fyrir dreifða uppsetningu á ClickHouse á öllum þremur vélunum.

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

Síðan stillti ég umhverfisbreytuna JAVA_HOME.

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

Ég mun þá nota pakkastjórnunarkerfi Ubuntu til að setja upp ClickHouse 18.16.1, glances og ZooKeeper á öllum þremur vélunum.

$ 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

Ég mun búa til möppu fyrir ClickHouse og gera einnig nokkrar stillingar hnekkja á öllum þremur netþjónum.

$ 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

Þetta eru stillingarhneigðirnar sem ég mun nota.

<?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>

Ég mun þá keyra ZooKeeper og ClickHouse þjóninn á öllum þremur vélunum.

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

Hleður upp gögnum í ClickHouse

Á fyrsta þjóninum mun ég búa til ferðatöflu (trips), sem mun geyma gagnapakka af leigubílaferðum með því að nota Log vélina.

$ 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;

Ég tek síðan út og hleð hverri CSV skránni í ferðatöflu (trips). Eftirfarandi var lokið á 55 mínútum og 10 sekúndum. Eftir þessa aðgerð var stærð gagnaskrárinnar 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)

Innflutningshraðinn var 155 MB af óþjöppuðu CSV efni á sekúndu. Mig grunar að þetta hafi verið vegna flöskuhálss í GZIP þjöppun. Það gæti hafa verið fljótlegra að pakka niður öllum gzipðu skránum samhliða með því að nota xargs og hlaða svo uppþjöppuðu gögnunum. Hér að neðan er lýsing á því sem tilkynnt var í CSV innflutningsferlinu.

$ 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

Ég losa um pláss á NVMe drifinu með því að eyða upprunalegu CSV skránum áður en ég held áfram.

$ sudo rm -fr /ch/csv

Umbreyta í dálkaform

Log ClickHouse vélin mun geyma gögn á línumiðuðu sniði. Til að spyrjast fyrir um gögn hraðar, breyti ég þeim í dálkasnið með því að nota MergeTree vélina.

$ clickhouse-client --host=0.0.0.0

Eftirfarandi var lokið á 34 mínútum og 50 sekúndum. Eftir þessa aðgerð var stærð gagnaskrárinnar 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;

Svona leit úttakið út í augnablikinu meðan á aðgerðinni stóð:

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)

Í síðasta prófi var nokkrum dálkum breytt og endurreiknað. Ég komst að því að sumar þessara aðgerða virka ekki lengur eins og búist var við á þessu gagnasafni. Til að leysa þetta vandamál fjarlægði ég óviðeigandi aðgerðir og hlaðið gögnunum án þess að breyta í kornóttari gerðir.

Dreifing gagna yfir klasann

Ég mun dreifa gögnunum yfir alla þrjá klasahnúta. Til að byrja, hér að neðan mun ég búa til töflu á öllum þremur vélunum.

$ 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);

Þá mun ég ganga úr skugga um að fyrsti þjónninn geti séð alla þrjá hnúta í þyrpingunni.

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:

Þá mun ég skilgreina nýja töflu á fyrsta þjóninum sem er byggð á skemanu trips_mergetree_third og notar dreifða vélina.

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

Ég mun síðan afrita gögnin úr MergeTree byggðri töflunni á alla þrjá netþjóna. Eftirfarandi var lokið á 34 mínútum og 44 sekúndum.

INSERT INTO trips_mergetree_x3
    SELECT * FROM trips_mergetree;

Eftir ofangreinda aðgerð gaf ég ClickHouse 15 mínútur til að fara frá hámarks geymslustigi. Gagnaskrárnar enduðu á að vera 264 GB, 34 GB og 33 GB í sömu röð á hverjum af netþjónunum þremur.

Frammistöðumat ClickHouse klasa

Það sem ég sá næst var hraðasti tíminn sem ég hef séð keyra hverja fyrirspurn á borði mörgum sinnum trips_mergetree_x3.

$ clickhouse-client --host=0.0.0.0

Eftirfarandi kláraðist á 2.449 sekúndum.

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

Eftirfarandi kláraðist á 0.691 sekúndum.

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

Eftirfarandi kláraðist á 0 sekúndum.

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

Eftirfarandi kláraðist á 0.983 sekúndum.

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;

Til samanburðar rak ég sömu fyrirspurnir á MergeTree töflu sem er eingöngu á fyrsta netþjóninum.

Árangursmat á einum ClickHouse hnút

Það sem ég sá næst var hraðasti tíminn sem ég hef séð keyra hverja fyrirspurn á borði mörgum sinnum trips_mergetree_x3.

Eftirfarandi kláraðist á 0.241 sekúndum.

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

Eftirfarandi kláraðist á 0.826 sekúndum.

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

Eftirfarandi kláraðist á 1.209 sekúndum.

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

Eftirfarandi kláraðist á 1.781 sekúndum.

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;

Hugleiðingar um úrslitin

Þetta er í fyrsta skipti sem ókeypis CPU-undirstaða gagnagrunnur var fær um að standa sig betur en GPU-byggður gagnagrunnur í prófunum mínum. Þessi GPU-undirstaða gagnagrunnur hefur farið í gegnum tvær endurskoðanir síðan þá, en árangurinn sem ClickHouse skilaði á einum hnút er engu að síður mjög áhrifamikill.

Á sama tíma, þegar fyrirspurn 1 er keyrð á dreifðri vél, er kostnaður við kostnaðinn stærðargráðu hærri. Ég vona að ég hafi misst af einhverju í rannsókninni minni fyrir þessa færslu því það væri gaman að sjá fyrirspurnartímum lækka þegar ég bæti fleiri hnútum við þyrpinguna. Hins vegar er frábært að þegar aðrar fyrirspurnir eru framkvæmdar jókst árangur um það bil 2 sinnum.

Það væri gaman að sjá ClickHouse þróast í átt að því að geta aðskilið geymslu og reiknað svo þau geti skalað sjálfstætt. HDFS stuðningur, sem bætt var við á síðasta ári, gæti verið skref í átt að þessu. Hvað varðar tölvumál, ef hægt er að flýta fyrir einni fyrirspurn með því að bæta fleiri hnútum við þyrpinguna, þá er framtíð þessa hugbúnaðar mjög björt.

Þakka þér fyrir að gefa þér tíma til að lesa þessa færslu. Ég býð upp á ráðgjöf, arkitektúr og þróunarþjónustu fyrir viðskiptavini í Norður-Ameríku og Evrópu. Ef þú vilt ræða hvernig tillögur mínar geta hjálpað fyrirtækinu þínu, vinsamlegast hafðu samband við mig í gegnum LinkedIn.

Heimild: www.habr.com

Bæta við athugasemd