рдЕрдореЗрдЬрд╝реЕрди рдПрдереЗрдирд╛ рдФрд░ рдХреНрдпреВрдм.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдВрдЧреЗрдХреНрд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕

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


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдирдЧреНрдиреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓реЙрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдереЗрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╡рд╛рд▓реЗ рдХреНрдпреВрдм.рдЬреЗрдПрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбреИрд╢рдмреЛрд░реНрдб рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдпрд╣рд╛рдБ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ:


рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдЯреАрдПрд▓: рдбреАрдЖрд░;
рддреИрдпрд╛рд░ рдбреИрд╢рдмреЛрд░реНрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред


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


рдирдЧреНрдиреЗрдХреНрд╕ рд▓реЙрдЧреНрд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 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 рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд▓реЙрдЧ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдореЛрдбрд╝реЛ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрд╕ 3 рдореЗрдВ рдПрдХ рд╕рд╛рдл рдмрд╛рд▓реНрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕реЛрдЪрдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрд╛рд▓реНрдЯреА рдмрдирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдПрдереЗрдирд╛ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред


рдПрдереЗрдирд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдЖрд░реЗрдЦ рдмрдирд╛рдПрдВ


рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдереЗрдирд╛ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред рдпрджрд┐ рдЖрдкрдХреЛ Kinesis Firehose рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдереЗрдирд╛ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ:


SQL рддрд╛рд▓рд┐рдХрд╛ рдирд┐рд░реНрдорд╛рдг
 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 рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдБ


Kinesis Firehose, рдЪрдпрдирд┐рдд YYYY / MM / DD / HH рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд Nginx рд╕реЗ S3 рддрдХ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдЪрдпрдирд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗрдЧрд╛ред рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╕рдордп рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рд╕реАрдзреЗ S3 рдкрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ JSON рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрдбрд╝реЗ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдЕрдХреНрд╖рдо рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, PrestoDB рдпрд╛ рдПрдереЗрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, JSON рд╕рдмрд╕реЗ рдзреАрдорд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИред рддреЛ Kinesis Firehose рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ, "рдбрд┐рд▓реАрд╡рд░реА рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, "рдбрд┐рд▓реАрд╡рд░реА" рдлрд╝реАрд▓реНрдб рдореЗрдВ "рдбрд╛рдпрд░реЗрдХреНрдЯ PUT" рдЪреБрдиреЗрдВ:


рдХрд┐рдиреЗрд╕рд┐рд╕ рдлрд╛рдпрд░рд╣реЙрд╕ рдХрдВрд╕реЛрд▓ 1


рдЕрдЧрд▓реЗ рдЯреИрдм рдореЗрдВ, "рд░рд┐рдХреЙрд░реНрдб рд╕реНрд╡рд░реВрдк рд░реВрдкрд╛рдВрддрд░рдг" - "рд╕рдХреНрд╖рдо" рдЪреБрдиреЗрдВ рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ "рдЕрдкрд╛рдЪреЗ рдУрдЖрд░рд╕реА" рдЪреБрдиреЗрдВред рдХреБрдЫ рдУрд╡реЗрди рдУ'рдорд╛рд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдкреНрд░реЗрд╕реНрдЯреЛрдмреАрдбреА рдФрд░ рдПрдереЗрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдкреНрд░рд╛рд░реВрдк рд╣реИред рдЖрд░реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЙрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдмрдирд╛рдИ рдереАред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк kinesis рдореЗрдВ рдХрд┐рд╕реА рднреА S3 рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдФрд░ рдПрд╕ 3 рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЗрди рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред


рдХрд┐рдиреЗрд╕рд┐рд╕ рдлрд╛рдпрд░рд╣реЙрд╕ рдХрдВрд╕реЛрд▓ 2


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


рдХрд┐рдиреЗрд╕рд┐рд╕ рдлрд╛рдпрд░рд╣реЙрд╕ рдХрдВрд╕реЛрд▓ 3


рдЖрдкрдХреЗ рд▓реЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ S3 рд╕рдВрдкреАрдбрд╝рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ORC рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдореВрд▓ рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


