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

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

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

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

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

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

рдорд╛рд░реНрдЪ 2017 рдореЗрдВ, ClickHouse рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рд╣реБрдЖ рдмрджрд▓рд╛рд╡ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдЦрдВрдб рдкреНрд░рд▓реЗрдЦрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди-рдЖрдзрд╛рд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рднреА рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдореБрджреНрджреЛрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ GitHub рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд▓рдн рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ 2-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ NVMe рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ AWS EC36 рдкрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред

рдЕрджреНрдпрддрди: рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрдХ рдмреЗрд╣рддрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдФрд░ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

AWS EC2 рдХреНрд▓рд╕реНрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛

рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рддреАрди c5d.9xlarge EC2 рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 36 рд╡рд░реНрдЪреБрдЕрд▓ рд╕реАрдкреАрдпреВ, 72 рдЬреАрдмреА рд░реИрдо, 900 рдЬреАрдмреА рдПрдирд╡реАрдПрдордИ рдПрд╕рдПрд╕рдбреА рд╕реНрдЯреЛрд░реЗрдЬ рд╣реИ рдФрд░ 10 рдЧреАрдЧрд╛рдмрд┐рдЯ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдорд╛рдВрдЧ рдкрд░ рдЪрд▓рдиреЗ рдкрд░ рдИрдпреВ-рд╡реЗрд╕реНрдЯ-1,962 рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдХреАрдордд $1/рдШрдВрдЯрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдмрдВрдЯреВ рд╕рд░реНрд╡рд░ 16.04 рдПрд▓рдЯреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░ рд╕рдХреЗ, рдФрд░ рдХреЗрд╡рд▓ рдореЗрд░рд╛ IPv4 рдкрддрд╛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ SSH рджреНрд╡рд╛рд░рд╛ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдирд╡реАрдПрдордИ рдбреНрд░рд╛рдЗрд╡ рдкрд░рд┐рдЪрд╛рд▓рди рддрддреНрдкрд░рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ

ClickHouse рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдкрд░ NVMe рдбреНрд░рд╛рдЗрд╡ рдкрд░ EXT4 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдКрдВрдЧрд╛ред

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

рдПрдХ рдмрд╛рд░ рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдЖрдк рдорд╛рдЙрдВрдЯ рдкреЙрдЗрдВрдЯ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрд▓рдмреНрдз 783 рдЬреАрдмреА рд╕реНрдерд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

$ 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

рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди

рдореИрдВ рдЬрд╛рд╡рд╛ 8 рдХреЗ рд▓рд┐рдП рдУрдкрдирдЬреЗрдбреАрдХреЗ рд╡рд┐рддрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╛рдЪреЗ рдЬрд╝реВрдХреАрдкрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рддреАрдиреЛрдВ рдорд╢реАрдиреЛрдВ рдкрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреА рд╡рд┐рддрд░рд┐рдд рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

$ 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

рдореИрдВ 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>

рдлрд┐рд░ рдореИрдВ рддреАрдиреЛрдВ рдорд╢реАрдиреЛрдВ рдкрд░ рдЬрд╝реВрдХреАрдкрд░ рдФрд░ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рд╕рд░реНрд╡рд░ рдЪрд▓рд╛рдКрдВрдЧрд╛ред

$ 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 рдПрдордмреА рдЕрд╕рдореНрдкреАрдбрд┐рдд рд╕реАрдПрд╕рд╡реА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдереАред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ GZIP рдбрд┐рдХрдВрдкреНрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рдХрд╛рд░рдг рдерд╛ред xargs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рднреА gzipped рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЕрдирдЬрд╝рд┐рдк рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рддреЗрдЬрд╝ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред рдиреАрдЪреЗ рд╕реАрдПрд╕рд╡реА рдЖрдпрд╛рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

$ 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

рдХреЙрд▓рдо рдлреЙрд░реНрдо рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ

рд▓реЙрдЧ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдЗрдВрдЬрди рдкрдВрдХреНрддрд┐-рдЙрдиреНрдореБрдЦ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдбреЗрдЯрд╛ рдХреЛ рддреЗрдЬреА рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдорд░реНрдЬрдЯреНрд░реА рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрддрдВрдн рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

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

рдлрд┐рд░ рдореИрдВ рдорд░реНрдЬрдЯреНрд░реА рдЖрдзрд╛рд░рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рддреАрдиреЛрдВ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдХреЙрдкреА рдХрд░ рджреВрдВрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ 34 рдорд┐рдирдЯ рдФрд░ 44 рд╕реЗрдХрдВрдб рдореЗрдВ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

INSERT INTO trips_mergetree_x3
    SELECT * FROM trips_mergetree;

рдЙрдкрд░реЛрдХреНрдд рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ ClickHouse рдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЧреНрд░рд╣рдг рд╕реНрддрд░ рдЪрд┐рд╣реНрди рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 15 рдорд┐рдирдЯ рдХрд╛ рд╕рдордп рджрд┐рдпрд╛ред рддреАрдиреЛрдВ рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдбреЗрдЯрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреНрд░рдорд╢рдГ 264 рдЬреАрдмреА, 34 рдЬреАрдмреА рдФрд░ 33 рдЬреАрдмреА рд╣реЛ рдЧрдИред

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

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

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд╣реА рдХреНрд╡реЗрд░реАрдЬрд╝ рдорд░реНрдЬрдЯреНрд░реА-рдЖрдзрд╛рд░рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдЪрд▓рд╛рдИрдВ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдореМрдЬреВрдж рд╣реИред

рдПрдХ 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;

рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░

рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рд╕реАрдкреАрдпреВ-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЬреАрдкреАрдпреВ-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рддрдм рд╕реЗ рдЙрд╕ GPU-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджреЛ рд╕рдВрд╢реЛрдзрди рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ClickHouse рдиреЗ рдПрдХ рдиреЛрдб рдкрд░ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдпрд╛, рд╡рд╣ рдлрд┐рд░ рднреА рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред

рдЙрд╕реА рд╕рдордп, рд╡рд┐рддрд░рд┐рдд рдЗрдВрдЬрди рдкрд░ рдХреНрд╡реЗрд░реА 1 рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╢реЛрдз рдореЗрдВ рдореБрдЭрд╕реЗ рдХреБрдЫ рдЫреВрдЯ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдореИрдВ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдЕрдзрд┐рдХ рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдХреНрд╡реЗрд░реА рдХрд╛ рд╕рдордп рдХрдо рд╣реЛрддрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рджрд░реНрд╢рди рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдмрдврд╝ рдЧрдпрд╛ред

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