1.1 mîlyar rêwîtiyên taksiyê: Komek ClickHouse ya 108-core

Wergera gotarê bi taybetî ji bo xwendekarên qursê hatiye amadekirin "Endezyar Daneyên".

1.1 mîlyar rêwîtiyên taksiyê: Komek ClickHouse ya 108-core

clickhouse databasek stûnek çavkaniyek vekirî ye. Ew hawîrdorek hêja ye ku bi sedan analîst dikarin zû daneyên hûrgulî bipirsin, her çend rojane bi deh mîlyar tomarên nû têkevin. Mesrefên binesaziyê ji bo piştgirîkirina pergalek wusa dibe ku salê bi qasî 100 $ be, û potansiyel nîvê wê jî li gorî karanîna girêdayî ye. Di yek xalê de, sazkirina ClickHouse ji Yandex Metrics 10 trîlyon tomar vedihewand. Ji bilî Yandex, ClickHouse bi Bloomberg û Cloudflare re jî serkeftin dît.

Du sal berê min derbas kir analîza berawirdî databases yek makîneyê bikar tînin, û ew bû ya herî bilez nermalava databasa belaş ku min qet dîtiye. Ji hingê ve, pêşdebiran dev ji zêdekirina taybetmendiyan bernedan, di nav de piştgiriya ji bo Kafka, HDFS û ZStandard compression. Sala çûyî wan piştgirî ji bo rêbazên komkirina kaskadî zêde kirin, û delta-ji-delta kodkirin gengaz bû. Dema ku daneyên rêzikên demê têne berhev kirin, nirxên pîvanê dikarin bi karanîna şîfrekirina deltayê baş werin berhev kirin, lê ji bo jimarvanan çêtir e ku meriv şîfrekirina delta-bi-delta bikar bîne. Tevlihevkirina baş bûye mifteya performansa ClickHouse.

ClickHouse ji 170 hezar rêzikên koda C++ pêk tê, ji bilî pirtûkxaneyên partiya sêyemîn, û yek ji piçûktirîn bingehên kodên databasê yên belavkirî ye. Di berhevdanê de, SQLite belavkirinê piştgirî nake û ji 235 hezar xêzên koda C pêk tê. Ji vê nivîsandinê ve, 207 endezyar beşdarî ClickHouse bûne, û tundiya peywiran di van demên dawî de zêde bûye.

Di Adara 2017 de, ClickHouse dest pê kir têketinê biguherîne wekî rêyek hêsan a şopandina pêşveçûnê. Wan di heman demê de pelê belgeya yekdestdar di nav hiyerarşiyek pelê ya Markdown-ê de jî perçe kirin. Pirsgirêk û taybetmendî bi navgîniya GitHub ve têne şopandin, û bi gelemperî nermalava van çend salên dawî de pir gihîştî bûye.

Di vê gotarê de, ez ê li performansa komek ClickHouse li ser AWS EC2 bi karanîna pêvajoyên 36-core û hilanîna NVMe binihêrim.

NAVENDA NÛÇEYAN: Hefteyek piştî weşandina destpêkê ya vê postê, min ceribandinê bi mîhengek çêtir ji nû ve kir û encamên pir çêtir bi dest xist. Ev post hate nûve kirin ku van guhertinan nîşan bide.

Destpêkirina Komek AWS EC2

Ez ê ji bo vê postê sê mînakên EC5 yên c9d.2xmezin bikar bînim. Her yek ji wan 36 CPU-yên virtual, 72 GB RAM, 900 GB hilanînê NVMe SSD hene û tora 10 Gigabit piştgirî dike. Dema ku li ser daxwazê ​​dimeşînin her yek li herêma eu-west-1,962 1 $ / saet lêçûn. Ez ê wekî pergala xebitandinê Ubuntu Server 16.04 LTS bikar bînim.

Firewall bi vî rengî hatî mîheng kirin ku her makîneyek bêyî sînor bi hevûdu re têkilî daynin, û tenê navnîşana IPv4 min ji hêla SSH-ê ve di nav komê de tê tomar kirin.

NVMe di rewşa amadebûna xebitandinê de ajot

Ji bo ku ClickHouse bixebite, ez ê li ser her serverek li ser ajokerek NVMe pergalek pelê bi forma EXT4 biafirînim.

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

Gava ku her tişt hate mîheng kirin, hûn dikarin xala çiyê û 783 GB cîhê ku li ser her pergalê heye bibînin.

$ 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

Daneya ku ez ê di vê ceribandinê de bikar bînim çopê daneyê ye ku min ji 1.1 mîlyar siwarên taksiyê yên ku di nav şeş salan de li New York City hatine kişandin çêkiriye. Li ser blogê Yek Milyar Rêwiyên Taksi li Redshift hûrgulî ka min çawa ev berhevoka daneyê berhev kir. Ew di AWS S3 de têne hilanîn, ji ber vê yekê ez ê AWS CLI bi bişkojkên xwe yên gihîştin û veşartî mîheng bikim.

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

Ez ê sînorê daxwaza hevdemî ya xerîdar li 100-ê destnîşan bikim da ku pelan ji mîhengên xwerû zûtir dakêşin.

$ aws configure set 
    default.s3.max_concurrent_requests 
    100

Ez ê databasa siwarên taksiyê ji AWS S3 dakêşim û wê li ser ajokerek NVMe ya li ser servera yekem hilînim. Ev danehev ~ 104 GB di formata CSV ya bi GZIP-ê de ye.

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

Sazkirina ClickHouse

Ez ê belavkirina OpenJDK-ê ji bo Java 8-ê saz bikim ji ber ku ew hewce ye ku Apache ZooKeeper bimeşîne, ku ji bo sazkirina belavkirî ya ClickHouse-ê li ser her sê makîneyan hewce ye.

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

Dûv re min guherbara jîngehê saz kir JAVA_HOME.

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

Dûv re ez ê pergala rêveberiya pakêtê ya Ubuntu bikar bînim da ku ClickHouse 18.16.1, glances û ZooKeeper li ser her sê makîneyan saz bikim.

$ 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

Ez ê ji bo ClickHouse pelrêçek biafirînim û di heman demê de li ser her sê pêşkêşkeran hin guheztinên veavakirinê jî bikim.

$ 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

Vana serpêhatiyên veavakirinê ne ku ez ê bikar bînim.

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

Dûv re ez ê ZooKeeper û servera ClickHouse li ser her sê makîneyan bimeşînim.

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

Barkirina daneyan li ClickHouse

Li ser servera yekem ez ê tabloyek rêwîtiyê biafirînim (trips), ya ku dê bi karanîna motora Têketinê databasek rêwîtiyên taksiyê hilîne.

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

Dûv re ez her pelên CSV di tabloyek rêwîtiyê de derdixim û bar dikim (trips). Ya jêrîn di 55 deqîqe û 10 çirkeyan de temam bû. Piştî vê operasyonê, mezinahiya pelrêça daneyê 134 GB bû.

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

Leza îtxalkirinê 155 MB naveroka CSV-ya nehevkirî serê saniyeyê bû. Ez guman dikim ku ev ji ber tengahiyek di hilweşandina GZIP de bû. Dibe ku bileztir bû ku hûn hemî pelên gzipped bi hev re bi karanîna xargs vekin û dûv re daneyên nezilandî bar bikin. Li jêr danasîna tiştê ku di pêvajoya importa CSV de hate ragihandin heye.

$ 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

Berî ku ez bidomînim, ez ê cîhê li ser ajokera NVMe bi jêbirina pelên CSV yên orîjînal azad bikim.

$ sudo rm -fr /ch/csv

Veguherînin Forma Stûnê

Motora Log ClickHouse dê daneyan bi rengek rêz-oriented hilîne. Ji bo ku daneyên zûtir bipirsin, ez bi karanîna motora MergeTree veguherînim forma stûnê.

$ clickhouse-client --host=0.0.0.0

Ya jêrîn di 34 deqîqe û 50 çirkeyan de temam bû. Piştî vê operasyonê, mezinahiya pelrêça daneyê 237 GB bû.

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;

Di dema operasyonê de derana nerînê ev e:

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)

Di ceribandina paşîn de, çend stûn hatin guhertin û ji nû ve hatin hesibandin. Min dît ku hin ji van fonksiyonan êdî li ser vê databasê wekî ku tê hêvî kirin naxebitin. Ji bo çareserkirina vê pirsgirêkê, min fonksiyonên neguncayî rakirin û daneyan bêyî veguheztina cûreyên granulartir bar kir.