Fluentd


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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдлреНрд▓реБрдПрдВрдЯ.рдХреЙрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рд╕реНрд░реЛрдд рдЬреЛрдбрд╝реЗрдВ:



рдЖрдЧреЗ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
рдкреЛрд░реНрдЯ 24224
рдмрд╛рдБрдз 0.0.0.0



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


 $ 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 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлреНрд▓реБрдПрдВрдЯ рдкреЛрд░реНрдЯ рд╣реИред


рдЕрдм рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреНрд▓реБрдПрдВрдЯрдб рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╣рдо рд╡рд╣рд╛рдВ рдирдЧреНрдиреЗрдХреНрд╕ рд▓реЙрдЧ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдбреЛрдЬрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдирдЧреНрдиреЗрдХреНрд╕ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреЙрдХрд░ рдХреЗ рдкрд╛рд╕ рдлреНрд▓реБрдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рд▓реЙрдЧ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИ:


 $ 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 рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЙрдЧ рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлреНрд▓реБрдПрдВрдЯ рдореЗрдВ рдПрдХ рдлрд╛рдЗрд▓ рдЯреЗрд▓ рдкреНрд▓рдЧрдЗрди рд╣реИ ред


рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд▓реЙрдЧ рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:


 <filter YOUR-NGINX-TAG.*> @type parser key_name log emit_invalid_record_to_error false <parse> @type json </parse> </filter> 

рдФрд░ Kinesis рдлрд╝рд╛рдпрд░рд╣реЛрдЬрд╝ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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 рдореЗрдВ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред Kinesis Firehose "рдирд┐рдЧрд░рд╛рдиреА" рдореЗрдиреВ рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ S3 рдХреЛ рдХрд┐рддрдирд╛ рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рднреАред рдХрд╛рдЗрдирд┐рд╕ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП S3 рдмрдХреЗрдЯ рдХреЛ рд▓рд┐рдЦрд┐рдд рдкрд╣реБрдБрдЪ рджреЗрдирд╛ рди рднреВрд▓реЗрдВред рдпрджрд┐ рдХрд┐рдирд┐рд╕ рдХреБрдЫ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рддреЛ рд╡рд╣ рдПрдХ рд╣реА рдмрд╛рд▓реНрдЯреА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред


рдЕрдм рдЖрдк рдПрдереЗрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдХреБрдЫ рдирдП рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреА рд╣реИрдВ:


 SELECT * FROM "db_name"."table_name" WHERE status > 499 ORDER BY created_at DESC limit 10; 

рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рд╕реНрдХреИрди рдХрд░реЗрдВ


рдЕрдм рд╣рдорд╛рд░реЗ рд▓реЙрдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдУрдЖрд░рд╕реА рдореЗрдВ рдПрд╕ 3 рдореЗрдВ рд╕реНрдЯреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрдХреБрдЪрд┐рдд рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИред Kinesis Firehose рднреА рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдереЗрдирд╛ рджреБрд░реНрд▓рдн рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдСрд▓-рдЯрд╛рдЗрдо рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред рдпрд╣ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ:


  • рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣реА рд╣реИ, рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░ рд░рд╣реА рд╣реИ;
  • рдПрдереЗрдирд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо 10 рдПрдордмреА рдХреЗ рд╕рд╛рде рд╕реНрдХреИрди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд┐рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо AWS Glue Crawler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ S3 рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдЧрд╛ рдФрд░ Glue Metastore рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХреА рдЬрд╛рдирдХрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╣рдореЗрдВ рдПрдереЗрдирд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдЧрд╛ред


Amazon Glue Crawler рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ


рдЕрдореЗрдЬрд╝реЕрди рдЧреНрд▓реВ рдХреНрд░реЙрд▓рд░ рдПрд╕ 3 рдмрд╛рд▓реНрдЯреА рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд╛рдЬрди рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИред AWS Glue рдХрдВрд╕реЛрд▓ рд╕реЗ рдПрдХ Glue Crawler рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕ рдмрд╛рд▓реНрдЯреА рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдХрдИ рдмрд╛рд▓реНрдЯреА рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╣рд░ рд╕рдордп рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд░реЙрд▓рд░ рд▓реЙрдиреНрдЪ рд╢реЗрдбреНрдпреВрд▓ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рд╣рдо рд╕рднреА рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рд░ рдШрдВрдЯреЗ рдЪрд▓рддрд╛ рд╣реИред


