1.1 рдмрд┐рд▓рд┐рдпрди рдЯреНрдпрд╛рдХреНрд╕реА рдпрд╛рддреНрд░рд╛рд╣рд░реВ: 108-рдХреЛрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░

рд▓реЗрдЦрдХреЛ рдЕрдиреБрд╡рд╛рдж рдкрд╛рдареНрдпрдХреНрд░рдордХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рддрдпрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рдбрд╛рдЯрд╛ рдЗрдиреНрдЬрд┐рдирд┐рдпрд░.

1.1 рдмрд┐рд▓рд┐рдпрди рдЯреНрдпрд╛рдХреНрд╕реА рдпрд╛рддреНрд░рд╛рд╣рд░реВ: 108-рдХреЛрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░

рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕реНрддрдореНрдн рдбрд╛рдЯрд╛рдмреЗрд╕ рд╣реЛред рдпреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реЛ рдЬрд╣рд╛рдБ рд╕рдпреМрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╣рд░реВрд▓реЗ рджреНрд░реБрдд рд░реВрдкрдорд╛ рд╡рд┐рд╕реНрддреГрдд рдбреЗрдЯрд╛ рдХреНрд╡реЗрд░реА рдЧрд░реНрди рд╕рдХреНрдЫрдиреН, рдкреНрд░рддрд┐ рджрд┐рди рдЕрд░рдмреМрдВ рдирдпрд╛рдБ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрджрд╛ рдкрдирд┐ред рдпрд╕реНрддреЛ рдкреНрд░рдгрд╛рд▓реАрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрди рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рд▓рд╛рдЧрдд рдкреНрд░рддрд┐ рд╡рд░реНрд╖ $ 100 рдХреЛ рд░реВрдкрдорд╛ рдЙрдЪреНрдЪ рд╣реБрди рд╕рдХреНрдЫ, рд░ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдЖрдзрд╛ред рдПрдХ рдмрд┐рдиреНрджреБрдорд╛, Yandex Metrica рдмрд╛рдЯ ClickHouse рд╕реНрдерд╛рдкрдирд╛рдорд╛ 10 рдЯреНрд░рд┐рд▓рд┐рдпрди рд░реЗрдХрд░реНрдбрд╣рд░реВ рдерд┐рдПред рдпрд╛рдиреНрдбреЗрдХреНрд╕рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕рд▓реЗ рдмреНрд▓реВрдордмрд░реНрдЧ рд░ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдпрд░рд╕рдБрдЧ рдкрдирд┐ рд╕рдлрд▓рддрд╛ рдкрд╛рдПрдХреЛ рдЫред

рджреБрдИ рд╡рд░реНрд╖рдЕрдШрд┐ рдмрд┐рддрд╛рдПрдБ рддреБрд▓рдирд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдбрд╛рдЯрд╛рдмреЗрд╕ рдПрдХ рдореЗрд╕рд┐рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд░ рдпреЛ рднрдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдирд┐: рд╢реБрд▓реНрдХ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдлреНрдЯрд╡реЗрдпрд░ рдореИрд▓реЗ рджреЗрдЦреЗрдХреЛ рдЫреБред рддреНрдпрд╕рдмреЗрд▓рд╛рджреЗрдЦрд┐, рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдХрд╛рдлреНрдХрд╛, HDFS рд░ ZStandard рдХрдореНрдкреНрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рд╕рд╣рд┐рдд рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдердкреНрди рдЬрд╛рд░реА рд░рд╛рдЦреЗрдХрд╛ рдЫрдиреНред рдЧрдд рд╡рд░реНрд╖ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдХреНрдпрд╛рд╕реНрдХреЗрдбрд┐рдВрдЧ рдХрдореНрдкреНрд░реЗрд╕рди рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдердкреЗ, рд░ рдбреЗрд▓реНрдЯрд╛-рдмрд╛рдЯ-рдбреЗрд▓реНрдЯрд╛ рдХреЛрдбрд┐рдЩ рд╕рдореНрднрд╡ рднрдпреЛред рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдбреЗрдЯрд╛ рдХрдореНрдкреНрд░реЗрд╕ рдЧрд░реНрджрд╛, рдЧреЗрдЬ рдорд╛рдирд╣рд░реВ рдбреЗрд▓реНрдЯрд╛ рдПрдиреНрдХреЛрдбрд┐рдЩ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдХрдореНрдкреНрд░реЗрд╕ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдХрд╛рдЙрдиреНрдЯрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбреЗрд▓реНрдЯрд╛-рджреНрд╡рд╛рд░рд╛-рдбреЗрд▓реНрдЯрд╛ рд╕рдЩреНрдХреЗрддрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред рд░рд╛рдореНрд░реЛ рдХрдореНрдкреНрд░реЗрд╕рди рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕рдХреЛ рдкреНрд░рджрд░реНрд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдЮреНрдЬреА рднрдПрдХреЛ рдЫред

ClickHouse рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдмрд╛рд╣реЗрдХ, 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 рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рддрд┐рдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрдд $1,962/рдШрдгреНрдЯрд╛ рдкреНрд░рддреНрдпреЗрдХ eu-west-1 рдХреНрд╖реЗрддреНрд░ рдорд╛ рдЬрдм рдорд╛рдЧ рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫред рдо Ubuntu Server 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