Dabeşkirina daneyan li seranserê komê

Ez ê daneyan li her sê girêkên komê belav bikim. Ji bo destpêkê, li jêr ez ê li ser her sê makîneyan tabloyek biafirînim.

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

Dûv re ez ê piştrast bikim ku servera yekem dikare her sê girêkên di komê de bibîne.

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:

Dûv re ez ê tabloyek nû li ser servera yekem a ku li ser bingeha şêmê ye diyar bikim trips_mergetree_third û motora Distributed bikar tîne.

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

Dûv re ez ê daneyên ji tabloya bingehîn MergeTree li her sê serveran kopî bikim. Ya jêrîn di 34 deqîqe û 44 çirkeyan de temam bû.

INSERT INTO trips_mergetree_x3
    SELECT * FROM trips_mergetree;

Piştî operasyona jorîn, min 15 hûrdem da ClickHouse ku ji nîşana asta hilanînê ya herî zêde dûr bikevin. Pelên daneyan li ser her sê serveran bi rêzê 264 GB, 34 GB û 33 GB bi dawî bûn.

Nirxandina performansa komê ya ClickHouse

Tiştê ku min dû re dît dema herî zû bû ku min dît ku her pirsek li ser maseyek gelek caran dimeşîne trips_mergetree_x3.

$ clickhouse-client --host=0.0.0.0

Ya jêrîn di 2.449 çirke de temam bûye.

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

Ya jêrîn di 0.691 çirke de temam bûye.

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

Ya jêrîn di 0 çirkeyan de temam kirin.

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

Ya jêrîn di 0.983 çirke de temam bûye.

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;

Ji bo berhevdanê, min heman pirsan li ser tabloyek MergeTree-ya ku bi tenê li ser servera yekem dimîne xebitand.

Nirxandina performansa yek girêka ClickHouse

Tiştê ku min dû re dît dema herî zû bû ku min dît ku her pirsek li ser maseyek gelek caran dimeşîne trips_mergetree_x3.

Ya jêrîn di 0.241 çirke de temam bûye.

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

Ya jêrîn di 0.826 çirke de temam bûye.

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

Ya jêrîn di 1.209 çirke de temam bûye.

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

Ya jêrîn di 1.781 çirke de temam bûye.

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;

Refleksiyonên li ser encaman

Ev cara yekem e ku databasek-based CPU-ya belaş karîbû di ceribandinên min de ji databasek-based GPU-yê derkeve. Ew databasa-based GPU ji wê hingê ve di du guhertoyan re derbas bûye, lê performansa ku ClickHouse li ser yek girêkek peyda kir dîsa jî pir bi heybet e.

Di heman demê de, dema ku Query 1-ê li ser motorek belavkirî tête darve kirin, lêçûnên jorîn rêzek mezinahî mezintir in. Ez hêvî dikim ku min di lêkolîna xwe ya ji bo vê postê de tiştek winda kiriye ji ber ku xweş e ku meriv bibînim ku demên pirsê kêm dibin ji ber ku ez bêtir girêkan li komê zêde dikim. Lêbelê, pir xweş e ku dema ku lêpirsinên din têne bicîh kirin, performans bi qasî 2 carî zêde bû.

Dê xweş be ku hûn bibînin ku ClickHouse ber bi pêş ve diçe ku bikaribe hilanînê û hesabkirinê ji hev veqetîne da ku ew bi rengek serbixwe mezin bibin. Piştgiriya HDFS, ku sala borî hate zêdekirin, dikare bibe gavek ber bi vê yekê. Di warê hesabkirinê de, heke pirsek yekane bi lê zêdekirina girêkên din li komê were bilez kirin, wê hingê paşeroja vê nermalavê pir geş e.

Spas dikim ji bo ku we wext wenda kir ji bo xwendina vê postê. Ez ji xerîdarên li Amerîkaya Bakur û Ewropayê re şêwirmendî, mîmarî, û karûbarên pêşkeftinê pêşkêşî dikim. Heke hûn dixwazin nîqaş bikin ka pêşniyarên min çawa dikarin alîkariya karsaziya we bikin, ji kerema xwe bi min re têkilî daynin LinkedIn.

Source: www.habr.com

Add a comment