์ด ๊ธฐ์ฌ์ ๋ฒ์ญ์ ์ฝ์ค์ ํ์๋ค์ ์ํด ํน๋ณํ ์ค๋น๋์์ต๋๋ค.
XNUMX๋
์ ์ ๋๋ ์ผ๋ค.
ClickHouse๋ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ 170๋ง ์ค์ C++ ์ฝ๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ฐ์ฅ ์์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ๋๋ฒ ์ด์ค ์ค ํ๋์ ๋๋ค. ์ด์ ๋นํด SQLite๋ ๋ฐฐํฌ๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ 235์ค์ C ์ฝ๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ด ๊ธ์ ์ฐ๋ ์์ ์์ 207๋ช ์ ์์ง๋์ด๊ฐ ClickHouse์ ๊ธฐ์ฌํ์ผ๋ฉฐ ์ต๊ทผ ์ปค๋ฐ์ ๊ฐ๋๊ฐ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค.
ํด๋ฆญํ์ฐ์ค๋ 2017๋
XNUMX์๋ถํฐ
์ด ๊ธฐ์ฌ์์๋ 2์ฝ์ด ํ๋ก์ธ์์ NVMe ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋ AWS EC36์์ ClickHouse ํด๋ฌ์คํฐ์ ์ฑ๋ฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ฐ์ดํธ: ์ด ๊ฒ์๋ฌผ์ ์ฒ์ ๊ฒ์ํ ์ง ์ผ์ฃผ์ผ ํ, ๊ฐ์ ๋ ๊ตฌ์ฑ์ผ๋ก ํ ์คํธ๋ฅผ ๋ค์ ์คํํ์ฌ ํจ์ฌ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค. ์ด ๊ฒ์๋ฌผ์ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ์ฌ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
AWS EC2 ํด๋ฌ์คํฐ ์์
์ด ๊ฒ์๋ฌผ์์๋ 5๊ฐ์ c9d.2xlarge EC36 ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ๊ฐ๊ฐ์๋ 72๊ฐ์ ๊ฐ์ CPU, 900GB RAM, 10GB NVMe SSD ์คํ ๋ฆฌ์ง๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ 1,962๊ธฐ๊ฐ๋นํธ ๋คํธ์ํฌ๋ฅผ ์ง์ํฉ๋๋ค. ์จ๋๋งจ๋ ์คํ ์ eu-west-1 ๋ฆฌ์ ์์ ์๊ฐ๋น $16.04์ ๋น์ฉ์ด ๋ญ๋๋ค. ์ด์ ์ฒด์ ๋ก Ubuntu Server XNUMX LTS๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๊ฐ ์์คํ ์ด ์ ํ ์์ด ์๋ก ํต์ ํ ์ ์๋๋ก ๋ฐฉํ๋ฒฝ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ํด๋ฌ์คํฐ์ SSH์์๋ ๋ด IPv4 ์ฃผ์๋ง ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐ๋ฉ๋๋ค.
์๋ ์ค๋น ์ํ์ NVMe ๋๋ผ์ด๋ธ
ClickHouse๊ฐ ์๋ํ๋ ค๋ฉด ๊ฐ ์๋ฒ์ NVMe ๋๋ผ์ด๋ธ์ EXT4 ํ์์ ํ์ผ ์์คํ ์ ์์ฑํ๊ฒ ์ต๋๋ค.
$ sudo mkfs -t ext4 /dev/nvme1n1
$ sudo mkdir /ch
$ sudo mount /dev/nvme1n1 /ch
๋ชจ๋ ๊ฒ์ด ๊ตฌ์ฑ๋๋ฉด ๊ฐ ์์คํ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ง์ดํธ ์ง์ ๊ณผ 783GB์ ๊ณต๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.
$ 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๋
๋์ ๋ด์์์์ XNUMX์ต ๋ฒ์ ํ์ ํ์น์ ํตํด ์์ฑํ ๋ฐ์ดํฐ ๋คํ์
๋๋ค. ๋ธ๋ก๊ทธ์์
$ 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
ํด๋ฆญํ์ฐ์ค ์ค์น
์ธ ์์คํ ๋ชจ๋์์ ClickHouse๋ฅผ ๋ถ์ฐ ์ค์นํ๋ ๋ฐ ํ์ํ Apache ZooKeeper๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ๋ฏ๋ก Java 8์ฉ OpenJDK ๋ฐฐํฌํ์ ์ค์นํ๊ฒ ์ต๋๋ค.
$ sudo apt update
$ sudo apt install
openjdk-8-jre
openjdk-8-jdk-headless
๊ทธ๋ฐ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ต๋๋ค. JAVA_HOME
.
$ sudo vi /etc/profile
export JAVA_HOME=/usr
$ source /etc/profile
๊ทธ๋ฐ ๋ค์ Ubuntu์ ํจํค์ง ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ธ ์์คํ ๋ชจ๋์ ClickHouse 18.16.1, glans ๋ฐ ZooKeeper๋ฅผ ์ค์นํ๊ฒ ์ต๋๋ค.
$ sudo apt-key adv
--keyserver hkp://keyserver.ubuntu.com:80
--recv E0C56BD4
$ echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" |
sudo tee /etc/apt/sources.list.d/clickhouse.list
$ sudo apt-get update
$ sudo apt install
clickhouse-client
clickhouse-server
glances
zookeeperd
ClickHouse์ฉ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ธ ์๋ฒ ๋ชจ๋์์ ์ผ๋ถ ๊ตฌ์ฑ ์ฌ์ ์๋ ์ํํ๊ฒ ์ต๋๋ค.
$ sudo mkdir /ch/clickhouse
$ sudo chown -R clickhouse /ch/clickhouse
$ sudo mkdir -p /etc/clickhouse-server/conf.d
$ sudo vi /etc/clickhouse-server/conf.d/taxis.conf
์ด๊ฒ์ด ์ ๊ฐ ์ฌ์ฉํ ๊ตฌ์ฑ ์ฌ์ ์์ ๋๋ค.
<?xml version="1.0"?>
<yandex>
<listen_host>0.0.0.0</listen_host>
<path>/ch/clickhouse/</path>
<remote_servers>
<perftest_3shards>
<shard>
<replica>
<host>172.30.2.192</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>172.30.2.162</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>172.30.2.36</host>
<port>9000</port>
</replica>
</shard>
</perftest_3shards>
</remote_servers>
<zookeeper-servers>
<node>
<host>172.30.2.192</host>
<port>2181</port>
</node>
<node>
<host>172.30.2.162</host>
<port>2181</port>
</node>
<node>
<host>172.30.2.36</host>
<port>2181</port>
</node>
</zookeeper-servers>
<macros>
<shard>03</shard>
<replica>01</replica>
</macros>
</yandex>
๊ทธ๋ฐ ๋ค์ ์ธ ์์คํ ๋ชจ๋์์ ZooKeeper์ ClickHouse ์๋ฒ๋ฅผ ์คํํ๊ฒ ์ต๋๋ค.
$ sudo /etc/init.d/zookeeper start
$ sudo service clickhouse-server start
ClickHouse์ ๋ฐ์ดํฐ ์ ๋ก๋
์ฒซ ๋ฒ์งธ ์๋ฒ์์๋ ์ฌํ ํ
์ด๋ธ(trips
), ์ด๋ ๋ก๊ทธ ์์ง์ ์ฌ์ฉํ์ฌ ํ์ ์ฌํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ์ฅํฉ๋๋ค.
$ clickhouse-client --host=0.0.0.0
CREATE TABLE trips (
trip_id UInt32,
vendor_id String,
pickup_datetime DateTime,
dropoff_datetime Nullable(DateTime),
store_and_fwd_flag Nullable(FixedString(1)),
rate_code_id Nullable(UInt8),
pickup_longitude Nullable(Float64),
pickup_latitude Nullable(Float64),
dropoff_longitude Nullable(Float64),
dropoff_latitude Nullable(Float64),
passenger_count Nullable(UInt8),
trip_distance Nullable(Float64),
fare_amount Nullable(Float32),
extra Nullable(Float32),
mta_tax Nullable(Float32),
tip_amount Nullable(Float32),
tolls_amount Nullable(Float32),
ehail_fee Nullable(Float32),
improvement_surcharge Nullable(Float32),
total_amount Nullable(Float32),
payment_type Nullable(String),
trip_type Nullable(UInt8),
pickup Nullable(String),
dropoff Nullable(String),
cab_type Nullable(String),
precipitation Nullable(Int8),
snow_depth Nullable(Int8),
snowfall Nullable(Int8),
max_temperature Nullable(Int8),
min_temperature Nullable(Int8),
average_wind_speed Nullable(Int8),
pickup_nyct2010_gid Nullable(Int8),
pickup_ctlabel Nullable(String),
pickup_borocode Nullable(Int8),
pickup_boroname Nullable(String),
pickup_ct2010 Nullable(String),
pickup_boroct2010 Nullable(String),
pickup_cdeligibil Nullable(FixedString(1)),
pickup_ntacode Nullable(String),
pickup_ntaname Nullable(String),
pickup_puma Nullable(String),
dropoff_nyct2010_gid Nullable(UInt8),
dropoff_ctlabel Nullable(String),
dropoff_borocode Nullable(UInt8),
dropoff_boroname Nullable(String),
dropoff_ct2010 Nullable(String),
dropoff_boroct2010 Nullable(String),
dropoff_cdeligibil Nullable(String),
dropoff_ntacode Nullable(String),
dropoff_ntaname Nullable(String),
dropoff_puma Nullable(String)
) ENGINE = Log;
๊ทธ๋ฐ ๋ค์ ๊ฐ CSV ํ์ผ์ ์ถ์ถํ์ฌ ์ฌํ ํ
์ด๋ธ(trips
). ๋ค์ ์์
์ 55๋ถ 10์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค. ์ด ์์
ํ ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ์ ํฌ๊ธฐ๋ 134GB์์ต๋๋ค.
$ 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)
๊ฐ์ ธ์ค๊ธฐ ์๋๋ ์ด๋น 155MB์ ๋น์์ถ CSV ์ฝํ ์ธ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด GZIP ์์ถ ํด์ ์ ๋ณ๋ชฉ ํ์ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. xargs๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ gzip ํ์ผ์ ์์ถ์ ๋ณ๋ ฌ๋ก ํ๊ณ ์์ถ์ด ํ๋ฆฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒ์ด ๋ ๋น ๋ฅผ ์๋ ์์ต๋๋ค. ๋ค์์ CSV ๊ฐ์ ธ์ค๊ธฐ ๊ณผ์ ์์ ๋ณด๊ณ ๋ ๋ด์ฉ์ ๋ํ ์ค๋ช ์ ๋๋ค.
$ sudo glances
ip-172-30-2-200 (Ubuntu 16.04 64bit / Linux 4.4.0-1072-aws) Uptime: 0:11:42
CPU 8.2% nice: 0.0% LOAD 36-core MEM 9.8% active: 5.20G SWAP 0.0%
user: 6.0% irq: 0.0% 1 min: 2.24 total: 68.7G inactive: 61.0G total: 0
system: 0.9% iowait: 1.3% 5 min: 1.83 used: 6.71G buffers: 66.4M used: 0
idle: 91.8% steal: 0.0% 15 min: 1.01 free: 62.0G cached: 61.6G free: 0
NETWORK Rx/s Tx/s TASKS 370 (507 thr), 2 run, 368 slp, 0 oth sorted automatically by cpu_percent, flat view
ens5 136b 2Kb
lo 343Mb 343Mb CPU% MEM% VIRT RES PID USER NI S TIME+ IOR/s IOW/s Command
100.4 1.5 1.65G 1.06G 9909 ubuntu 0 S 1:01.33 0 0 clickhouse-client --host=0.0.0.0 --query=INSERT INTO trips FORMAT CSV
DISK I/O R/s W/s 85.1 0.0 4.65M 708K 9908 ubuntu 0 R 0:50.60 32M 0 gzip -d -c /ch/csv/trips_xac.csv.gz
loop0 0 0 54.9 5.1 8.14G 3.49G 8091 clickhous 0 S 1:44.23 0 45M /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
loop1 0 0 4.5 0.0 0 0 319 root 0 S 0:07.50 1K 0 kworker/u72:2
nvme0n1 0 3K 2.3 0.0 91.1M 28.9M 9912 root 0 R 0:01.56 0 0 /usr/bin/python3 /usr/bin/glances
nvme0n1p1 0 3K 0.3 0.0 0 0 960 root -20 S 0:00.10 0 0 kworker/28:1H
nvme1n1 32.1M 495M 0.3 0.0 0 0 1058 root -20 S 0:00.90 0 0 kworker/23:1H
๊ณ์ํ๊ธฐ ์ ์ ์๋ณธ CSV ํ์ผ์ ์ญ์ ํ์ฌ NVMe ๋๋ผ์ด๋ธ์ ๊ณต๊ฐ์ ํ๋ณดํ๊ฒ ์ต๋๋ค.
$ sudo rm -fr /ch/csv
์ด ํ์์ผ๋ก ๋ณํ
Log ClickHouse ์์ง์ ํ ๊ธฐ๋ฐ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฟผ๋ฆฌํ๊ธฐ ์ํด MergeTree ์์ง์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
$ clickhouse-client --host=0.0.0.0
๋ค์ ์์ ์ 34๋ถ 50์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค. ์ด ์์ ํ ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ์ ํฌ๊ธฐ๋ 237GB์์ต๋๋ค.
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;
์์ ์ค Glance ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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;
์ ์์ ํ ClickHouse์ ์ต๋ ์ ์ฅ ๋ ๋ฒจ ํ์์์ ๋ฒ์ด๋๋๋ก 15๋ถ์ ์๊ฐ์ ์ฃผ์์ต๋๋ค. ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ๋ ์ธ ์๋ฒ ๊ฐ๊ฐ์์ ๊ฐ๊ฐ 264GB, 34GB, 33GB๊ฐ ๋์์ต๋๋ค.
ClickHouse ํด๋ฌ์คํฐ ์ฑ๋ฅ ํ๊ฐ
๋ค์์ ๋ณธ ๊ฒ์ ํ
์ด๋ธ์์ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ ๊ฒ ์ค ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ด์์ต๋๋ค. trips_mergetree_x3
.
$ clickhouse-client --host=0.0.0.0
๋ค์์ 2.449์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT cab_type, count(*)
FROM trips_mergetree_x3
GROUP BY cab_type;
๋ค์์ 0.691์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
avg(total_amount)
FROM trips_mergetree_x3
GROUP BY passenger_count;
๋ค์์ 0์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
toYear(pickup_date) AS year,
count(*)
FROM trips_mergetree_x3
GROUP BY passenger_count,
year;
๋ค์์ 0.983์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
toYear(pickup_date) AS year,
round(trip_distance) AS distance,
count(*)
FROM trips_mergetree_x3
GROUP BY passenger_count,
year,
distance
ORDER BY year,
count(*) DESC;
๋น๊ต๋ฅผ ์ํด ์ฒซ ๋ฒ์งธ ์๋ฒ์๋ง ์๋ MergeTree ๊ธฐ๋ฐ ํ ์ด๋ธ์์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ต๋๋ค.
ClickHouse ๋ ธ๋ ํ๋์ ์ฑ๋ฅ ํ๊ฐ
๋ค์์ ๋ณธ ๊ฒ์ ํ
์ด๋ธ์์ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ ๊ฒ ์ค ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ด์์ต๋๋ค. trips_mergetree_x3
.
๋ค์์ 0.241์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT cab_type, count(*)
FROM trips_mergetree
GROUP BY cab_type;
๋ค์์ 0.826์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
avg(total_amount)
FROM trips_mergetree
GROUP BY passenger_count;
๋ค์์ 1.209์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
toYear(pickup_date) AS year,
count(*)
FROM trips_mergetree
GROUP BY passenger_count,
year;
๋ค์์ 1.781์ด ๋ง์ ์๋ฃ๋์์ต๋๋ค.
SELECT passenger_count,
toYear(pickup_date) AS year,
round(trip_distance) AS distance,
count(*)
FROM trips_mergetree
GROUP BY passenger_count,
year,
distance
ORDER BY year,
count(*) DESC;
๊ฒฐ๊ณผ์ ๋ํ ๊ณ ์ฐฐ
ํ ์คํธ์์ ๋ฌด๋ฃ CPU ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ GPU ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ ๋๋ค. GPU ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ทธ ์ดํ๋ก ๋ ๋ฒ์ ๊ฐ์ ์ ๊ฑฐ์ณค์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ClickHouse๊ฐ ๋จ์ผ ๋ ธ๋์์ ์ ๊ณตํ ์ฑ๋ฅ์ ๋งค์ฐ ์ธ์์ ์ ๋๋ค.
๋์์ ๋ถ์ฐ ์์ง์์ ์ฟผ๋ฆฌ 1์ ์คํํ ๋ ์ค๋ฒํค๋ ๋น์ฉ์ ํจ์ฌ ๋ ๋์ต๋๋ค. ํด๋ฌ์คํฐ์ ๋ ๋ง์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ฟผ๋ฆฌ ์๊ฐ์ด ์ค์ด๋ค๋ฉด ์ข์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฒ์๋ฌผ์ ๋ํ ์กฐ์ฌ์์ ๋ญ๊ฐ๋ฅผ ๋์ณค๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฑ๋ฅ์ด 2๋ฐฐ ์ ๋ ํฅ์๋์๋ค๋ ์ ์ ์ ๋ง ๋๋จํฉ๋๋ค.
ClickHouse๊ฐ ์คํ ๋ฆฌ์ง์ ์ปดํจํ ์ ๋ถ๋ฆฌํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์๋๋ก ๋ฐ์ ํ๋ ๊ฒ์ ๋ณด๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์๋ ์ ์ถ๊ฐ๋ HDFS ์ง์์ ์ด๋ฅผ ํฅํ ํ ๊ฑธ์์ด ๋ ์ ์์ต๋๋ค. ์ปดํจํ ์ธก๋ฉด์์ ํด๋ฌ์คํฐ์ ๋ ๋ง์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ํํ ์ ์๋ค๋ฉด ์ด ์ํํธ์จ์ด์ ๋ฏธ๋๋ ๋งค์ฐ ๋ฐ์ต๋๋ค.
์๊ฐ์ ๋ด์ด ์ด ๊ฒ์๋ฌผ์ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ ๋ถ๋ฏธ์ ์ ๋ฝ์ ๊ณ ๊ฐ์๊ฒ ์ปจ์คํ
, ์ํคํ
์ฒ ๋ฐ ์ค๋ฌด ๊ฐ๋ฐ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ด ์ ์์ด ๊ทํ์ ๋น์ฆ๋์ค์ ์ด๋ป๊ฒ ๋์์ด ๋ ์ ์๋์ง ๋
ผ์ํ๊ณ ์ถ์ผ์๋ฉด ๋ค์ ์ฃผ์๋ก ์ ์๊ฒ ์ฐ๋ฝํด ์ฃผ์ธ์.
์ถ์ฒ : habr.com