1.1 рдЕрдмреНрдЬ рдЯреЕрдХреНрд╕реА рдЯреНрд░рд┐рдк: 108-рдХреЛрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░

рд▓реЗрдЦрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖рддрдГ рдЕрднреНрдпрд╛рд╕рдХреНрд░рдорд╛рдЪреНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рд╣реЛрддрд╛ рдбреЗрдЯрд╛ рдЕрднрд┐рдпрдВрддрд╛.

1.1 рдЕрдмреНрдЬ рдЯреЕрдХреНрд╕реА рдЯреНрд░рд┐рдк: 108-рдХреЛрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдПрдХ рдореБрдХреНрдд рд╕реНрд░реЛрдд рд╕реНрддрдВрднреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрд╣реЗ. рд╣реЗ рдПрдХ рдЙрддреНрддрдо рд╡рд╛рддрд╛рд╡рд░рдг рдЖрд╣реЗ рдЬрд┐рдереЗ рд╢реЗрдХрдбреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рддреНрд╡рд░реАрдд рддрдкрд╢реАрд▓рд╡рд╛рд░ рдбреЗрдЯрд╛рдЪреА рдХреНрд╡реЗрд░реА рдХрд░реВ рд╢рдХрддрд╛рдд, рдЬрд░реА рджрд░рд░реЛрдЬ рдХреЛрдЯреНрдпрд╡рдзреА рдирд╡реАрди рд░реЗрдХреЙрд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдЕрд╢рд╛ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪрд╛ рдЦрд░реНрдЪ рджрд░рд╡рд░реНрд╖реА $100 рдЗрддрдХрд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╡рд╛рдкрд░рд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдирд┐рдореНрдорд╛. рдПрдХрд╛ рдХреНрд╖рдгреА, рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕рдЪреНрдпрд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рдирдордзреНрдпреЗ 10 рдЯреНрд░рд┐рд▓рд┐рдпрди рд░реЗрдХреЙрд░реНрдб рд╣реЛрддреЗ. рдпрд╛рдВрдбреЗрдХреНрд╕ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдмреНрд▓реВрдордмрд░реНрдЧ рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдЕрд░рд╕рд╣ рджреЗрдЦреАрд▓ рдпрд╢ рдорд┐рд│рд╛рд▓реЗ рдЖрд╣реЗ.

рджреЛрди рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рдореА рдЦрд░реНрдЪ рдХреЗрд▓рд╛ рддреБрд▓рдирд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдорд╢реАрди рд╡рд╛рдкрд░реВрди рдбреЗрдЯрд╛рдмреЗрд╕, рдЖрдгрд┐ рддреЗ рдмрдирд▓реЗ рд╕рд░реНрд╡рд╛рдд рдЧрддрд┐рдорд╛рди рдореА рдХрдзреАрд╣реА рдкрд╛рд╣рд┐рд▓реЗрд▓реЗ рдореЛрдлрдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░. рддреЗрд╡реНрд╣рд╛рдкрд╛рд╕реВрди, рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдиреА рдХрд╛рдлреНрдХрд╛, HDFS рдЖрдгрд┐ ZStandard рдХреЙрдореНрдкреНрд░реЗрд╢рдирд╕рд╛рдареА рд╕рдорд░реНрдердирд╛рд╕рд╣ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЬреЛрдбрдгреЗ рд╕реБрд░реВ рдареЗрд╡рд▓реЗ рдЖрд╣реЗ. рдЧреЗрд▓реНрдпрд╛ рд╡рд░реНрд╖реА рддреНрдпрд╛рдВрдиреА рдХреЕрд╕реНрдХреЗрдбрд┐рдВрдЧ рдХреЙрдореНрдкреНрд░реЗрд╢рди рдкрджреНрдзрддреАрдВрд╕рд╛рдареА рд╕рдорд░реНрдерди рдЬреЛрдбрд▓реЗ, рдЖрдгрд┐ рдбреЗрд▓реНрдЯрд╛ рдкрд╛рд╕реВрди рдбреЗрд▓реНрдЯрд╛ рдХреЛрдбрд┐рдВрдЧ рд╢рдХреНрдп рдЭрд╛рд▓реЗ. рдЯрд╛рдЗрдо рд╕реАрд░реАрдЬ рдбреЗрдЯрд╛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддрд╛рдирд╛, рдбреЗрд▓реНрдЯрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд╛рдкрд░реВрди рдЧреЗрдЬ рдореВрд▓реНрдпреЗ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рд╕рдВрдХреБрдЪрд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдкрд░рдВрддреБ рдХрд╛рдЙрдВрдЯрд░рд╕рд╛рдареА рдбреЗрд▓реНрдЯрд╛-рдмрд╛рдп-рдбреЗрд▓реНрдЯрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд╛рдкрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрдИрд▓. рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╕рд╛рдареА рдЪрд╛рдВрдЧрд▓реЗ рдХреЙрдореНрдкреНрд░реЗрд╢рди рд╣реА рдЧреБрд░реБрдХрд┐рд▓реНрд▓реА рдмрдирд▓реА рдЖрд╣реЗ.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рдЧрд│реВрди, C++ рдХреЛрдбрдЪреНрдпрд╛ 170 рд╣рдЬрд╛рд░ рдУрд│реАрдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛрдбрдмреЗрд╕рдкреИрдХреА рдПрдХ рдЖрд╣реЗ. рддреБрд▓рдиреЗрдд, SQLite рд╡рд┐рддрд░рдгрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА рдЖрдгрд┐ C рдХреЛрдбрдЪреНрдпрд╛ 235 рд╣рдЬрд╛рд░ рдУрд│реАрдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ. рдпрд╛ рд▓реЗрдЦрдирд╛рдиреБрд╕рд╛рд░, 207 рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдиреА ClickHouse рдордзреНрдпреЗ рдпреЛрдЧрджрд╛рди рджрд┐рд▓реЗ рдЖрд╣реЗ, рдЖрдгрд┐ рдХрдорд┐рдЯрдЪреА рддреАрд╡реНрд░рддрд╛ рдЕрд▓реАрдХрдбреЗ рд╡рд╛рдврдд рдЖрд╣реЗ.

