1.1 ملیارد ټکسي سفرونه: 108-کور کلک هاؤس کلستر

د مقالې ژباړه په ځانګړي ډول د کورس زده کونکو لپاره چمتو شوې وه د معلوماتو انجنیر.

1.1 ملیارد ټکسي سفرونه: 108-کور کلک هاؤس کلستر

ټک هاوس د خلاصې سرچینې کالمر ډیټابیس دی. دا یو ښه چاپیریال دی چیرې چې په سلګونو شنونکي کولی شي په چټکۍ سره د مفصلو معلوماتو پوښتنه وکړي، حتی په داسې حال کې چې هره ورځ لسګونه ملیارد نوي ریکارډونه داخلیږي. د داسې سیسټم مالتړ لپاره د زیربنا لګښتونه په کال کې تر 100 ډالرو پورې لوړ کیدی شي، او په احتمالي توګه نیمایي چې د کارونې پورې اړه لري. په یو وخت کې، د Yandex Metrics څخه د ClickHouse نصب 10 ټریلیون ریکارډونه درلودل. د Yandex سربیره، ClickHouse د بلومبرګ او Cloudflare سره بریالیتوب هم موندلی دی.

دوه کاله مې تېر کړل مقایسه تحلیل ډیټابیس د یو ماشین په کارولو سره، او دا شو تر ټولو چټک وړیا ډیټابیس سافټویر چې ما کله هم لیدلی دی. له هغه وخت راهیسې ، پراختیا کونکو د کافکا ، HDFS او ZStandard کمپریشن ملاتړ په شمول د ب featuresو اضافه کول بند کړي ندي. تیر کال دوی د کاسکیډینګ کمپریشن میتودونو لپاره ملاتړ اضافه کړ ، او ډیلټا له ډیلټا څخه کوډ کول ممکن شو. کله چې د وخت لړۍ ډیټا کمپریس کول ، د ګیج ارزښتونه د ډیلټا کوډ کولو په کارولو سره ښه فشار کیدی شي ، مګر د کاونټرونو لپاره دا به غوره وي چې د ډیلټا لخوا ډیلټا کوډ کول وکاروئ. ښه کمپریشن د ClickHouse د فعالیت کلیدي ګرځیدلی.

ClickHouse د C++ کوډ 170 زره لینونه لري، د دریمې ډلې کتابتونونو پرته، او د ډیټابیس ترټولو کوچنی ویشل شوي کوډ بیسونو څخه دی. په پرتله، SQLite د توزیع ملاتړ نه کوي او د C کوډ 235 زره لینونه لري. د دې لیکلو سره سم، 207 انجینرانو په ClickHouse کې ونډه اخیستې، او د ژمنو شدت پدې وروستیو کې زیات شوی.

په مارچ 2017 کې، ClickHouse ترسره کول پیل کړل بدلون لاګ د پرمختګ تعقیب ساتلو لپاره د اسانه لارې په توګه. دوی د واحد اسنادو فایل د مارک ډاون پراساس فایل درجه بندي ته هم مات کړ. مسلې او ب featuresې د GitHub له لارې تعقیب کیږي ، او په عموم کې سافټویر په تیرو څو کلونو کې خورا ډیر د لاسرسي وړ شوی.

پدې مقاله کې ، زه به د 2 کور پروسیسرونو او NVMe ذخیره کولو په کارولو سره په AWS EC36 کې د کلیک هاوس کلستر فعالیت ته یو نظر وګورم.

تازه کول: په اصل کې د دې پوسټ خپرولو څخه یوه اونۍ وروسته، ما ازموینه د ښه ترتیب سره بیا پیل کړه او ډیرې ښې پایلې یې ترلاسه کړې. دا پوسټ د دې بدلونونو منعکس کولو لپاره تازه شوی.

د AWS EC2 کلستر په لاره اچول

زه به د دې پوسټ لپاره درې c5d.9xlarge EC2 مثالونه وکاروم. هر یو یې 36 مجازی CPUs، 72 GB رام، 900 GB NVMe SSD ذخیره لري او د 10 ګیګابایټ شبکې ملاتړ کوي. دوی په eu-west-1,962 سیمه کې هر یو $ 1 / ساعت لګښت لري کله چې د غوښتنې سره مخ کیږي. زه به د اوبنټو سرور 16.04 LTS د عملیاتي سیسټم په توګه وکاروم.

د فایر وال ترتیب شوی ترڅو هر ماشین د یو بل سره پرته له کوم محدودیت سره اړیکه ونیسي، او یوازې زما IPv4 پته په کلستر کې د SSH لخوا سپین لیست شوی.

د عملیاتي چمتووالي حالت کې NVMe ډرایو

د ClickHouse د کار کولو لپاره، زه به په هر سرور کې په NVMe ډرایو کې د EXT4 بڼه کې د فایل سیسټم جوړ کړم.

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

