เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชตเซเชฏเชพเชชเชพเชฐเซ เชเชคเซเชชเชพเชฆเชจเซ เช เชฅเชตเชพ เชคเซเชฏเชพเชฐ เชเชชเชจ-เชธเซเชฐเซเชธ เชตเชฟเชเชฒเซเชชเซ, เชเซเชฎ เชเซ เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธ + เชเซเชฐเชพเชซเชจเชพ, เชจเซ เชเชชเชฏเซเช Nginx เชจเซ เชเชพเชฎเชเซเชฐเซเชจเซเช เชจเชฟเชฐเซเชเซเชทเชฃ เช เชจเซ เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชฎเซเชจเชฟเชเชฐเชฟเชเช เช เชฅเชตเชพ เชฐเซเช เชฒ-เชเชพเชเชฎ เชเชจเชพเชฒเชฟเชเชฟเชเซเชธ เชฎเชพเชเซ เช เชเช เชธเชพเชฐเซ เชตเชฟเชเชฒเซเชช เชเซ, เชชเชฐเชเชคเซ เชเชคเชฟเชนเชพเชธเชฟเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชฎเชพเชเซ เชเซเชฌ เช เชจเซเชเซเชณ เชจเชฅเซ. เชเซเชเชชเชฃ เชฒเซเชเชชเซเชฐเชฟเชฏ เชธเชเชธเชพเชงเชจ เชชเชฐ, nginx เชฒเซเชเซเชธเชฎเชพเชเชฅเซ เชกเซเชเชพเชจเซ เชฎเชพเชคเซเชฐเชพ เชเชกเชชเชฅเซ เชตเชงเซ เชฐเชนเซ เชเซ, เช เชจเซ เชฎเซเชเซ เชฎเชพเชคเซเชฐเชพเชฎเชพเช เชกเซเชเชพเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ, เชตเชงเซ เชตเชฟเชถเชฟเชทเซเช เชเชเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชคเซ เชคเชพเชฐเซเชเชฟเช เชเซ.
เช เชฒเซเชเชฎเชพเช เชนเซเช เชคเชฎเชจเซ เชเชนเซเชถ เชเซ เชคเชฎเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเซ เชถเชเซ
TL:DR;
เชฎเชพเชนเชฟเชคเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เช
เชฎเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช
Nginx เชฒเซเช เชเชเชคเซเชฐเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ, Nginx เชฒเซเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
4/9/2019 12:58:17 PM1.1.1.1 - - [09/Apr/2019:09:58:17 +0000] "GET /sign-up HTTP/2.0" 200 9168 "https://example.com/sign-in" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
4/9/2019 12:58:17 PM1.1.1.1 - - [09/Apr/2019:09:58:17 +0000] "GET /sign-in HTTP/2.0" 200 9168 "https://example.com/sign-up" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"
เชคเซเชเชจเซเช เชชเชฆเชเซเชเซเชฆเชจ เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชชเชฐเชเชคเซ Nginx เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชเซ เชคเซ เชเซเชฌ เชธเชฐเชณ เชเซ เชเซเชฅเซ เชคเซ JSON เชฎเชพเช เชฒเซเช เชเชคเซเชชเชจเซเชจ เชเชฐเซ:
log_format json_combined escape=json '{ "created_at": "$msec", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": $status, '
'"bytes_sent": $bytes_sent, '
'"request_length": $request_length, '
'"request_time": $request_time, '
'"http_referrer": "$http_referer", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent" }';
access_log /var/log/nginx/access.log json_combined;
เชธเซเชเซเชฐเซเช เชฎเชพเชเซ S3
เชฒเซเช เชธเซเชเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ S3 เชจเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช. เช เชคเชฎเชจเซ เชเช เช เชเชเซเชฏเชพเช เชฒเซเช เชธเซเชเซเชฐ เชเชฐเชตเชพ เช เชจเซ เชคเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชเชฅเซเชจเชพ เชธเซเชงเชพ S3 เชฎเชพเช เชกเซเชเชพ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซ เชถเชเซ เชเซ. เชฒเซเชเชฎเชพเช เชชเชเซเชฅเซ เชนเซเช เชคเชฎเชจเซ เชเชนเซเชถ เชเซ เชฒเซเชเซเชธเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเชฎเซเชฐเชตเซเช เช เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเซ, เชชเชฐเชเชคเซ เชชเชนเซเชฒเชพ เช เชฎเชจเซ S3 เชฎเชพเช เชธเซเชตเชเซเช เชฌเชเซเชเชจเซ เชเชฐเซเชฐ เชเซ, เชเซเชฎเชพเช เชฌเซเชเซเช เชเชเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชจเชนเซเช. เชคเชฎเซ เชเชฏเชพ เชชเซเชฐเชฆเซเชถเชฎเชพเช เชคเชฎเชพเชฐเซ เชฌเชเซเช เชฌเชจเชพเชตเชถเซ เชคเซ เช เชเชพเชเชฅเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเชพ เชฏเซเชเซเชฏ เชเซ, เชเชพเชฐเชฃ เชเซ เชเชฅเซเชจเชพ เชฌเชงเชพ เชชเซเชฐเชฆเซเชถเซเชฎเชพเช เชเชชเชฒเชฌเซเชง เชจเชฅเซ.
เชเชฅเซเชจเชพ เชเชจเซเชธเซเชฒเชฎเชพเช เชธเชฐเซเชเชฟเช เชฌเชจเชพเชตเชตเซ
เชเชพเชฒเซ เชฒเซเช เชฎเชพเชเซ เชเชฅเซเชจเชพเชฎเชพเช เชเช เชเซเชฌเชฒ เชฌเชจเชพเชตเซเช. เชเซ เชคเชฎเซ เชเชฟเชจเซเชธเชฟเชธ เชซเชพเชฏเชฐเชนเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชฏเซเชเชจเชพ เชเชกเซ เชฐเชนเซเชฏเชพ เชนเซเชต เชคเซ เชคเซ เชฒเชเชตเชพ เช เชจเซ เชตเชพเชเชเชตเชพ เชฌเชเชจเซ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ. เชเชฅเซเชจเชพ เชเชจเซเชธเซเชฒ เชเซเชฒเซ เช เชจเซ เชเซเชฌเชฒ เชฌเชจเชพเชตเซ:
เชเชธเชเซเชฏเซเชเชฒ เชเซเชฌเชฒ เชฌเชจเชพเชตเช
CREATE EXTERNAL TABLE `kinesis_logs_nginx`(
`created_at` double,
`remote_addr` string,
`remote_user` string,
`request` string,
`status` int,
`bytes_sent` int,
`request_length` int,
`request_time` double,
`http_referrer` string,
`http_x_forwarded_for` string,
`http_user_agent` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
's3://<YOUR-S3-BUCKET>'
TBLPROPERTIES ('has_encrypted_data'='false');
เชเชฟเชจเซเชธเชฟเชธ เชซเชพเชฏเชฐเชนเซเช เชธเซเชเซเชฐเซเชฎ เชฌเชจเชพเชตเชตเซ
Kinesis Firehose เชชเชธเชเชฆ เชเชฐเซเชฒเชพ เชซเซเชฐเซเชฎเซเชเชฎเชพเช Nginx เชฅเซ S3 เชชเชฐ เชชเซเชฐเชพเชชเซเชค เชกเซเชเชพ เชฒเชเชถเซ, เชคเซเชจเซ YYYY/MM/DD/HH เชซเซเชฐเซเชฎเซเชเชฎเชพเช เชกเชฟเชฐเซเชเซเชเชฐเซเชเชฎเชพเช เชตเชฟเชญเชพเชเซเชค เชเชฐเชถเซ. เชกเซเชเชพ เชตเชพเชเชเชคเซ เชตเชเชคเซ เช เชเชพเชฎเชฎเชพเช เชเชตเชถเซ. เชคเชฎเซ, เช เชฒเชฌเชคเซเชค, fluentd เชฅเซ เชธเซเชงเชพ S3 เชชเชฐ เชฒเชเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชคเชฎเชพเชฐเซ JSON เชฒเชเชตเซเช เชชเชกเชถเซ, เช เชจเซ เชซเชพเชเชฒเซเชจเชพ เชฎเซเชเชพ เชเชฆเชจเซ เชเชพเชฐเชฃเซ เช เชฌเชฟเชจเชเชพเชฐเซเชฏเชเซเชทเชฎ เชเซ. เชตเชงเซเชฎเชพเช, PrestoDB เช เชฅเชตเชพ Athena เชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ, JSON เช เชธเซเชฅเซ เชงเซเชฎเซเช เชกเซเชเชพ เชซเซเชฐเซเชฎเซเช เชเซ. เชคเซเชฅเซ Kinesis Firehose เชเชจเซเชธเซเชฒ เชเซเชฒเซ, "เชกเชฟเชฒเชฟเชตเชฐเซ เชธเซเชเซเชฐเซเชฎ เชฌเชจเชพเชตเซ" เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซ, "เชกเชฟเชฒเชฟเชตเชฐเซ" เชซเซเชฒเซเชกเชฎเชพเช "เชกเชพเชฏเชฐเซเชเซเช PUT" เชชเชธเชเชฆ เชเชฐเซ:
เชเชเชฒเชพ เชเซ
เชฌเชฎเชพเช, "เชฐเซเชเซเชฐเซเชก เชซเซเชฐเซเชฎเซเช เชเชจเซเชตเชฐเซเชเชจ" - "เชธเชเซเชทเชฎ" เชชเชธเชเชฆ เชเชฐเซ เช
เชจเซ เชฐเซเชเซเชฐเซเชกเชฟเชเช เชซเซเชฐเซเชฎเซเช เชคเชฐเซเชเซ "Apache ORC" เชชเชธเชเชฆ เชเชฐเซ. เชเซเชเชฒเชพเช เชธเชเชถเซเชงเชจ เชฎเซเชเชฌ
เช เชฎเซ เชธเซเชเซเชฐเซเช เชฎเชพเชเซ S3 เชชเชธเชเชฆ เชเชฐเซเช เชเซเช เช เชจเซ เช เชฎเซ เช เชเชพเช เชฌเชจเชพเชตเซเชฒ เชฌเชเซเช. Aws Glue Crawler, เชเซเชจเชพ เชตเชฟเชถเซ เชนเซเช เชฅเซเชกเซ เชตเชพเชฐ เชชเชเซ เชตเชพเชค เชเชฐเซเชถ, S3 เชฌเชเซเชเชฎเชพเช เชเชชเชธเชฐเซเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซ เชถเชเชคเซเช เชจเชฅเซ, เชคเซเชฅเซ เชคเซเชจเซ เชเชพเชฒเซ เชเซเชกเชตเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ.
เชฌเชพเชเซเชจเชพ เชตเชฟเชเชฒเซเชชเซ เชคเชฎเชพเชฐเชพ เชฒเซเชกเชจเชพ เชเชงเชพเชฐเซ เชฌเชฆเชฒเซ เชถเชเชพเชฏ เชเซ; เชนเซเช เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชกเชฟเชซเซเชฒเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชจเซเชเชง เชเชฐเซ เชเซ S3 เชเชฎเซเชชเซเชฐเซเชถเชจ เชเชชเชฒเชฌเซเชง เชจเชฅเซ, เชชเชฐเชเชคเซ ORC เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชฎเซเชณ เชเชฎเซเชชเซเชฐเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
เช เชธเซเชเชฒเชฟเชค
เชนเชตเซ เชเซเชฏเชพเชฐเซ เช
เชฎเซ เชฒเซเชเซเชธ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพ เช
เชจเซ เชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเซเชฏเซเช เชเซ, เชคเซ เช
เชฎเชพเชฐเซ เชฎเซเชเชฒเชตเชพเชจเซเช เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เช
เชฎเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช
เชชเซเชฐเชฅเชฎ, เชเชชเชฃเชจเซ fluent.conf เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเชจเซ เชเชฐเซเชฐ เชเซ. เชคเซเชจเซ เชฌเชจเชพเชตเซ เช เชจเซ เชธเซเชคเซเชฐเซเชค เชเชฎเซเชฐเซ:
24224 เชฌเชเชฆเชฐ
เชฌเชพเชเชงเซ 0.0.0.0
เชนเชตเซ เชคเชฎเซ Fluentd เชธเชฐเซเชตเชฐ เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ. เชเซ เชคเชฎเชจเซ เชตเชงเซ เช
เชฆเซเชฏเชคเชจ เชเซเช เชตเชฃเซเชจเซ เชเชฐเซเชฐ เชนเซเชฏ, เชคเซ เชชเชฐ เชเชพเช
$ docker run
-d
-p 24224:24224
-p 24224:24224/udp
-v /data:/fluentd/log
-v <PATH-TO-FLUENT-CONF>:/fluentd/etc fluentd
-c /fluentd/etc/fluent.conf
fluent/fluentd:stable
เช เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชชเชพเชฅเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ /fluentd/log
เชฎเซเชเชฒเชคเชพ เชชเชนเซเชฒเชพ เชฒเซเช เชเซเชถ เชเชฐเชตเชพ เชฎเชพเชเซ. เชคเชฎเซ เช เชตเชฟเชจเชพ เชเชฐเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชชเชเซ เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชคเชฎเซ เชฌเซเช-เชฌเซเชฐเซเชเชฟเชเช เชฒเซเชฌเชฐ เชธเชพเชฅเซ เชเซเชถเซเชก เชฌเชงเซเช เชเซเชฎเชพเชตเซ เชถเชเซ เชเซ. เชคเชฎเซ เชเซเชเชชเชฃ เชชเซเชฐเซเชเชจเซ เชชเชฃ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ; 24224 เช เชกเชฟเชซเซเชฒเซเช เชซเซเชฒเซเชเชจเซเช เชชเซเชฐเซเช เชเซ.
เชนเชตเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ Fluentd เชเชพเชฒเซ เชฐเชนเซเชฏเซเช เชเซ, เช เชฎเซ เชคเซเชฏเชพเช Nginx เชฒเซเช เชฎเซเชเชฒเซ เชถเชเซเช เชเซเช. เช เชฎเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชกเซเชเชฐ เชเชจเซเชเซเชจเชฐเชฎเชพเช Nginx เชเชฒเชพเชตเซเช เชเซเช, เช เชเชฟเชธเซเชธเชพเชฎเชพเช Docker เชชเชพเชธเซ Fluentd เชฎเชพเชเซ เชฎเซเชณ เชฒเซเชเชฟเชเช เชกเซเชฐเชพเชเชตเชฐ เชเซ:
$ docker run
--log-driver=fluentd
--log-opt fluentd-address=<FLUENTD-SERVER-ADDRESS>
--log-opt tag="{{.Name}}"
-v /some/content:/usr/share/nginx/html:ro
-d
nginx
เชเซ เชคเชฎเซ Nginx เช
เชฒเช เชฐเซเชคเซ เชเชฒเชพเชตเซ เชเซ, เชคเซ เชคเชฎเซ เชฒเซเช เชซเชพเชเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ, Fluentd เชชเชพเชธเซ เชเซ
เชเชพเชฒเซ เชเชชเชฐ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเซเชฒ เชฒเซเช เชชเชพเชฐเซเชธเชฟเชเชเชจเซ เชซเซเชฒเซเช เชจเซเช เชฐเซเชชเชฐเซเชเชพเชเชเชจเชฎเชพเช เชเชฎเซเชฐเซเช:
<filter YOUR-NGINX-TAG.*>
@type parser
key_name log
emit_invalid_record_to_error false
<parse>
@type json
</parse>
</filter>
เช
เชจเซ Kinesis เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฒเซเช เชฎเซเชเชฒเซ เชฐเชนเซเชฏเชพ เชเซ
<match YOUR-NGINX-TAG.*>
@type kinesis_firehose
region region
delivery_stream_name <YOUR-KINESIS-STREAM-NAME>
aws_key_id <YOUR-AWS-KEY-ID>
aws_sec_key <YOUR_AWS-SEC_KEY>
</match>
เชเชฅเซเชจเชพ
เชเซ เชคเชฎเซ เชฌเชงเซเช เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเซเช เชตเซเชฏเซเช เชนเซเชฏ, เชคเซ เชชเชเซ เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชเซ (เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ, เชเชฟเชจเซเชธเชฟเชธ เชฐเซเชเซเชฐเซเชกเซเชธ เชฆเชฐ 10 เชฎเชฟเชจเชฟเชเชฎเชพเช เชเชเชตเชพเชฐ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชเชฐเซ เชเซ) เชคเชฎเชพเชฐเซ S3 เชฎเชพเช เชฒเซเช เชซเชพเชเชฒเซ เชเซเชตเซ เชเซเชเช. เชเชฟเชจเซเชธเชฟเชธ เชซเชพเชฏเชฐเชนเซเชเชจเชพ "เชฎเซเชจเชฟเชเชฐเชฟเชเช" เชฎเซเชจเซเชฎเชพเช เชคเชฎเซ เชเซเช เชถเชเซ เชเซ เชเซ S3 เชฎเชพเช เชเซเชเชฒเซ เชกเซเชเชพ เชฐเซเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ, เชคเซเชฎเช เชญเซเชฒเซ. Kinesis เชญเซเชฎเชฟเชเชพ เชฎเชพเชเซ S3 เชฌเชเซเชเชฎเชพเช เชฒเชเชตเชพเชจเซ เชเชเซเชธเซเชธ เชเชชเชตเชพเชจเซเช เชญเซเชฒเชถเซ เชจเชนเซเช. เชเซ Kinesis เชเชเชเช เชชเชพเชฐเซเชธ เชเชฐเซ เชถเชเชคเซเช เชจเชฅเซ, เชคเซ เชคเซ เชธเชฎเชพเชจ เชฌเชเซเชเชฎเชพเช เชญเซเชฒเซ เชเชฎเซเชฐเชถเซ.
เชนเชตเซ เชคเชฎเซ เชเชฅเซเชจเชพเชฎเชพเช เชกเซเชเชพ เชเซเช เชถเชเซ เชเซ. เชเชพเชฒเซ เชจเชตเซเชจเชคเชฎ เชตเชฟเชจเชเชคเซเช เชถเซเชงเซเช เชเซ เชเซเชจเชพ เชฎเชพเชเซ เช เชฎเซ เชญเซเชฒเซ เชชเชฐเชค เชเชฐเซ เชเซ:
SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10;
เชฆเชฐเซเช เชตเชฟเชจเชเชคเซ เชฎเชพเชเซ เชคเชฎเชพเชฎ เชฐเซเชเซเชฐเซเชกเซเชธ เชธเซเชเซเชจ เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซ
เชนเชตเซ เช เชฎเชพเชฐเชพ เชฒเซเช เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ ORC เชฎเชพเช S3 เชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชธเชเชเซเชเชฟเชค เช เชจเซ เชตเชฟเชถเซเชฒเซเชทเชฃ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชเซ. เชเชฟเชจเซเชธเชฟเชธ เชซเชพเชฏเชฐเชนเซเชเซ เชคเซเชฎเชจเซ เชฆเชฐเซเช เชเชฒเชพเช เชฎเชพเชเซ เชกเชฟเชฐเซเชเซเชเชฐเซเชเชฎเชพเช เชเซเช เชตเซเชฏเชพ. เชเซ เชเซ, เชเซเชฏเชพเช เชธเซเชงเซ เชเซเชทเซเชเชเชจเซเช เชตเชฟเชญเชพเชเชจ เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช เชธเซเชงเซ, เชเชฅเซเชจเชพ เชฆเซเชฐเซเชฒเชญ เช เชชเชตเชพเชฆเซ เชธเชพเชฅเซ, เชฆเชฐเซเช เชตเชฟเชจเชเชคเซ เชชเชฐ เชคเชฎเชพเชฎ เชธเชฎเชฏเชจเซ เชกเซเชเชพ เชฒเซเชก เชเชฐเชถเซ. เช เชฌเซ เชเชพเชฐเชฃเซเชธเชฐ เชฎเซเชเซ เชธเชฎเชธเซเชฏเชพ เชเซ:
- เชกเซเชเชพเชจเซ เชฎเชพเชคเซเชฐเชพ เชธเชคเชค เชตเชงเซ เชฐเชนเซ เชเซ, เชเซเชตเซเชฐเซเชเชจเซ เชงเซเชฎเซเช เชเชฐเซ เชฐเชนเซ เชเซ;
- เชเชฅเซเชจเชพเชจเซเช เชฌเชฟเชฒ เชธเซเชเซเชจ เชเชฐเซเชฒเชพ เชกเซเชเชพเชจเชพ เชเชฅเซเชฅเชพเชจเชพ เชเชงเชพเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชตเชฟเชจเชเชคเซ เชฆเซเช เชเชเชพเชฎเชพเช เชเชเชพ 10 MB เชธเชพเชฅเซ.
เชเชจเซ เช เซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ AWS Glue Crawler เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เชเซ S3 เชฎเชพเช เชกเซเชเชพเชจเซ เชเซเชฐเซเชฒ เชเชฐเชถเซ เช เชจเซ Glue Metastore เชชเชฐ เชชเชพเชฐเซเชเซเชถเชจเชจเซ เชฎเชพเชนเชฟเชคเซ เชฒเชเชถเซ. เช เช เชฎเชจเซ เชเชฅเซเชจเชพเชจเซ เชเซเชตเซเชฐเซ เชเชฐเชคเซ เชตเชเชคเซ เชชเชพเชฐเซเชเซเชถเชจเซเชจเซ เชซเชฟเชฒเซเชเชฐ เชคเชฐเซเชเซ เชตเชพเชชเชฐเชตเชพ เชฆเซเชถเซ, เช เชจเซ เชคเซ เชซเชเซเชค เชเซเชตเซเชฐเซเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชกเชฟเชฐเซเชเซเชเชฐเซเช เช เชธเซเชเซเชจ เชเชฐเชถเซ.
Amazon Glue Crawler เชธเซเชเช เชช เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
Amazon Glue Crawler S3 เชฌเชเซเชเชฎเชพเชเชจเชพ เชคเชฎเชพเชฎ เชกเซเชเชพเชจเซ เชธเซเชเซเชจ เชเชฐเซ เชเซ เช เชจเซ เชชเชพเชฐเซเชเซเชถเชจเซ เชธเชพเชฅเซ เชเซเชทเซเชเชเซ เชฌเชจเชพเชตเซ เชเซ. AWS Glue เชเชจเซเชธเซเชฒเชฎเชพเชเชฅเซ เชเซเชฒเซ เชเซเชฐเชพเชเชฒเชฐ เชฌเชจเชพเชตเซ เช เชจเซ เชเซเชฏเชพเช เชคเชฎเซ เชกเซเชเชพ เชธเซเชเซเชฐ เชเชฐเซ เชเซ เชคเซเชฏเชพเช เชเช เชฌเชเซเช เชเชฎเซเชฐเซ. เชคเชฎเซ เชเชฃเซ เชฌเชเซเชเซเชธ เชฎเชพเชเซ เชเช เชเซเชฐเชพเชเชฒเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ, เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชคเซ เชเชฒเซเชฒเซเชเชฟเชค เชกเซเชเชพเชฌเซเชเชฎเชพเช เชจเชพเชฎเซ เชธเชพเชฅเซ เชเซเชทเซเชเชเซ เชฌเชจเชพเชตเชถเซ เชเซ เชฌเชเซเชเชจเชพ เชจเชพเชฎ เชธเชพเชฅเซ เชฎเซเชณ เชเชพเชฏ เชเซ. เชเซ เชคเชฎเซ เช เชกเซเชเชพเชจเซ เชจเชฟเชฏเชฎเชฟเชค เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชฏเซเชเชจเชพ เชเชกเซ เชฐเชนเซเชฏเชพ เชนเซ, เชคเซ เชคเชฎเชพเชฐเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซเชจเซ เช เชจเซเชฐเซเชช เชเซเชฐเชพเชเชฒเชฐเชจเชพ เชฒเซเชจเซเช เชถเซเชกเซเชฏเซเชฒเชจเซ เชเซเช เชตเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ. เช เชฎเซ เชฌเชงเชพ เชเซเชทเซเชเชเซ เชฎเชพเชเซ เชเช เชเซเชฐเชพเชเชฒเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เชเซ เชฆเชฐ เชเชฒเชพเชเซ เชเชพเชฒเซ เชเซ.
เชตเชฟเชญเชพเชเชฟเชค เชเซเชทเซเชเชเซ
เชเซเชฐเซเชฒเชฐเชจเชพ เชชเซเชฐเชฅเชฎ เชฒเซเชเช เชชเชเซ, เชฆเชฐเซเช เชธเซเชเซเชจ เชเชฐเซเชฒเซ เชฌเชเซเช เชฎเชพเชเซเชจเชพ เชเซเชทเซเชเชเซ เชธเซเชเชฟเชเชเซเชธเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชกเซเชเชพเชฌเซเชเชฎเชพเช เชฆเซเชเชพเชตเชพ เชเซเชเช. เชเชฅเซเชจเชพ เชเชจเซเชธเซเชฒ เชเซเชฒเซ เช เชจเซ Nginx เชฒเซเช เชธเชพเชฅเซ เชเซเชฌเชฒ เชถเซเชงเซ. เชเชพเชฒเซ เชเชเชเช เชตเชพเชเชเชตเชพเชจเซ เชชเซเชฐเชฏเชคเซเชจ เชเชฐเซเช:
SELECT * FROM "default"."part_demo_kinesis_bucket"
WHERE(
partition_0 = '2019' AND
partition_1 = '04' AND
partition_2 = '08' AND
partition_3 = '06'
);
เช เชเซเชตเซเชฐเซ 6 เชเชชเซเชฐเชฟเชฒ, 7เชจเชพ เชฐเซเช เชธเชตเชพเชฐเซ 8 เชฅเซ 2019 เชตเชพเชเซเชฏเชพเชจเซ เชตเชเซเชเซ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเชฒเชพ เชคเชฎเชพเชฎ เชฐเซเชเซเชฐเซเชกเชจเซ เชชเชธเชเชฆ เชเชฐเชถเซ. เชชเชฐเชเชคเซ เชฌเชฟเชจ-เชตเชฟเชญเชพเชเชฟเชค เชเซเชทเซเชเชเชฎเชพเชเชฅเซ เชตเชพเชเชเชตเชพ เชเชฐเชคเชพเช เช เชเซเชเชฒเซเช เชตเชงเซ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชเซ? เชเชพเชฒเซ เช เช เชฐเซเชเซเชฐเซเชกเซเชธ เชถเซเชงเซเช เช เชจเซ เชชเชธเชเชฆ เชเชฐเซเช, เชคเซเชฎเชจเซ เชเชพเชเชฎเชธเซเชเซเชฎเซเชช เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชเชฐ เชเชฐเซเช:
เชฎเชพเชคเซเชฐ เชเช เช เช เชตเชพเชกเชฟเชฏเชพเชจเชพ เชฒเซเช เชธเชพเชฅเซ เชกเซเชเชพเชธเซเช เชชเชฐ 3.59 เชธเซเชเชจเซเชก เช เชจเซ 244.34 เชฎเซเชเชพเชฌเชพเชเชเซเชธ เชกเซเชเชพ. เชเชพเชฒเซ เชชเชพเชฐเซเชเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชเชฐ เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช:
เชฅเซเชกเซ เชเชกเชชเซ, เชชเชฐเชเชคเซ เชธเซเชฅเซ เช เชเชคเซเชฏเชจเซเช - เชฎเชพเชคเซเชฐ 1.23 เชฎเซเชเชพเชฌเชพเชเชเซเชธ เชกเซเชเชพ! เชเซ เชเชฟเชเชฎเชคเชฎเชพเช เชตเชฟเชจเชเชคเซ เชฆเซเช เชจเซเชฏเซเชจเชคเชฎ 10 เชฎเซเชเชพเชฌเชพเชเชเซเชธ เชจ เชนเซเชฏ เชคเซ เชคเซ เชเชฃเซเช เชธเชธเซเชคเซเช เชนเชถเซ. เชชเชฐเชเชคเซ เชคเซ เชนเชเซ เชชเชฃ เชตเชงเซ เชธเชพเชฐเซเช เชเซ, เช เชจเซ เชฎเซเชเชพ เชกเซเชเชพเชธเซเชเซเชธ เชชเชฐ เชคเชซเชพเชตเชค เชตเชงเซ เชชเซเชฐเชญเชพเชตเชถเชพเชณเซ เชนเชถเซ.
Cube.js เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชกเซเชถเชฌเซเชฐเซเชก เชฌเชจเชพเชตเชตเซเช
เชกเซเชถเชฌเซเชฐเซเชกเชจเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ, เช
เชฎเซ Cube.js เชตเชฟเชถเซเชฒเซเชทเชฃเชพเชคเซเชฎเช เชซเซเชฐเซเชฎเชตเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชคเซเชฎเชพเช เชเชฃเชพ เชฌเชงเชพ เชเชพเชฐเซเชฏเซ เชเซ, เชชเชฐเชเชคเซ เช
เชฎเชจเซ เชฌเซเชฎเชพเช เชฐเชธ เชเซ: เชชเชพเชฐเซเชเซเชถเชจ เชซเชฟเชฒเซเชเชฐเซเชธ เช
เชจเซ เชกเซเชเชพ เชชเซเชฐเซเชต-เชเชเซเชฐเชฟเชเซเชถเชจเชจเซ เชเชชเชฎเซเชณเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ. เชคเซ เชกเซเชเชพ เชธเซเชเซเชฎเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ
เชเชพเชฒเซ เชเช เชจเชตเซ Cube.js เชเชชเซเชฒเชฟเชเซเชถเชจ เชฌเชจเชพเชตเซเช. เช
เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช AWS เชธเซเชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชนเซเชตเชพเชฅเซ, เชเชฎเชพเชตเช เชฎเชพเชเซ เชฒเซเชฎเซเชฌเชกเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชคเชพเชฐเซเชเชฟเช เชเซ. เชเซ เชคเชฎเซ Heroku เช
เชฅเชตเชพ Docker เชฎเชพเช Cube.js เชฌเซเชเชเชจเซเชก เชนเซเชธเซเช เชเชฐเชตเชพเชจเซ เชฏเซเชเชจเชพ เชเชกเซ เชฐเชนเซเชฏเชพ เชนเซเชต เชคเซ เชคเชฎเซ เชเชจเชฐเซเชถเชจ เชฎเชพเชเซ เชเชเซเชธเชชเซเชฐเซเชธ เชเซเชฎเซเชชเชฒเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เช
เชจเซเชฏเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ
$ npm install -g cubejs-cli
$ cubejs create nginx-log-analytics -t serverless -d athena
เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซเชจเซ เชเชชเชฏเซเช cube.js เชฎเชพเช เชกเซเชเชพเชฌเซเช เชเชเซเชธเซเชธเชจเซ เชเซเช เชตเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชเชจเชฐเซเชเชฐ เชเช .env เชซเชพเชเชฒ เชฌเชจเชพเชตเชถเซ เชเซเชฎเชพเช เชคเชฎเซ เชคเชฎเชพเชฐเซ เชเชพเชตเซเชเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชถเชเซ เชเซ
เชนเชตเซ เชเชชเชฃเชจเซ เชเชฐเซเชฐ เชเซ
เชกเชฟเชฐเซเชเซเชเชฐเซเชฎเชพเช schema
, เชซเชพเชเชฒ เชฌเชจเชพเชตเซ Logs.js
. เช
เชนเซเช nginx เชฎเชพเชเซ เชกเซเชเชพ เชฎเซเชกเซเชฒเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ:
เชฎเซเชกเชฒ เชเซเชก
const partitionFilter = (from, to) => `
date(from_iso8601_timestamp(${from})) <= date_parse(partition_0 || partition_1 || partition_2, '%Y%m%d') AND
date(from_iso8601_timestamp(${to})) >= date_parse(partition_0 || partition_1 || partition_2, '%Y%m%d')
`
cube(`Logs`, {
sql: `
select * from part_demo_kinesis_bucket
WHERE ${FILTER_PARAMS.Logs.createdAt.filter(partitionFilter)}
`,
measures: {
count: {
type: `count`,
},
errorCount: {
type: `count`,
filters: [
{ sql: `${CUBE.isError} = 'Yes'` }
]
},
errorRate: {
type: `number`,
sql: `100.0 * ${errorCount} / ${count}`,
format: `percent`
}
},
dimensions: {
status: {
sql: `status`,
type: `number`
},
isError: {
type: `string`,
case: {
when: [{
sql: `${CUBE}.status >= 400`, label: `Yes`
}],
else: { label: `No` }
}
},
createdAt: {
sql: `from_unixtime(created_at)`,
type: `time`
}
}
});
เช
เชนเซเช เชเชชเชฃเซ เชตเซเชฐเซเชเชฌเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เช เชฎเซ เชฎเซเชเซเชฐเชฟเชเซเชธ เช เชจเซ เชชเชฐเชฟเชฎเชพเชฃเซ เชชเชฃ เชธเซเช เชเชฐเซเช เชเซเช เชเซ เช เชฎเซ เชกเซเชถเชฌเซเชฐเซเชก เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช เช เชจเซ เชชเซเชฐเซเชต-เชเชเซเชฐเชฟเชเซเชถเชจเซเชธเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซเช เชเซเช. Cube.js เชชเซเชฐเซเชต-เชเชเซเชฐเชฟเชเซเชเซเชก เชกเซเชเชพ เชธเชพเชฅเซ เชตเชงเชพเชฐเชพเชจเชพ เชเซเชทเซเชเชเซ เชฌเชจเชพเชตเชถเซ เช เชจเซ เชกเซเชเชพ เชเชตเชคเชพเชจเซ เชธเชพเชฅเซ เชคเซเชจเซ เชเชชเชฎเซเชณเซ เช เชชเชกเซเช เชเชฐเชถเซ. เช เชฎเชพเชคเซเชฐ เชเซเชตเซเชฐเซเชเชจเซ เชตเซเช เชเชชเซ เชเซ, เชชเชฐเชเชคเซ เชเชฅเซเชจเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเชฟเชเชฎเชค เชชเชฃ เชเชเชพเชกเซ เชเซ.
เชเชพเชฒเซ เช เชฎเชพเชนเชฟเชคเซเชจเซ เชกเซเชเชพ เชธเซเชเซเชฎเชพ เชซเชพเชเชฒเชฎเชพเช เชเชฎเซเชฐเซเช:
preAggregations: {
main: {
type: `rollup`,
measureReferences: [count, errorCount],
dimensionReferences: [isError, status],
timeDimensionReference: createdAt,
granularity: `day`,
partitionGranularity: `month`,
refreshKey: {
sql: FILTER_PARAMS.Logs.createdAt.filter((from, to) =>
`select
CASE WHEN from_iso8601_timestamp(${to}) + interval '3' day > now()
THEN date_trunc('hour', now()) END`
)
}
}
}
เช
เชฎเซ เช เชฎเซเชกเซเชฒเชฎเชพเช เชธเซเชชเชทเซเช เชเชฐเซเช เชเซเช เชเซ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเชพ เชคเชฎเชพเชฎ เชฎเซเชเซเชฐเชฟเชเซเชธ เชฎเชพเชเซ เชชเซเชฐเซเชต-เชเชเซเชฐเชฟเชเซเช เชกเซเชเชพ เช
เชจเซ เชฎเชนเชฟเชจเชพ เชชเซเชฐเชฎเชพเชฃเซ เชชเชพเชฐเซเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชเชฐเซเชฐเซ เชเซ.
เชนเชตเซ เช เชฎเซ เชกเซเชถเชฌเซเชฐเซเชก เชเชธเซเชฎเซเชฌเชฒ เชเชฐเซ เชถเชเซเช เชเซเช!
Cube.js เชฌเซเชเชเชจเซเชก เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ
Cube.js เชธเชฐเซเชตเชฐ เชตเชฟเชจเชเชคเซ เชธเซเชตเซเชเชพเชฐเซ เชเซ
{
"measures": ["Logs.errorCount"],
"timeDimensions": [
{
"dimension": "Logs.createdAt",
"dateRange": ["2019-01-01", "2019-01-07"],
"granularity": "day"
}
]
}
เชเชพเชฒเซ Cube.js เชเซเชฒเชพเชฏเชเช เช เชจเซ NPM เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชเช เชฒเชพเชเชฌเซเชฐเซเชฐเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช:
$ npm i --save @cubejs-client/core @cubejs-client/react
เช
เชฎเซ เชเชเชเซ เชเชฏเชพเชค เชเชฐเซเช เชเซเช cubejs
ะธ QueryRenderer
เชกเซเชเชพ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เช
เชจเซ เชกเซเชถเชฌเซเชฐเซเชก เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ:
เชกเซเชถเชฌเซเชฐเซเชก เชเซเชก
import React from 'react';
import { LineChart, Line, XAxis, YAxis } from 'recharts';
import cubejs from '@cubejs-client/core';
import { QueryRenderer } from '@cubejs-client/react';
const cubejsApi = cubejs(
'YOUR-CUBEJS-API-TOKEN',
{ apiUrl: 'http://localhost:4000/cubejs-api/v1' },
);
export default () => {
return (
<QueryRenderer
query={{
measures: ['Logs.errorCount'],
timeDimensions: [{
dimension: 'Logs.createdAt',
dateRange: ['2019-01-01', '2019-01-07'],
granularity: 'day'
}]
}}
cubejsApi={cubejsApi}
render={({ resultSet }) => {
if (!resultSet) {
return 'Loading...';
}
return (
<LineChart data={resultSet.rawData()}>
<XAxis dataKey="Logs.createdAt"/>
<YAxis/>
<Line type="monotone" dataKey="Logs.errorCount" stroke="#8884d8"/>
</LineChart>
);
}}
/>
)
}
เชกเซเชถเชฌเซเชฐเซเชก เชธเซเชคเซเชฐเซเชคเซ เชชเชฐ เชเชชเชฒเชฌเซเชง เชเซ
เชธเซเชฐเซเชธ: www.habr.com