1.1 เชฌเชฟเชฒเชฟเชฏเชจ เชŸเซ‡เช•เซเชธเซ€ เชŸเซเชฐเชฟเชชเซเชธ: 108-เช•เซ‹เชฐ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช•เซเชฒเชธเซเชŸเชฐ

เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช•เซ‹เชฐเซเชธเชจเชพ เชตเชฟเชฆเซเชฏเชพเชฐเซเชฅเซ€เช“ เชฎเชพเชŸเซ‡ เช–เชพเชธ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เชกเซ‡เชŸเชพ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐ.

1.1 เชฌเชฟเชฒเชฟเชฏเชจ เชŸเซ‡เช•เซเชธเซ€ เชŸเซเชฐเชฟเชชเซเชธ: 108-เช•เซ‹เชฐ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช•เซเชฒเชธเซเชŸเชฐ

เช•เซเชฒเซ€เช•เชนเชพเช‰เชธ เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช•เซ‹เชฒเชฎเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡. เชคเซ‡ เชเช• เชธเชฐเชธ เชตเชพเชคเชพเชตเชฐเชฃ เช›เซ‡ เชœเซเชฏเชพเช‚ เชธเซ‡เช‚เช•เชกเซ‹ เชตเชฟเชถเซเชฒเซ‡เชทเช•เซ‹ เชเชกเชชเชฅเซ€ เชตเชฟเช—เชคเชตเชพเชฐ เชกเซ‡เชŸเชพเชจเซ€ เช•เซเชตเซ‡เชฐเซ€ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชคเซ‡เชฎ เช›เชคเชพเช‚ เชฆเชฐเชฐเซ‹เชœ เช…เชฌเชœเซ‹ เชจเชตเชพ เชฐเซ‡เช•เซ‹เชฐเซเชก เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช†เชตเซ€ เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชŸเซ‡เช•เซ‹ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เช–เชฐเซเชš เชชเซเชฐเชคเชฟ เชตเชฐเซเชท $100 เชœเซ‡เชŸเชฒเซ‹ เชŠเช‚เชšเซ‹ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเชชเชฐเชพเชถเชจเชพ เช†เชงเชพเชฐเซ‡ เชธเช‚เชญเชตเชฟเชค เช…เชกเชงเชพ. เชเช• เชธเชฎเชฏเซ‡, เชฏเชพเชจเซเชกเซ‡เช•เซเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเชพ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชฎเชพเช‚ 10 เชŸเซเชฐเชฟเชฒเชฟเชฏเชจ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชนเชคเชพ. เชฏเชพเชจเซเชกเซ‡เช•เซเชธ เช‰เชชเชฐเชพเช‚เชค, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเซ‡ เชฌเซเชฒเซ‚เชฎเชฌเชฐเซเช— เช…เชจเซ‡ เช•เซเชฒเชพเช‰เชกเชซเซเชฒเซ‡เชฐ เชธเชพเชฅเซ‡ เชชเชฃ เชธเชซเชณเชคเชพ เชฎเชณเซ€ เช›เซ‡.