рдорд╛рд░реНрдЪ 2017 рдордзреНрдпреЗ, рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдЭрд╛рд▓реА рдЪреЗрдВрдЬрд▓реЙрдЧ рд╡рд┐рдХрд╛рд╕рд╛рдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдареЗрд╡рдгреНрдпрд╛рдЪрд╛ рдПрдХ рд╕реЛрдкрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгреВрди. рддреНрдпрд╛рдВрдиреА рдорд╛рд░реНрдХрдбрд╛рдЙрди-рдЖрдзрд╛рд░рд┐рдд рдлрд╛рдЗрд▓ рдкрджрд╛рдиреБрдХреНрд░рдорд╛рдд рдореЛрдиреЛрд▓рд┐рдерд┐рдХ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдлрд╛рдЗрд▓ рджреЗрдЦреАрд▓ рддреЛрдбрд▓реА. GitHub рджреНрд╡рд╛рд░реЗ рд╕рдорд╕реНрдпрд╛ рдЖрдгрд┐ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЧреЗрд▓реНрдпрд╛ рдХрд╛рд╣реА рд╡рд░реНрд╖рд╛рдВрдд рдЕрдзрд┐рдХ рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рдмрдирд▓реЗ рдЖрд╣реЗ.

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдореА 2-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрдгрд┐ NVMe рд╕реНрдЯреЛрд░реЗрдЬ рд╡рд╛рдкрд░реВрди AWS EC36 рд╡рд░реАрд▓ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░рдЪреНрдпрд╛ рдХрд╛рдордЧрд┐рд░реАрд╡рд░ рдПрдХ рдирдЬрд░ рдЯрд╛рдХрдгрд╛рд░ рдЖрд╣реЗ.

рдЕрджреНрдпрддрди: рдореВрд│рдд: рд╣реЗ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдПрдХрд╛ рдЖрдард╡рдбреНрдпрд╛рдирдВрддрд░, рдореА рд╕реБрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдЪрд╛рдЪрдгреА рдкреБрдиреНрд╣рд╛ рдХреЗрд▓реА рдЖрдгрд┐ рдмрд░реЗрдЪ рдЪрд╛рдВрдЧрд▓реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ. рд╣реЗ рдмрджрд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдкреЛрд╕реНрдЯ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ.

AWS EC2 рдХреНрд▓рд╕реНрдЯрд░ рд▓рд╛рдБрдЪ рдХрд░рдд рдЖрд╣реЗ