یوځل چې هرڅه تنظیم شي ، تاسو کولی شئ د ماونټ نقطه او په هر سیسټم کې د 783 GB ځای شتون وګورئ.

$ 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

هغه ډیټاسیټ چې زه به یې پدې ازموینه کې وکاروم د ډیټا ډمپ دی چې ما د 1.1 ملیارد ټیکسي سواریو څخه رامینځته کړی چې په نیویارک ښار کې په شپږو کلونو کې اخیستل شوی. په بلاګ کې په ریډ شفټ کې د یو ملیارد ټیکسي سفرونه توضیحات چې څنګه ما دا ډاټا سیټ راټول کړل. دوی په AWS S3 کې زیرمه شوي، نو زه به AWS CLI زما د لاسرسي او پټو کیليونو سره تنظیم کړم.

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

زه به د پیرودونکي د غوښتنې حد 100 ته وټاکم ترڅو فایلونه د ډیفالټ ترتیباتو څخه ګړندي ډاونلوډ شي.

$ aws configure set 
    default.s3.max_concurrent_requests 
    100

زه به د AWS S3 څخه د ټیکسي سواری ډیټاسیټ ډاونلوډ کړم او په لومړي سرور کې به یې په NVMe ډرایو کې ذخیره کړم. دا ډیټاسیټ ~ 104GB د GZIP-کمپریس شوي CSV بڼه کې دی.

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

د کور نصبولو کلیک وکړئ

زه به د جاوا 8 لپاره د OpenJDK توزیع نصب کړم ځکه چې دا د اپاچي زوکیپر چلولو لپاره اړین دی ، کوم چې په ټولو دریو ماشینونو کې د کلیک هاوس توزیع شوي نصب لپاره اړین دی.

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

بیا ما د چاپیریال متغیر تنظیم کړ JAVA_HOME.

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

زه به بیا په ټولو دریو ماشینونو کې د ClickHouse 18.16.1، Glances او ZooKeeper نصبولو لپاره د اوبنټو کڅوړې مدیریت سیسټم وکاروم.

$ 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

زه به د ClickHouse لپاره یو لارښود جوړ کړم او په ټولو دریو سرورونو کې به ځینې ترتیبونه اوورایډونه هم ترسره کړم.

$ 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

دا هغه ترتیبونه دي چې زه به یې وکاروم.

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

زه به بیا په ټولو دریو ماشینونو کې ZooKeeper او ClickHouse سرور پرمخ وړم.

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

ClickHouse ته د معلوماتو اپلوډ کول

په لومړي سرور کې به زه د سفر میز جوړ کړم (trips)، کوم چې به د لاګ انجن په کارولو سره د ټکسي سفرونو ډیټاسیټ ذخیره کړي.

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

زه بیا هر یو د CSV فایلونه د سفر میز کې راوباسئ او پورته کړم (trips). لاندې په 55 دقیقو او 10 ثانیو کې بشپړ شو. د دې عملیاتو وروسته، د ډیټا ډایرکټر اندازه 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)

د واردولو سرعت په هر ثانیه کې د CSV د نه کمپریس شوي مینځپانګې 155 MB و. زه شکمن یم چې دا د GZIP ډیکمپریشن کې د خنډ له امله و. دا ممکن د xargs په کارولو سره په موازي ډول د ټولو gzipped فایلونو خلاصول ګړندي شوي وي او بیا غیر زپ شوي ډاټا بار کړي. لاندې د هغه څه توضیحات دي چې د CSV وارداتو پروسې په جریان کې راپور شوي.

$ 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

زه به د دوام دمخه د اصلي CSV فایلونو په حذف کولو سره NVMe ډرایو کې ځای خالي کړم.

$ sudo rm -fr /ch/csv

د کالم فارم ته واړوئ

د Log ClickHouse انجن به د قطار په شکل کې ډاټا ذخیره کړي. د ډیټا ګړندي پوښتنې کولو لپاره ، زه دا د MergeTree انجن په کارولو سره کالم فارمیټ ته بدلوم.

$ clickhouse-client --host=0.0.0.0

لاندې په 34 دقیقو او 50 ثانیو کې بشپړ شو. د دې عملیاتو وروسته، د ډیټا ډایرکټر اندازه 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;

دا هغه څه دي چې د لید محصول د عملیاتو په جریان کې ښکاري:

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)

په وروستي ازموینه کې، څو کالمونه بدل شوي او بیا حساب شوي. ما وموندله چې ځینې دا افعال نور کار نه کوي لکه څنګه چې تمه کیږي پدې ډیټاسیټ کې. د دې ستونزې د حل کولو لپاره، ما نامناسب فعالیتونه لیرې کړل او ډاټا یې پورته کړه پرته له دې چې نور دانه ډولونو ته بدل شي.

