{"id":305116,"date":"2020-06-10T03:00:09","date_gmt":"2020-06-10T03:00:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305116"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305116","title":{"rendered":"\u041a\u0430\u043a \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f GCP"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/opsguru\/blog\/506112\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_c\/qe\/q_\/_cqeq_360w7uo_k4autpimjrb60.jpeg\"><\/div>\n<p>  \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0435 \u043b\u044e\u0431\u044f\u0442 \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, <strike>\u0447\u0435\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c<\/strike> \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439.<\/p>\n<p>  <i>Google Cloud Platform<\/i> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0430\u0440\u0438\u0444\u043d\u044b\u0435 \u043f\u043b\u0430\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c <i>GCE<\/i> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 (<i>CPU<\/i>, \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0436\u0435\u0441\u0442\u043a\u0438\u0435 \u0434\u0438\u0441\u043a\u0438). \u0420\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 <i>Google Kubernetes Engine (GKE)<\/i> \u0438 <i>Google Cloud Dataproc<\/i> \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 <i>Google Compute Engine (GCE)<\/i>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438 \u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u044e\u0434\u0436\u0435\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0442\u0435\u043c \u0446\u0435\u043d\u043d\u0435\u0435 \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0442 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u043e \u0442\u0440\u0430\u0442\u0430\u0445 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u0447\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044f. <br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041f\u0440\u0435\u0434\u043f\u043e\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442\u044b \u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u0430\u0445 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <i>GCP<\/i> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0440\u0430\u0442\u0430\u0445 \u0432 <i>BigQuery<\/i> \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0432\u0441\u0435\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <i>BigQuery<\/i> \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c.<\/p>\n<p>  <b>\u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b:<\/b><\/p>\n<ul>\n<li>\u0422\u0438\u043f \u0440\u0435\u0441\u0443\u0440\u0441\u0430;<\/li>\n<li>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434;<\/li>\n<li>\u041e\u0442\u0434\u0435\u043b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430;<\/li>\n<li>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0430\u043c\u0438.<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 <i>Google<\/i> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>Google Data Studio<\/i>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430, \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b, \u2014 \u043d\u043e \u0441\u0430\u043c\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0438\u0431\u043a\u043e\u0435. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0432 <i>Google Data Studio<\/i>, \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0443, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>  <i>Grafana<\/i> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0441\u0435\u0431\u044f. \u0422\u0430\u043a\u043e\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u0431\u044b \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445. \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a <i>BigQuery (BQ)<\/i>. \u041f\u043b\u0430\u0433\u0438\u043d <i>BQ<\/i>, \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0447\u0440\u0435\u0437\u043c\u0435\u0440\u043d\u043e \u0437\u0430\u0431\u0430\u0433\u043e\u0432\u0430\u043d. \u0412 \u0438\u0442\u043e\u0433\u0435, \u0441\u0432\u044f\u0437\u043a\u0430 <i>BQ-Grafana<\/i> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0437\u0430\u043f\u0440\u043e\u0441\u044b <i>BQ<\/i> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e.<\/p>\n<p>  \u0425\u043e\u0440\u043e\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <i>PostgreSQL<\/i> \u0447\u0435\u0440\u0435\u0437 <i>CloudSQL<\/i>, \u044d\u0442\u0430 \u0421\u0423\u0411\u0414 \u0438\u043c\u0435\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d <i>PostgreSQL<\/i> \u0434\u043b\u044f <i>Grafana<\/i>. \u0410 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043c\u0435\u0435\u0442 \u044f\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"><i>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f CloudSQL \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0435\u0439\u0441\u043e\u0432, \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0430\u043c\u0438 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.<\/i><\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h2>\n<p>  \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0438\u0441\u0430\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0432 <i>Kubernetes<\/i> \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, \u043a\u0430\u0436\u0434\u044b\u0435 4 \u0447\u0430\u0441\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 <i>Cloud Dataflow<\/i>. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <i>BigQuery<\/i> \u0432 <i>PostgreSQL<\/i>. \u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0438\u0437 <i>BQ<\/i>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 <i>Grafana<\/i>, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043a <i>PostgreSQL<\/i>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ph\/wu\/bj\/phwubj_xvfybe9v8bvzwtel34ai.png\"><\/div>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0411\u0430\u0437\u044b \u0414\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445 \u0432 <i>BigQuery<\/i> \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <i>PostgreSQL<\/i>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"><i>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 BigQuery \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/cloud.google.com\/billing\/docs\/how-to\/export-data-bigquery\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u0410 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/cloud.google.com\/sql\/docs\/postgres\/\">Cloud SQL<\/a>.<\/i><\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <i>BQ<\/i>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">CREATE DATABASE billing; USE billing;   CREATE TABLE public.billing_export_2 ( \tid serial NOT NULL, \tsku_id varchar NULL, \tlabels varchar NULL, \texport_time varchar NULL, \tcurrency varchar NULL, \tsku_description varchar NULL, \tlocation_zone varchar NULL,     currency_conversion_rate float8 NULL, \tproject_labels varchar NULL, \tlocation_country varchar NULL, \tusage_start_time varchar NULL, \tbilling_account_id varchar NULL, \tlocation_region varchar NULL, \tusage_pricing_unit varchar NULL, \tusage_amount_in_pricing_units float8 NULL, \tcost_type varchar NULL, \tproject_id varchar NULL, \tsystem_labels varchar NULL, \tproject_description varchar NULL, \tlocation_location varchar NULL, \tproject_ancestry_numbers varchar NULL, \tcredits varchar NULL, \tservice_description varchar NULL, \tusage_amount float8 NULL, \tinvoice_month varchar NULL, \tusage_unit varchar NULL, \tusage_end_time varchar NULL, \t&quot;cost&quot; float8 NULL, \tservice_id varchar NULL, \tCONSTRAINT billing_export_2_pkey PRIMARY KEY (id) ); <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <i>PostgreSQL<\/i> \u0447\u0435\u0440\u0435\u0437 <i>Grafana<\/i>:<\/p>\n<pre><code class=\"sql\"> CREATE MATERIALIZED VIEW vw_billing_export AS \tSELECT     \tid,         sku_id,         labels,         export_time::timestamp,         currency,         sku_description,         location_zone,         currency_conversion_rate,         project_labels,         location_country,         usage_start_time::timestamp,         billing_account_id,         location_region,         usage_pricing_unit,         usage_amount_in_pricing_units,         cost_type, project_id,         system_labels,         project_description,         location_location,         project_ancestry_numbers,         credits,         service_description,         usage_amount,         invoice_month,         usage_unit,         usage_end_time::timestamp,         &quot;cost&quot;,         service_id,     \tl_label1 -&gt;&gt; 'value' as label1,     \tl_label2 -&gt;&gt; 'value' as label2,    \t...     \tFROM billing_export_2         \tLEFT  JOIN jsonb_array_elements(labels::jsonb) AS l_label1 on l_label1 -&gt;&gt; 'key' = \u2018label1\u2019         \tLEFT  JOIN jsonb_array_elements(labels::jsonb) AS l_label2 on l_label2 -&gt;&gt; 'key' = \u2018label2\u2019         \t... <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041a\u043e \u0432\u0441\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041a\u0430\u0436\u0434\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b <i>Grafana<\/i>, \u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"><i>\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u2014 \u0432\u0430\u0436\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/i>  <\/p>\n<pre><code class=\"sql\"> CREATE INDEX vw_billing_export_label1 ON vw_billing_export (label1); <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h2>DataFlow<\/h2>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a <i>DataFlow<\/i> \u0438 <i>BigQuery<\/i>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0447\u0438 <i>DataFlow<\/i> \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 <i>BigQuery<\/i>.<\/p>\n<pre><code class=\"bash\">export  project=myproject gcloud iam service-accounts create &quot;bq-to-sql-dataflow&quot; --project ${project}   gcloud projects add-iam-policy-binding ${project} \\ --member serviceAccount:&quot;bq-to-sql-dataflow@${project}.iam.gserviceaccount.com&quot; \\ --role roles\/dataflow.admin   gcloud projects add-iam-policy-binding ${project} \\ --member serviceAccount:&quot;bq-to-sql-dataflow@${project}.iam.gserviceaccount.com&quot; \\ --role roles\/bigquery.dataViewer <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 <i>DataFlow<\/i> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430: \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"bash\">gsutil mb gs:\/\/some-bucket-staging gsutil mb gs:\/\/some-bucket-temp <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>  \u0421\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <i>BigQuery<\/i> \u0432 <i>CloudSQL<\/i>. \u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 <i>DataFlow<\/i> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044f\u0437\u044b\u043a\u0438 <i>Python<\/i> \u0438 <i>Javascript<\/i>. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <i>Apache Beam<\/i>, json-\u0444\u0430\u0439\u043b (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u044b GOOGLE_APPLICATION_CREDENTIALS \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438) \u0438 \u0444\u0430\u0439\u043b requirements.txt, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0438 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d <i>beam-nuggets<\/i> \u043f\u0430\u043a\u0435\u0442). \u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 <i>Python<\/i> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <i>bq-to-sql<\/i> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">args = parser.parse_args() project = args.project job_name = args.job_name + str(uuid.uuid4()) bigquery_source = args.bigquery_source postgresql_user = args.postgresql_user postgresql_password = args.postgresql_password postgresql_host = args.postgresql_host postgresql_port = args.postgresql_port postgresql_db = args.postgresql_db postgresql_table = args.postgresql_table staging_location = args.staging_location temp_location = args.temp_location subnetwork = args.subnetwork   options = PipelineOptions(         \tflags=[&quot;--requirements_file&quot;, &quot;\/opt\/python\/requirements.txt&quot;]) # For Cloud execution, set the Cloud Platform project, job_name, # staging location, temp_location and specify DataflowRunner.   google_cloud_options = options.view_as(GoogleCloudOptions) google_cloud_options.project = project google_cloud_options.job_name = job_name google_cloud_options.staging_location = staging_location google_cloud_options.temp_location = temp_location google_cloud_options.region = &quot;us-west1&quot; worker_options = options.view_as(WorkerOptions) worker_options.zone = &quot;us-west1-a&quot; worker_options.subnetwork = subnetwork worker_options.max_num_workers = 20   options.view_as(StandardOptions).runner = 'DataflowRunner'   start_date = define_start_date() with beam.Pipeline(options=options) as p: \trows = p | 'QueryTableStdSQL' &gt;&gt; beam.io.Read(beam.io.BigQuerySource(                     \tquery='SELECT \\                         \tbilling_account_id, \\                         \tservice.id as service_id, \\                         \tservice.description as service_description, \\                         \tsku.id as sku_id, \\                         \tsku.description as sku_description, \\                         \tusage_start_time, \\                         \tusage_end_time, \\                         \tproject.id as project_id, \\                         \tproject.name as project_description, \\                         \tTO_JSON_STRING(project.labels) \\                             \tas project_labels, \\                         \tproject.ancestry_numbers \\                             \tas project_ancestry_numbers, \\                         \tTO_JSON_STRING(labels) as labels, \\                         \tTO_JSON_STRING(system_labels) as system_labels, \\                         \tlocation.location as location_location, \\                         \tlocation.country as location_country, \\                         \tlocation.region as location_region, \\                         \tlocation.zone as location_zone, \\                         \texport_time, \\                         \tcost, \\                         \tcurrency, \\                         \tcurrency_conversion_rate, \\                         \tusage.amount as usage_amount, \\                         \tusage.unit as usage_unit, \\                         \tusage.amount_in_pricing_units as \\                          \tusage_amount_in_pricing_units, \\                         \tusage.pricing_unit as usage_pricing_unit, \\                         \tTO_JSON_STRING(credits) as credits, \\                         \tinvoice.month as invoice_month, \\                    \t     cost_type \\ FROM `' + project + '.' + bigquery_source + '` \\                         \tWHERE export_time &gt;= &quot;' + start_date + '&quot;',                     \tuse_standard_sql=True)) \tsource_config = relational_db.SourceConfiguration(           \t              drivername='postgresql+pg8000',                         \thost=postgresql_host,                         \tport=postgresql_port,                         \tusername=postgresql_user,                         \tpassword=postgresql_password,                         \tdatabase=postgresql_db,                         \tcreate_if_missing=True,                         \t) \ttable_config = relational_db.TableConfiguration(                         \tname=postgresql_table,             \t            create_if_missing=True                         \t) \trows | 'Writing to DB' &gt;&gt; relational_db.Write(     \tsource_config=source_config,     \ttable_config=table_config \t) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 <i>export_time<\/i>, \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 <i>PostgreSQL<\/i>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 <i>BigQuery<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0431\u044b \u0441 \u044d\u0442\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u0441\u0435\u0447\u043a\u0438.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u043e\u0435 \u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435.<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 JSON \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 SA<\/h2>\n<p>  \u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0440\u0430\u043d\u0435\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 <i>Cloud Dataflow<\/i>, \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 <i>Cron<\/i>. \u041d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447-\u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 <i>Kubernetes<\/i>, \u0433\u0434\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 <i>Cron<\/i> \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<pre><code class=\"bash\">gcloud iam service-accounts keys create .\/cloud-sa.json \\ --iam-account &quot;bq-to-sql-dataflow@${project}.iam.gserviceaccount.com&quot; \\ --project ${project} <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 K8s:<\/p>\n<pre><code class=\"bash\">kubectl create secret generic bq-to-sql-creds --from-file=.\/cloud-sa.json <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Docker \u043e\u0431\u0440\u0430\u0437\u0430<\/h2>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 <i>DataFlow<\/i>, \u0441\u043e\u0437\u0434\u0430\u0451\u043c <i>Docker<\/i> \u043e\u0431\u0440\u0430\u0437 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u044b \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430 <i>Python<\/i>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"><b>Dockerfile:<\/b><\/p>\n<pre><code class=\"tex\">FROM python:latest RUN \\   bin\/bash -c &quot; \\   apt-get update &amp;&amp; \\   apt-get install python2.7-dev -y &amp;&amp; \\   pip install virtualenv &amp;&amp; \\   virtualenv -p \/usr\/bin\/python2.7 --distribute temp-python &amp;&amp; \\   source temp-python\/bin\/activate &amp;&amp; \\   pip2 install --upgrade setuptools &amp;&amp; \\   pip2 install pip==9.0.3 &amp;&amp; \\   pip2 install requests &amp;&amp; \\   pip2 install Cython &amp;&amp; \\   pip2 install apache_beam &amp;&amp; \\   pip2 install apache_beam[gcp] &amp;&amp; \\   pip2 install beam-nuggets &amp;&amp; \\   pip2 install psycopg2-binary &amp;&amp; \\   pip2 install uuid&quot;  COPY .\/bq-to-sql.py \/opt\/python\/bq-to-sql.py COPY .\/requirements.txt \/opt\/python\/requirements.txt COPY .\/main.sh \/opt\/python\/main.sh  FROM python:latest RUN \\   bin\/bash -c &quot; \\   apt-get update &amp;&amp; \\   apt-get install python2.7-dev -y &amp;&amp; \\   pip install virtualenv &amp;&amp; \\   virtualenv -p \/usr\/bin\/python2.7 --distribute temp-python &amp;&amp; \\   source temp-python\/bin\/activate &amp;&amp; \\   pip2 install --upgrade setuptools &amp;&amp; \\   pip2 install pip==9.0.3 &amp;&amp; \\   pip2 install requests &amp;&amp; \\   pip2 install Cython &amp;&amp; \\   pip2 install apache_beam &amp;&amp; \\   pip2 install apache_beam[gcp] &amp;&amp; \\   pip2 install beam-nuggets &amp;&amp; \\   pip2 install psycopg2-binary &amp;&amp; \\   pip2 install uuid&quot;  COPY .\/bq-to-sql.py \/opt\/python\/bq-to-sql.py COPY .\/requirements.txt \/opt\/python\/requirements.txt COPY .\/main.sh \/opt\/python\/main.sh  image:  imageTag: latest imagePullPolicy: IfNotPresent project:  job_name: &quot;bq-to-sql&quot; bigquery_source: &quot;[dataset].[table]\u201d postgresql:   user:    password:    host:    port: &quot;5432&quot;   db: &quot;billing&quot;   table: &quot;billing_export&quot; staging_location: &quot;gs:\/\/my-bucket-stg&quot; temp_location: &quot;gs:\/\/my-bucket-tmp&quot;   subnetwork: &quot;regions\/us-west1\/subnetworks\/default&quot; <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <i>Cron<\/i> \u0437\u0430\u0434\u0430\u0447, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <i>Kubernetes<\/i>, <i>Helm<\/i>:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"><b>cronjob.yaml<\/b>:<\/p>\n<pre><code class=\"tex\">apiVersion: batch\/v1beta1 kind: CronJob metadata:   name: {{ template &quot;bq-to-sql.fullname&quot; . }} spec:   schedule: &quot;0 0 * * *&quot;   jobTemplate: \tspec:   \ttemplate:     \tspec:     \t  restartPolicy: OnFailure       \tcontainers:       \t- name: {{ template &quot;bq-to-sql.name&quot; . }}         \timage: &quot;{{ .Values.image }}:{{ .Values.imageTag }}&quot;         \timagePullPolicy: &quot;{{ .Values.imagePullPolicy }}&quot;         \tcommand: [ &quot;\/bin\/bash&quot;, &quot;-c&quot;, &quot;bash \/opt\/python\/main.sh \\             \t{{ .Values.project }} \\             \t{{ .Values.job_name }} \\             \t{{ .Values.bigquery_source }} \\             \t{{ .Values.postgresql.user }} \\             \t{{ .Values.postgresql.password }} \\             \t{{ .Values.postgresql.host }} \\             \t{{ .Values.postgresql.port }} \\             \t{{ .Values.postgresql.db }} \\             \t{{ .Values.postgresql.table }} \\             \t{{ .Values.staging_location }} \\             \t{{ .Values.temp_location }} \\                 {{ .Values.subnetwork }}&quot;]         \tvolumeMounts:         \t- name: creds           \tmountPath: \/root\/.config\/gcloud           \treadOnly: true         \tenv:         \t- name: GOOGLE_APPLICATION_CREDENTIALS           \tvalue: \/root\/.config\/gcloud\/creds.json       \tvolumes:         \t- name: creds           \tsecret:             \tsecretName: bq-to-sql-creds <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<h2>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Grafana<\/h2>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0432 <i>Grafana<\/i>. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0435\u0442 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <a href=\"https:\/\/datastudio.google.com\/u\/0\/reporting\/0B7GT7ZlyzUmCZHFhNDlKVENHYmc\/page\/dizD\">Data Studio Billing Report Demo<\/a>.<\/p>\n<p>  <i><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\"> \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f \ud83d\ude42<\/div>\n<\/p><\/div>\n<p><\/i><br \/>  \u0418\u0437 \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u043d\u0430 \u0447\u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0418\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430:<\/p>\n<ul>\n<li>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0442\u0435\u043d\u0438\u044f (\u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432);<\/li>\n<li>\u0414\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 Grafana.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0446\u0435\u043b\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0434\u0430\u0448\u0431\u0430\u0440\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 <i>Google Cloud<\/i>.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/opsguru\/blog\/506112\/\"> https:\/\/habr.com\/ru\/company\/opsguru\/blog\/506112\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/opsguru\/blog\/506112\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_c\/qe\/q_\/_cqeq_360w7uo_k4autpimjrb60.jpeg\"><\/div>\n<p>  \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0435 \u043b\u044e\u0431\u044f\u0442 \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, <strike>\u0447\u0435\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c<\/strike> \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439.<\/p>\n<p>  <i>Google Cloud Platform<\/i> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0430\u0440\u0438\u0444\u043d\u044b\u0435 \u043f\u043b\u0430\u043d\u044b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c <i>GCE<\/i> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 (<i>CPU<\/i>, \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0436\u0435\u0441\u0442\u043a\u0438\u0435 \u0434\u0438\u0441\u043a\u0438). \u0420\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 <i>Google Kubernetes Engine (GKE)<\/i> \u0438 <i>Google Cloud Dataproc<\/i> \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 <i>Google Compute Engine (GCE)<\/i>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438 \u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u044e\u0434\u0436\u0435\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0442\u0435\u043c \u0446\u0435\u043d\u043d\u0435\u0435 \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0442 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u043e \u0442\u0440\u0430\u0442\u0430\u0445 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0441\u0447\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044f.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305116","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305116"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305116\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}