рдореА рдпрд╛ рдкреЛрд╕реНрдЯрд╕рд╛рдареА рддреАрди c5d.9xlarge EC2 рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рдгрд╛рд░ рдЖрд╣реЗ. рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ 36 рдЖрднрд╛рд╕реА CPU, 72 GB RAM, 900 GB NVMe SSD рд╕реНрдЯреЛрд░реЗрдЬ рдЖрдгрд┐ 10 Gigabit рдиреЗрдЯрд╡рд░реНрдХрд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдЖрд╣реЗ. рдорд╛рдЧрдгреАрдиреБрд╕рд╛рд░ рдЪрд╛рд▓рдд рдЕрд╕рддрд╛рдирд╛ рддреНрдпрд╛рдВрдЪреА рдХрд┐рдВрдордд eu-west-1,962 рдкреНрд░рджреЗрд╢рд╛рдд рдкреНрд░рддреНрдпреЗрдХреА $1/рддрд╛рд╕ рдЖрд╣реЗ. рдореА рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореНрд╣рдгреВрди рдЙрдмрдВрдЯреВ рд╕рд░реНрд╡реНрд╣рд░ 16.04 LTS рд╡рд╛рдкрд░рдгрд╛рд░ рдЖрд╣реЗ.

рдлрд╛рдпрд░рд╡реЙрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдирд┐рд░реНрдмрдВрдзрд╛рдВрд╢рд┐рд╡рд╛рдп рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзреВ рд╢рдХреЗрд▓ рдЖрдгрд┐ рдлрдХреНрдд рдорд╛рдЭрд╛ IPv4 рдкрддреНрддрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ SSH рджреНрд╡рд╛рд░реЗ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ.

рдСрдкрд░реЗрд╢рдирд▓ рд░реЗрдбрд┐рдиреЗрд╕ рд╕реНрдерд┐рддреАрдд NVMe рдбреНрд░рд╛рдЗрд╡реНрд╣

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ 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 рдбреНрд░рд╛рдЗрд╡реНрд╣рд╡рд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрди. рд╣рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ GZIP-рд╕рдВрдХреБрдЪрд┐рдд CSV рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ ~104GB рдЖрд╣реЗ.

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

рдШрд░ рд╕реНрдерд╛рдкрдирд╛ рдХреНрд▓рд┐рдХ рдХрд░рд╛

рдореА Java 8 рд╕рд╛рдареА OpenJDK рд╡рд┐рддрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрди рдХрд╛рд░рдг рддреЗ Apache ZooKeeper рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗ рддреАрдирд╣реА рдорд╢реАрдирд╡рд░ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдЪреНрдпрд╛ рд╡рд┐рддрд░рд┐рдд рд╕реНрдерд╛рдкрдиреЗрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

$ 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

рддреНрдпрд╛рдирдВрддрд░ рдореА рддрд┐рдиреНрд╣реА рдорд╢реАрдирд╡рд░ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ 18.16.1, рдЧреНрд▓рд╛рдиреНрд╕реЗрд╕ рдЖрдгрд┐ рдЭреВрдХреАрдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдмрдВрдЯреВрдЪреА рдкреЕрдХреЗрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рд╡рд╛рдкрд░реЗрди.

$ 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

рдореА рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд╕рд╛рдареА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░реЗрди рдЖрдгрд┐ рддрд┐рдиреНрд╣реА рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХрд╛рд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдУрд╡реНрд╣рд░рд░рд╛рдЗрдб рджреЗрдЦреАрд▓ рдХрд░реЗрди.

$ 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 рдЬреАрдмреА рд╣реЛрддрд╛.

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

рдЖрдпрд╛рдд рдЧрддреА 155 MB рдЕрд╕рдВрдкреАрдбрд┐рдд CSV рд╕рд╛рдордЧреНрд░реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рд╣реЛрддреА. рдорд▓рд╛ рд╢рдВрдХрд╛ рдЖрд╣реЗ рдХреА рд╣реЗ 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

рдХреЙрд▓рдо рдлреЙрд░реНрдордордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛

рд▓реЙрдЧ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдЗрдВрдЬрд┐рди рдкрдВрдХреНрддреА-рдУрд░рд┐рдПрдВрдЯреЗрдб рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░реЗрд▓. рдбреЗрдЯрд╛ рдЬрд▓рдж рдХреНрд╡реЗрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА MergeTree рдЗрдВрдЬрд┐рди рд╡рд╛рдкрд░реВрди рд╕реНрддрдВрднреАрдп рд╕реНрд╡рд░реВрдкрд╛рдд рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ.