เชฌเซ‡ เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพเช‚ เชฎเซ‡เช‚ เช—เชพเชณเซเชฏเซเช‚ เชคเซเชฒเชจเชพเชคเซเชฎเช• เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชเช• เชฎเชถเซ€เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช, เช…เชจเซ‡ เชคเซ‡ เชฌเชจเซเชฏเซเช‚ เชธเชนเซเชฅเซ€ เชเชกเชชเซ€ เชซเซเชฐเซ€ เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชฎเซ‡เช‚ เช•เซเชฏเชพเชฐเซ‡เชฏ เชœเซ‹เชฏเซเช‚ เช›เซ‡. เชคเซเชฏเชพเชฐเชฅเซ€, เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เช•เชพเชซเช•เชพ, HDFS เช…เชจเซ‡ ZStandard เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชธเชชเซ‹เชฐเซเชŸ เชธเชนเชฟเชคเชจเซ€ เชธเซเชตเชฟเชงเชพเช“ เช‰เชฎเซ‡เชฐเชตเชพเชจเซเช‚ เชฌเช‚เชง เช•เชฐเซเชฏเซเช‚ เชจเชฅเซ€. เช—เชฏเชพ เชตเชฐเซเชทเซ‡ เชคเซ‡เช“เช เช•เซ‡เชธเซเช•เซ‡เชกเซ€เช‚เช— เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชชเชฆเซเชงเชคเชฟเช“ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚, เช…เชจเซ‡ เชกเซ‡เชฒเซเชŸเชพเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชฒเซเชŸเชพ เช•เซ‹เชกเชฟเช‚เช— เชถเช•เซเชฏ เชฌเชจเซเชฏเซเช‚. เชธเชฎเชฏ เชถเซเชฐเซ‡เชฃเซ€เชจเชพ เชกเซ‡เชŸเชพเชจเซ‡ เชธเช‚เช•เซเชšเชฟเชค เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เช—เซ‡เชœ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เชกเซ‡เชฒเซเชŸเชพ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เช•เซเชšเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เชพเช‰เชจเซเชŸเชฐเซเชธ เชฎเชพเชŸเซ‡ เชกเซ‡เชฒเซเชŸเชพ-เชฌเชพเชฏ-เชกเซ‡เชฒเซเชŸเชพ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชตเชงเซ เชธเชพเชฐเซเช‚ เชฐเชนเซ‡เชถเซ‡. เชธเชพเชฐเซเช‚ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซ€ เชšเชพเชตเซ€ เชฌเชจเซ€ เช—เชฏเซเช‚ เช›เซ‡.

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชฎเชพเช‚ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹เชจเซ‡ เชฌเชพเชฆ เช•เชฐเชคเชพเช‚ C++ เช•เซ‹เชกเชจเซ€ 170 เชนเชœเชพเชฐ เชฒเชพเช‡เชจเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชธเซŒเชฅเซ€ เชจเชพเชจเชพ เชตเชฟเชคเชฐเชฟเชค เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เซ‹เชกเชฌเซ‡เชเชฎเชพเช‚เชจเซเช‚ เชเช• เช›เซ‡. เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚, SQLite เชตเชฟเชคเชฐเชฃเชจเซ‡ เชธเชฎเชฐเซเชฅเชจ เช†เชชเชคเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ C เช•เซ‹เชกเชจเซ€ 235 เชนเชœเชพเชฐ เชฒเชพเช‡เชจ เช›เซ‡. เช† เชฒเซ‡เช–เชจ เชฎเซเชœเชฌ, 207 เช‡เชœเชจเซ‡เชฐเซ‹เช เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชฎเชพเช‚ เชฏเซ‹เช—เชฆเชพเชจ เช†เชชเซเชฏเซเช‚ เช›เซ‡, เช…เชจเซ‡ เช•เชฎเชฟเชŸเซเชธเชจเซ€ เชคเซ€เชตเซเชฐเชคเชพ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชตเชงเซ€ เชฐเชนเซ€ เช›เซ‡.

เชฎเชพเชฐเซเชš 2017 เชฎเชพเช‚, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ เชฒเซ‹เช— เชฌเชฆเชฒเซ‹ เชตเชฟเช•เชพเชธ เชชเชฐ เชจเชœเชฐ เชฐเชพเช–เชตเชพเชจเซ€ เชธเชฐเชณ เชฐเซ€เชค เชคเชฐเซ€เช•เซ‡. เชคเซ‡เช“เช เชฎเซ‹เชจเซ‹เชฒเชฟเชฅเชฟเช• เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชซเชพเช‡เชฒเชจเซ‡ เชฎเชพเชฐเซเช•เชกเชพเช‰เชจ-เช†เชงเชพเชฐเชฟเชค เชซเชพเช‡เชฒ เชตเช‚เชถเชตเซ‡เชฒเซ‹เชฎเชพเช‚ เชชเชฃ เชคเซ‹เชกเซ€ เชจเชพเช–เซ€. เชฎเซเชฆเซเชฆเชพเช“ เช…เชจเซ‡ เชธเซเชตเชฟเชงเชพเช“ GitHub เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เช›เซ‡เชฒเซเชฒเชพ เช•เซ‡เชŸเชฒเชพเช• เชตเชฐเซเชทเซ‹เชฎเชพเช‚ เชตเชงเซ เชธเซเชฒเชญ เชฌเชจเซ€ เช—เชฏเซเช‚ เช›เซ‡.

เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ 2-เช•เซ‹เชฐ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเซเชธ เช…เชจเซ‡ NVMe เชธเซเชŸเซ‹เชฐเซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ AWS EC36 เชชเชฐ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช•เซเชฒเชธเซเชŸเชฐเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เชชเชฐ เชเช• เชจเชœเชฐ เชจเชพเช–เซ€เชถ.

เช…เชชเชกเซ‡เชŸ: เช† เชชเซ‹เชธเซเชŸเชจเซ‡ เชฎเซ‚เชณ เชฐเซ‚เชชเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซเชฏเชพเชจเชพ เชเช• เช…เช เชตเชพเชกเชฟเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชธเซเชงเชพเชฐเซ‡เชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเชพเชฅเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชšเชฒเชพเชตเซเชฏเซเช‚ เช…เชจเซ‡ เชตเชงเซ เชธเชพเชฐเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ. เช† เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชชเซ‹เชธเซเชŸ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.

AWS EC2 เช•เซเชฒเชธเซเชŸเชฐ เชถเชฐเซ‚ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชนเซเช‚ เช† เชชเซ‹เชธเซเชŸ เชฎเชพเชŸเซ‡ เชคเซเชฐเชฃ c5d.9xlarge EC2 เชฆเชพเช–เชฒเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ. เชคเซ‡เชฎเชพเช‚เชจเชพ เชฆเชฐเซ‡เช•เชฎเชพเช‚ 36 เชตเชฐเซเชšเซเชฏเซเช…เชฒ CPU, 72 GB RAM, 900 GB NVMe SSD เชธเซเชŸเซ‹เชฐเซ‡เชœ เช›เซ‡ เช…เชจเซ‡ 10 Gigabit เชจเซ‡เชŸเชตเชฐเซเช•เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชฎเชพเช‚เช— เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เช“ eu-เชตเซ‡เชธเซเชŸ-1,962 เชชเซเชฐเชฆเซ‡เชถเชฎเชพเช‚ $1/เช•เชฒเชพเช•เชจเซ‹ เช–เชฐเซเชš เช•เชฐเซ‡ เช›เซ‡. เชนเซเช‚ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เชคเชฐเซ€เช•เซ‡ เช‰เชฌเซเชจเซเชŸเซ เชธเชฐเซเชตเชฐ 16.04 LTS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ.

เชซเชพเชฏเชฐเชตเซ‹เชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชฆเชฐเซ‡เช• เชฎเชถเซ€เชจ เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹ เชตเชฟเชจเชพ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชถเช•เซ‡, เช…เชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ SSH เชฆเซเชตเชพเชฐเชพ เชฎเชพเชคเซเชฐ เชฎเชพเชฐเซเช‚ IPv4 เชธเชฐเชจเชพเชฎเซเช‚ เชตเซเชนเชพเช‡เชŸเชฒเชฟเชธเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.

เช“เชชเชฐเซ‡เชถเชจเชฒ เชฐเซ‡เชกเซ€เชจเซ‡เชธ เชธเซเชŸเซ‡เชŸเชฎเชพเช‚ 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

เชนเซเช‚ ClickHouse เชฎเชพเชŸเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ€เชถ เช…เชจเซ‡ เชคเซเชฐเชฃเซ‡เชฏ เชธเชฐเซเชตเชฐ เชชเชฐ เช…เชฎเซเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช“เชตเชฐเชฐเชพเชˆเชก เชชเชฃ เช•เชฐเซ€เชถ.

$ sudo mkdir /ch/clickhouse
$ sudo chown -R clickhouse /ch/clickhouse