рд╡рд┐рднрд╛рдЬрди рд╕рд╛рд░рдгреА


рдХреНрд░реЙрд▓рд░ рдХреА рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреИрди рдХреА рдЧрдИ рдмрд╛рд▓реНрдЯреА рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдереЗрдирд╛ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ Nginx рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдвреВрдВрдвреЗрдВред рдЖрдЗрдП рдХреБрдЫ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:


 SELECT * FROM "default"."part_demo_kinesis_bucket" WHERE( partition_0 = '2019' AND partition_1 = '04' AND partition_2 = '08' AND partition_3 = '06' ); 

рдпрд╣ рдХреНрд╡реЗрд░реА 8 рдЕрдкреНрд░реИрд▓, 2019 рдХреЛ рд╕реБрдмрд╣ 6 рдмрдЬреЗ рд╕реЗ рд╕реБрдмрд╣ 7 рдмрдЬреЗ рддрдХ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧреАред рд▓реЗрдХрд┐рди рдЧреИрд░-рд╡рд┐рднрд╛рдЬрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рд┐рд░реНрдл рдкрдврд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИ? рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдХреЗ рд╕рдорд╛рди рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:


рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз


рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ 3.59 рд╕реЗрдХрдВрдб рдФрд░ 244.34 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рд▓реЙрдЧ рд╣реИред рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


рд╡рд┐рднрд╛рдЬрди рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдиреБрд░реЛрдз


рдереЛрдбрд╝рд╛ рддреЗрдЬ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг - рдХреЗрд╡рд▓ 1.23 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдбреЗрдЯрд╛! рдпрд╣ рдмрд╣реБрдд рд╕рд╕реНрддрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг рдореЗрдВ рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдиреНрдпреВрдирддрдо 10 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрд╕реЗ рднреА рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЕрдВрддрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реЛрдЧрд╛ред


Cube.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВ


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


рдЪрд▓реЛ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди Cube.js. рдмрдирд╛рдПрдВ рдЪреВрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдбрдмреНрд▓реНрдпреВрдПрд╕-рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдпрджрд┐ рдЖрдк 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` } } }); 

рд╡рд┐рднрд╛рдЬрди рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде SQL рдХреНрд╡реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рд╣рдо FILTER_PARAMS рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рд╣рдо рдЙрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░реНрд╡-рдПрдХрддреНрд░реАрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред 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 рдмреИрдХреЗрдВрдб рд▓реЛрдХрдкреНрд░рд┐рдп рдлреНрд░рдВрдЯ-рдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ REST API рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░рд┐рдПрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Cube.js рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рд░рд┐рдЪрд╛рд░реНрдЬ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


Cube.js рд╕рд░реНрд╡рд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдЧреАрдирдХреНрд╕ рдиреЗ рджрд┐рди рдореЗрдВ рдХрд┐рддрдиреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреАрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 { "measures": ["Logs.errorCount"], "timeDimensions": [ { "dimension": "Logs.createdAt", "dateRange": ["2019-01-01", "2019-01-07"], "granularity": "day" } ] } 

NPM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Cube.js рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


 $ npm i --save @cubejs-client/core @cubejs-client/react 

рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cubejs рдФрд░ рдХреНрд╡реЗрд░реАрд░реАрдбрд░ рдШрдЯрдХ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдбреИрд╢рдмреЛрд░реНрдб рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ:


рдбреИрд╢рдмреЛрд░реНрдб рдХреЛрдб
 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> ); }} /> ) } ', 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> ); }} /> ) } 

рдбреИрд╢рдмреЛрд░реНрдб рд╕реНрд░реЛрдд CodeSandbox рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

Source: https://habr.com/ru/post/hi447886/


All Articles