$ clickhouse-client --host=0.0.0.0

рдЦрд╛рд▓реАрд▓ 34 рдорд┐рдирд┐рдЯреЗ 50 рд╕реЗрдХрдВрджрд╛рдд рдкреВрд░реНрдг рдЭрд╛рд▓реЗ. рдпрд╛ рдСрдкрд░реЗрд╢рдирдирдВрддрд░, рдбреЗрдЯрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдЪрд╛ рдЖрдХрд╛рд░ 237 рдЬреАрдмреА рд╣реЛрддрд╛.

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;

рдЦрд╛рд▓реАрд▓ реж.релреореи рд╕реЗрдХрдВрджрд╛рдд рдкреВрд░реНрдг рдЭрд╛рд▓реЗ.

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-рдЖрдзрд╛рд░рд┐рдд рдЯреЗрдмрд▓рд╡рд░ рд╕рдорд╛рди рдХреНрд╡реЗрд░реА рдЪрд╛рд▓рд╡рд▓реНрдпрд╛.

рдПрдХрд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдиреЛрдбрдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдореВрд▓реНрдпрдорд╛рдкрди

рдореА рдкреБрдвреЗ рдЬреЗ рдкрд╛рд╣рд┐рд▓реЗ рддреЗ рдореА рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдЯреЗрдмрд▓рд╡рд░ рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдкрд╛рд╣рд┐рд▓реЗрд▓реА рд╕рд░реНрд╡рд╛рдд рд╡реЗрдЧрд╡рд╛рди рд╡реЗрд│ рд╣реЛрддреА 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 рдкрдЯ рд╡рд╛рдврд▓реА.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рд╡реЗрдЧрд│реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдЖрдгрд┐ рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдд рдЖрд╣реЗ рд╣реЗ рдкрд╛рд╣реВрди рдЖрдирдВрдж рд╣реЛрдИрд▓ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд╕реНрдХреЗрд▓ рдХрд░реВ рд╢рдХрддреАрд▓. рдПрдЪрдбреАрдПрдлрдПрд╕ рд╕рдорд░реНрдерди, рдЬреЗ рдорд╛рдЧреАрд▓ рд╡рд░реНрд╖реА рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ, рд╣реЗ рдпрд╛ рджрд┐рд╢реЗрдиреЗ рдПрдХ рдкрд╛рдКрд▓ рдЕрд╕реВ рд╢рдХрддреЗ. рдХреЙрдореНрдкреНрдпреБрдЯрд┐рдВрдЧрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдЕрдзрд┐рдХ рдиреЛрдбреНрд╕ рдЬреЛрдбреВрди рдПрдХрд╛рдЪ рдХреНрд╡реЗрд░реАрд▓рд╛ рдЧрддреА рджрд┐рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ, рддрд░ рдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдЪреЗ рднрд╡рд┐рд╖реНрдп рдЦреВрдк рдЙрдЬреНрдЬреНрд╡рд▓ рдЖрд╣реЗ.

рд╣реА рдкреЛрд╕реНрдЯ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрд│ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж. рдореА рдЙрддреНрддрд░ рдЕрдореЗрд░рд┐рдХрд╛ рдЖрдгрд┐ рдпреБрд░реЛрдкрдордзреАрд▓ рдЧреНрд░рд╛рд╣рдХрд╛рдВрдирд╛ рд╕рд▓реНрд▓рд╛, рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рд╕рд░рд╛рд╡ рд╡рд┐рдХрд╛рд╕ рд╕реЗрд╡рд╛ рдСрдлрд░ рдХрд░рддреЛ. рдорд╛рдЭреНрдпрд╛ рд╕реВрдЪрдирд╛ рддреБрдордЪреНрдпрд╛ рд╡реНрдпрд╡рд╕рд╛рдпрд╛рд▓рд╛ рдХрд╢реА рдорджрдд рдХрд░реВ рд╢рдХрддрд╛рдд рдпрд╛рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЪрд░реНрдЪрд╛ рдХрд░рд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рдорд╛рдЭреНрдпрд╛рд╢реА рд╕рдВрдкрд░реНрдХ рд╕рд╛рдзрд╛ рд╕рдВрд▓рдЧреНрди.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