په ټول کلستر کې د معلوماتو ویش

زه به ډاټا په ټولو دریو کلستر نوډونو ویشم. د پیل کولو لپاره، لاندې به زه په ټولو دریو ماشینونو کې میز جوړ کړم.

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

بیا به زه ډاډ ترلاسه کړم چې لومړی سرور کولی شي په کلستر کې ټول درې نوډونه وګوري.

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:

بیا به زه په لومړي سرور کې یو نوی میز تعریف کړم چې د سکیما پراساس دی trips_mergetree_third او توزیع شوی انجن کاروي.

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

زه به بیا د MergeTree پر بنسټ میز څخه ټولو دریو سرورونو ته ډاټا کاپي کړم. لاندې په 34 دقیقو او 44 ثانیو کې بشپړ شو.

INSERT INTO trips_mergetree_x3
    SELECT * FROM trips_mergetree;

د پورتني عملیاتو وروسته ، ما کلیک هاوس ته 15 دقیقې وخت ورکړ ترڅو د اعظمي ذخیرې کچې نښه څخه لیرې لاړ شم. د ډیټا لارښودونه په ترتیب سره د 264 GB، 34 GB او 33 GB په دریو سرورونو کې پای ته ورسیدل.

د کلیک هاوس کلستر فعالیت ارزونه

هغه څه چې ما وروسته ولیدل هغه ترټولو ګړندی وخت و چې ما ولیدل چې هره پوښتنه په میز کې څو ځله پرمخ وړم trips_mergetree_x3.

$ clickhouse-client --host=0.0.0.0

لاندې په 2.449 ثانیو کې بشپړ شو.

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

لاندې په 0.691 ثانیو کې بشپړ شو.

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

لاندې په 0 ثانیو کې بشپړ شو.

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

لاندې په 0.983 ثانیو کې بشپړ شو.

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;

د پرتله کولو لپاره، ما ورته پوښتنې د MergeTree-based جدول کې ترسره کړې چې یوازې په لومړي سرور کې ژوند کوي.

د یو ClickHouse نوډ د فعالیت ارزونه

هغه څه چې ما وروسته ولیدل هغه ترټولو ګړندی وخت و چې ما ولیدل چې هره پوښتنه په میز کې څو ځله پرمخ وړم trips_mergetree_x3.

لاندې په 0.241 ثانیو کې بشپړ شو.

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

لاندې په 0.826 ثانیو کې بشپړ شو.

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

لاندې په 1.209 ثانیو کې بشپړ شو.

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

لاندې په 1.781 ثانیو کې بشپړ شو.

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;

د پایلو په اړه انعکاس

دا لومړی ځل دی چې وړیا CPU میشته ډیټابیس وکولی شو زما په ازموینو کې د GPU میشته ډیټابیس څخه ښه کار وکړي. دا د GPU میشته ډیټابیس له هغه وخت راهیسې د دوه بیاکتنو څخه تیر شوی ، مګر هغه فعالیت چې کلیک هاوس په یو واحد نوډ کې وړاندې کړی په هرصورت خورا اغیزناک دی.

په ورته وخت کې، کله چې په ویشل شوي انجن کې د پوښتنې 1 اجرا کول، د سر لګښتونه د لوړ مقدار ترتیب دی. زه امید لرم چې ما د دې پوسټ لپاره زما په څیړنه کې یو څه له لاسه ورکړی ځکه چې دا به ښه وي چې د پوښتنو وختونه ټیټ شي ځکه چې زه کلستر ته نور نوډونه اضافه کړم. په هرصورت، دا خورا ښه دی کله چې د نورو پوښتنو اجرا کول، فعالیت شاوخوا 2 ځله زیات شوی.

دا به ښه وي چې وګورئ ClickHouse د ذخیره کولو او محاسبې جلا کولو توان لري ترڅو دوی په خپلواک ډول اندازه کړي. د HDFS ملاتړ، کوم چې تیر کال اضافه شوی، د دې په لور یو ګام کیدی شي. د کمپیوټینګ په برخه کې، که یو واحد پوښتنه په کلستر کې د نورو نوډونو په اضافه کولو سره چټکه شي، نو د دې سافټویر راتلونکی خورا روښانه دی.

د دې پوسټ لوستلو لپاره د وخت اخیستو لپاره مننه. زه په شمالي امریکا او اروپا کې پیرودونکو ته مشورې ، معمارۍ ، او تمرین پرمختیایی خدمات وړاندیز کوم. که تاسو غواړئ بحث وکړئ چې زما وړاندیزونه ستاسو سوداګرۍ سره څنګه مرسته کولی شي، مهرباني وکړئ ما سره اړیکه ونیسئ LinkedIn.

سرچینه: www.habr.com

Add a comment