$ sudo mkdir -p /etc/clickhouse-server/conf.d
$ sudo vi /etc/clickhouse-server/conf.d/taxis.conf

เช† เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เช“เชตเชฐเชฐเชพเช‡เชกเซเชธ เช›เซ‡ เชœเซ‡เชจเซ‹ เชนเซเช‚ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ.

<?xml version="1.0"?>
<yandex>
    <listen_host>0.0.0.0</listen_host>
    <path>/ch/clickhouse/</path>

 <remote_servers>
        <perftest_3shards>
            <shard>
                <replica>
                    <host>172.30.2.192</host>
                    <port>9000</port>
                 </replica>
            </shard>
            <shard>
                 <replica>
                    <host>172.30.2.162</host>
                    <port>9000</port>
                 </replica>
            </shard>
            <shard>
                 <replica>
                    <host>172.30.2.36</host>
                    <port>9000</port>
                 </replica>
            </shard>
        </perftest_3shards>
    </remote_servers>

  <zookeeper-servers>
        <node>
            <host>172.30.2.192</host>
            <port>2181</port>
        </node>
        <node>
            <host>172.30.2.162</host>
            <port>2181</port>
        </node>
        <node>
            <host>172.30.2.36</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>

 <macros>
        <shard>03</shard>
        <replica>01</replica>
    </macros>
</yandex>

เชชเช›เซ€ เชนเซเช‚ เชคเซเชฐเชฃเซ‡เชฏ เชฎเชถเซ€เชจเซ‹ เชชเชฐ ZooKeeper เช…เชจเซ‡ ClickHouse เชธเชฐเซเชตเชฐเชจเซ‡ เชšเชฒเชพเชตเซ€เชถ.

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

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชชเชฐ เชกเซ‡เชŸเชพ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชชเซเชฐเชฅเชฎ เชธเชฐเซเชตเชฐ เชชเชฐ เชนเซเช‚ เชŸเซเชฐเซ€เชช เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ€เชถ (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

เช•เซ‰เชฒเชฎ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ‹

เชฒเซ‹เช— เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชเชจเซเชœเชฟเชจ เชชเช‚เช•เซเชคเชฟ-เชฒเช•เซเชทเซ€ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชถเซ‡. เชกเซ‡เชŸเชพเชจเซ‡ เชเชกเชชเชฅเซ€ เช•เซเชตเซ‡เชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชนเซเช‚ เชคเซ‡เชจเซ‡ เชฎเชฐเซเชœเชŸเซเชฐเซ€ เชเชจเซเชœเชฟเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‰เชฒเชฎเชฐ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซเช‚ เช›เซเช‚.

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

เชจเซ€เชšเซ‡เชจเซเช‚ 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;

เชธเชฐเช–เชพเชฎเชฃเซ€ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชฎเชฐเซเชœเชŸเซเชฐเซ€-เช†เชงเชพเชฐเชฟเชค เชŸเซ‡เชฌเชฒ เชชเชฐ เชธเชฎเชพเชจ เช•เซเชตเซ‡เชฐเซ€เช เชšเชฒเชพเชตเซ€ เช›เซ‡ เชœเซ‡ เชซเช•เซเชค เชชเซเชฐเชฅเชฎ เชธเชฐเซเชตเชฐ เชชเชฐ เชฐเชนเซ‡ เช›เซ‡.

เชเช• เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชจเซ‹เชกเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ

เชฎเซ‡เช‚ เช†เช—เชณ เชœเซ‡ เชœเซ‹เชฏเซเช‚ เชคเซ‡ เชธเซŒเชฅเซ€ เชเชกเชชเซ€ เชธเชฎเชฏ เชนเชคเซ‹ เชœเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เชฆเชฐเซ‡เช• เช•เซเชตเซ‡เชฐเซ€ เชŸเซ‡เชฌเชฒ เชชเชฐ เช˜เชฃเซ€ เชตเช–เชค เชšเชฒเชพเชตเชคเชพ เชœเซ‹เชฏเซ‹ เช›เซ‡ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