рдореИрд▓реЗ рдпрд╕ рдкрд░реАрдХреНрд╖рдгрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рднрдиреЗрдХреЛ рдЫ рд╡рд░реНрд╖рдХреЛ рдЕрд╡рдзрд┐рдорд╛ рдиреНрдпреВрдпреЛрд░реНрдХ рд╢рд╣рд░рдорд╛ рд▓рд┐рдЗрдПрдХреЛ рез.рез рдмрд┐рд▓рд┐рдпрди рдЯреНрдпрд╛рдХреНрд╕реА рд╕рд╡рд╛рд░реАрдмрд╛рдЯ рдЙрддреНрдкрдиреНрди рдЧрд░реЗрдХреЛ рдбрд╛рдЯрд╛ рдбрдореНрдк рд╣реЛред рдмреНрд▓рдЧрдорд╛ Redshift рдорд╛ рдПрдХ рдЕрд░рдм рдЯреНрдпрд╛рдХреНрд╕реА рдпрд╛рддреНрд░рд╛ рдореИрд▓реЗ рдпреЛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реЗрдВ рднрдиреНрдиреЗ рд╡рд┐рд╡рд░рдгред рддрд┐рдиреАрд╣рд░реВ 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 рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬреБрди рд╕рдмреИ рддреАрди рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ ClickHouse рдХреЛ рд╡рд┐рддрд░рд┐рдд рд╕реНрдерд╛рдкрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫред

$ 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, Glances рд░ ZooKeeper рд╕рдмреИ рддреАрди рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди Ubuntu рдХреЛ рдкреНрдпрд╛рдХреЗрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреБред

$ 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 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 decompression рдорд╛ рдПрдХ рдмрд╛рдзрд╛ рдХреЛ рдХрд╛рд░рдг рдерд┐рдпреЛред 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 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 рдорд┐рдиреЗрдЯ рджрд┐рдПрдБред рдкреНрд░рддреНрдпреЗрдХ рддреАрди рд╕рд░реНрднрд░рдорд╛ рдбрд╛рдЯрд╛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд╣рд░реВ рдХреНрд░рдорд╢рдГ реиремрек рдЬреАрдмреА, рейрек рдЬреАрдмреА рд░ рейрей рдЬреАрдмреА рднрдПрдХреЛ рдерд┐рдпреЛред

рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рдореВрд▓реНрдпрд╛рдЩреНрдХрди

рдореИрд▓реЗ рдЕрд░реНрдХреЛ рдХреЗ рджреЗрдЦреЗрдБ рддреНрдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рд╕рдордп рд╣реЛ рдЬреБрди рдореИрд▓реЗ рдЯреЗрдмрд▓рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдзреЗрд░реИ рдкрдЯрдХ рдЪрд▓рд╛рдПрдХреЛ рджреЗрдЦреЗрдХреЛ рдЫреБ 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;

рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ рдорд░реНрдЬрдЯреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдЙрд╣реА рдкреНрд░рд╢реНрдирд╣рд░реВ рдЪрд▓рд╛рдПрдБ рдЬреБрди рдкрд╣рд┐рд▓реЛ рд╕рд░реНрднрд░рдорд╛ рдорд╛рддреНрд░ рд░рд╣рдиреНрдЫред

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

рдореИрд▓реЗ рдЕрд░реНрдХреЛ рдХреЗ рджреЗрдЦреЗрдБ рддреНрдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рд╕рдордп рд╣реЛ рдЬреБрди рдореИрд▓реЗ рдЯреЗрдмрд▓рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдзреЗрд░реИ рдкрдЯрдХ рдЪрд▓рд╛рдПрдХреЛ рджреЗрдЦреЗрдХреЛ рдЫреБ 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 рдЧреБрдгрд╛ рдмрдвреНрдпреЛред

рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдЕрд▓рдЧреНрдЧреИ рднрдгреНрдбрд╛рд░рдг рд░ рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗ рджрд┐рд╢рд╛рдорд╛ рд╡рд┐рдХрд╕рд┐рдд рднрдПрдХреЛ рд╣реЗрд░реНрди рдкрд╛рдЙрдБрджрд╛ рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫ рддрд╛рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рдорд╛рдкрди рдЧрд░реНрди рд╕рдХреВрдиреНред HDFS рд╕рдорд░реНрдерди, рдЬреБрди рдЧрдд рд╡рд░реНрд╖ рдердкрд┐рдПрдХреЛ рдерд┐рдпреЛ, рдпрд╕рддрд░реНрдл рдПрдХ рдХрджрдо рд╣реБрди рд╕рдХреНрдЫред рдХрдореНрдкреНрдпреБрдЯрд┐рдЩрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпрджрд┐ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдердк рдиреЛрдбрд╣рд░реВ рдердкреЗрд░ рдПрдЙрдЯреИ рдкреНрд░рд╢реНрдирд▓рд╛рдИ рдЧрддрд┐ рджрд┐рди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗ, рдпреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░рдХреЛ рднрд╡рд┐рд╖реНрдп рдзреЗрд░реИ рдЙрдЬреНрдЬреНрд╡рд▓ рдЫред

рдпреЛ рдкреЛрд╕реНрдЯ рдкрдвреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдордп рджрд┐рдиреБрднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рджред рдо рдЙрддреНрддрд░реА рдЕрдореЗрд░рд┐рдХрд╛ рд░ рдпреБрд░реЛрдкрдХрд╛ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓рд╛рдИ рдкрд░рд╛рдорд░реНрд╢, рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рд░ рдЕрднреНрдпрд╛рд╕ рд╡рд┐рдХрд╛рд╕ рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫреБред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдореЗрд░реЛ рд╕реБрдЭрд╛рд╡рд╣рд░реВрд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рд╡реНрдпрд╡рд╕рд╛рдпрд▓рд╛рдИ рдХрд╕рд░реА рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ рднрдиреЗрд░ рдЫрд▓рдлрд▓ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдХреГрдкрдпрд╛ рдорд▓рд╛рдИ рдорд╛рд░реНрдлрдд рд╕рдореНрдкрд░реНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН LinkedIn.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди