{"id":320222,"date":"2021-03-25T09:01:09","date_gmt":"2021-03-25T09:01:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320222"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320222","title":{"rendered":"\u0423\u043c\u043d\u044b\u0435 \u043f\u043e\u0433\u043e\u0434\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 Flink SQL"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a2\/168\/bc5\/1a2168bc521f06a268459076e14b07f6.png\" width=\"1162\" height=\"870\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u0432 \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0428\u0442\u0430\u0442\u0430\u0445 &#8212; \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421 FLaNK \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/436\/40a\/7a6\/43640a7a66b5ccb06536ab054c325a97.png\" width=\"1402\" height=\"1174\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b0f\/b70\/da3\/b0fb70da3706c0afa54745c408b97a7e.png\" width=\"2048\" height=\"1042\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f0c\/18b\/715\/f0c18b71567cb03d294c496851854aee.png\" width=\"2498\" height=\"1104\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442 Kafka \u0434\u043e Kudu, \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2013 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0448\u0430\u0433\u0430.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/766\/127\/0fb\/7661270fb0930701575fbc8a74cd5843.png\" width=\"2464\" height=\"994\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0438 \u0441\u0445\u0435\u043c\u044b: \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u0440\u0435\u043a\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c. Schema Registry \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Swagger API, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 CI\/CD &amp; DevOps \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fbf\/2d8\/a3c\/fbf2d8a3c829084183a2689a6bf9f516.png\" width=\"1756\" height=\"1212\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6d2\/fb2\/c4a\/6d2fb2c4a36999f036d80544af534b06.png\" width=\"1464\" height=\"1156\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0441 \u0432\u0430\u0448\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0434\u043e\u043f\u0443\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0442\u043e \u0432\u044b \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4a1\/c2a\/a03\/4a1c2aa036c7519b6d738dc6298d19c8.png\" width=\"1024\" height=\"1035\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 BI \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 Cloudera DataViz.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ed\/f0a\/0f7\/1edf0a0f739428b97f9c3b7f80f2c9d7.png\" width=\"1407\" height=\"1179\"><figcaption><\/figcaption><\/figure>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Apache Kudu \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Hue \u0438 Apache Impala.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/85c\/1ee\/c09\/85c1eec09ed9e712f16b6bdaafe1e7e3.png\" width=\"1536\" height=\"1126\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u0421\u0428\u0410, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 XML. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/730\/2d3\/331\/7302d333127cc416402707d7bd676296.png\" width=\"756\" height=\"1028\"><figcaption><\/figcaption><\/figure>\n<p>NiFi \u0444\u043b\u043e\u0443 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>GenerateFlowFile &#8212;&nbsp;<\/strong>\u0438\u043c\u043e\u0440\u0442 \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u043e\u0442 NOAA<\/p>\n<\/li>\n<li>\n<p><strong>InvokeHTTP &#8212;&nbsp;<\/strong>\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u0432 ZIP \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/li>\n<li>\n<p><strong>CompressContent &#8212;&nbsp;<\/strong>\u0434\u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f ZIP<\/p>\n<\/li>\n<li>\n<p><strong>UnpackContent &#8212;&nbsp;<\/strong>\u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0442 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 ZIP \u0430\u0440\u0445\u0438\u0432\u0430<\/p>\n<\/li>\n<li>\n<p><strong>*RouteOnAttribute &#8212;&nbsp;<\/strong>\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u043c (${filename:startsWith(&#8216;K&#8217;)}).&nbsp;<strong>\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>*QueryRecord<\/strong>&nbsp;&#8212; XMLReader \u0432 JsonRecordSetWriter.&nbsp; &nbsp;<strong>Query<\/strong>:&nbsp; SELECT * FROM FLOWFILE WHERE NOT location LIKE &#8216;%Unknown%&#8217;.&nbsp; \u041d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u0446\u0438\u0439.&nbsp;&nbsp;<strong>\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.&nbsp;\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PutKudu, PutORC, PutHDFS, PutHiveStreaming, PutHbaseRecord, PutDatabaseRecord, PublishKafkaRecord2* \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 NiFi<strong>.<\/strong>   <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fec\/390\/d94\/fec390d944ee10a20760e4d393614ff6.png\" width=\"1085\" height=\"666\"><figcaption><\/figcaption><\/figure>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0441\u0445\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u044b &#8212; \u0434\u0430\u0436\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Avro.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/262\/c20\/daf\/262c20daf47cadd9c97955365119ff2c.png\" alt=\"\" title=\"\" width=\"1838\" height=\"1059\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Json:<\/p>\n<p><code>[ {<\/code><\/p>\n<p><code>&nbsp; \"credit\" : \"NOAA's National Weather Service\",<\/code><\/p>\n<p><code>&nbsp; \"credit_URL\" : \"http:\/\/weather.gov\/\",<\/code><\/p>\n<p><code>&nbsp; \"image\" : {<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"url\" : \"http:\/\/weather.gov\/images\/xml_logo.gif\",<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"title\" : \"NOAA's National Weather Service\",<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"link\" : \"http:\/\/weather.gov\"<\/code><\/p>\n<p><code>&nbsp; },<\/code><\/p>\n<p><code>&nbsp; \"suggested_pickup\" : \"15 minutes after the hour\",<\/code><\/p>\n<p><code>&nbsp; \"suggested_pickup_period\" : 60,<\/code><\/p>\n<p><code>&nbsp; \"location\" : \"Stanley Municipal Airport, ND\",<\/code><\/p>\n<p><code>&nbsp; \"station_id\" : \"K08D\",<\/code><\/p>\n<p><code>&nbsp; \"latitude\" : 48.3008,<\/code><\/p>\n<p><code>&nbsp; \"longitude\" : -102.4064,<\/code><\/p>\n<p><code>&nbsp; \"observation_time\" : \"Last Updated on Jul 10 2020, 9:55 am CDT\",<\/code><\/p>\n<p><code>&nbsp; \"observation_time_rfc822\" : \"Fri, 10 Jul 2020 09:55:00 -0500\",<\/code><\/p>\n<p><code>&nbsp; \"weather\" : \"Fair\",<\/code><\/p>\n<p><code>&nbsp; \"temperature_string\" : \"66.0 F (19.0 C)\",<\/code><\/p>\n<p><code>&nbsp; \"temp_f\" : 66.0,<\/code><\/p>\n<p><code>&nbsp; \"temp_c\" : 19.0,<\/code><\/p>\n<p><code>&nbsp; \"relative_humidity\" : 83,<\/code><\/p>\n<p><code>&nbsp; \"wind_string\" : \"South at 6.9 MPH (6 KT)\",<\/code><\/p>\n<p><code>&nbsp; \"wind_dir\" : \"South\",<\/code><\/p>\n<p><code>&nbsp; \"wind_degrees\" : 180,<\/code><\/p>\n<p><code>&nbsp; \"wind_mph\" : 6.9,<\/code><\/p>\n<p><code>&nbsp; \"wind_kt\" : 6,<\/code><\/p>\n<p><code>&nbsp; \"pressure_in\" : 30.03,<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_string\" : \"60.8 F (16.0 C)\",<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_f\" : 60.8,<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_c\" : 16.0,<\/code><\/p>\n<p><code>&nbsp; \"visibility_mi\" : 10.0,<\/code><\/p>\n<p><code>&nbsp; \"icon_url_base\" : \"http:\/\/forecast.weather.gov\/images\/wtf\/small\/\",<\/code><\/p>\n<p><code>&nbsp; \"two_day_history_url\" : \"http:\/\/www.weather.gov\/data\/obhistory\/K08D.html\",<\/code><\/p>\n<p><code>&nbsp; \"icon_url_name\" : \"skc.png\",<\/code><\/p>\n<p><code>&nbsp; \"ob_url\" : \"http:\/\/www.weather.gov\/data\/METAR\/K08D.1.txt\",<\/code><\/p>\n<p><code>&nbsp; \"disclaimer_url\" : \"http:\/\/weather.gov\/disclaimer.html\",<\/code><\/p>\n<p><code>&nbsp; \"copyright_url\" : \"http:\/\/weather.gov\/disclaimer.html\",<\/code><\/p>\n<p><code>&nbsp; \"privacy_policy_url\" : \"http:\/\/weather.gov\/notice.html\"<\/code><\/p>\n<p><code>} ]<\/code><\/p>\n<hr>\n<p><strong>\u041a\u043e\u0434<\/strong><\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442: <a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/scripts\/setup.sh\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/scripts\/setup.sh<\/strong><\/a><\/p>\n<p>NiFi \u0444\u043b\u043e\u0443:<br \/><a href=\"https:\/\/github.com\/tspannhw\/ClouderaFlowManagementWorkshop\/tree\/main\/flows\"><strong>https:\/\/github.com\/tspannhw\/ClouderaFlowManagementWorkshop\/tree\/main\/flows<\/strong><\/a><\/p>\n<p><strong>SQL<\/strong><\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>INSERT INTO weathernj<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>SELECT `location`, station_id,latitude,longitude,observation_time,weather,<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>temperature_string, temp_f,temp_c,relative_humidity,wind_string,wind_dir,wind_degrees,wind_mph,<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>wind_kt, pressure_in,dewpoint_string,dewpoint_f,dewpoint_c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>FROM weather<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>WHERE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>&nbsp;&nbsp;&nbsp; `location` is not null and `location` &lt;&gt; &#8216;null&#8217; and trim(`location`) &lt;&gt; &#187; and `location` like &#8216;%NJ&#8217;;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>&nbsp;<\/strong><\/p>\n<p><strong>Kafka Insert<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/flinksql\/weathernj.sql\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/flinksql\/weathernj.sql<\/strong><\/a><\/p>\n<p><strong>\u0421\u0445\u0435\u043c\u044b<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weathernj.avsc\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weathernj.avsc<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weather.avsc\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weather.avsc<\/strong><\/a><strong>  <\/strong><\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 Slack<\/strong><\/p>\n<p>Location Cincinnati\/Northern Kentucky International Airport, KY Station KCVG<br \/>Temperature: 49.0 F (9.4 C)<br \/>Humdity: 83<br \/>Wind East at 3.5 MPH (3 KT)<br \/>Overcast<br \/>Dewpoint 44.1 F (6.7 C)Observed at Tue, 27 Oct 2020 11:52:00 -0400&#8212;- tracking info &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UUID: 2cb6bd67-148c-497d-badf-dfffb4906b89<br \/>&nbsp;&nbsp;Kafka offset: 0<br \/>Kafka Timestamp: 1603818351260<br \/>=========================================================<\/p>\n<\/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\/cloudera\/blog\/547050\/\"> https:\/\/habr.com\/ru\/company\/cloudera\/blog\/547050\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u0432 \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0428\u0442\u0430\u0442\u0430\u0445 &#8212; \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421 FLaNK \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442 Kafka \u0434\u043e Kudu, \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u2013 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0448\u0430\u0433\u0430.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0438 \u0441\u0445\u0435\u043c\u044b: \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u0440\u0435\u043a\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c. Schema Registry \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Swagger API, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 CI\/CD &amp; DevOps \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u0441 \u0432\u0430\u0448\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0434\u043e\u043f\u0443\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0442\u043e \u0432\u044b \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 BI \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 Cloudera DataViz.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Apache Kudu \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Hue \u0438 Apache Impala.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u0421\u0428\u0410, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 XML. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>NiFi \u0444\u043b\u043e\u0443 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>GenerateFlowFile &#8212;&nbsp;<\/strong>\u0438\u043c\u043e\u0440\u0442 \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u043e\u0442 NOAA<\/p>\n<\/li>\n<li>\n<p><strong>InvokeHTTP &#8212;&nbsp;<\/strong>\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u0432 ZIP \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/li>\n<li>\n<p><strong>CompressContent &#8212;&nbsp;<\/strong>\u0434\u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f ZIP<\/p>\n<\/li>\n<li>\n<p><strong>UnpackContent &#8212;&nbsp;<\/strong>\u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0442 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 ZIP \u0430\u0440\u0445\u0438\u0432\u0430<\/p>\n<\/li>\n<li>\n<p><strong>*RouteOnAttribute &#8212;&nbsp;<\/strong>\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u044d\u0440\u043e\u043f\u043e\u0440\u0442\u0430\u043c (${filename:startsWith(&#8216;K&#8217;)}).&nbsp;<strong>\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>*QueryRecord<\/strong>&nbsp;&#8212; XMLReader \u0432 JsonRecordSetWriter.&nbsp; &nbsp;<strong>Query<\/strong>:&nbsp; SELECT * FROM FLOWFILE WHERE NOT location LIKE &#8216;%Unknown%&#8217;.&nbsp; \u041d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u0446\u0438\u0439.&nbsp;&nbsp;<strong>\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.&nbsp;\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PutKudu, PutORC, PutHDFS, PutHiveStreaming, PutHbaseRecord, PutDatabaseRecord, PublishKafkaRecord2* \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 NiFi<strong>.<\/strong>   <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0435\u0441\u0442\u0440\u0430 \u0441\u0445\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u0448\u0435\u0439 \u0442\u0435\u043c\u044b &#8212; \u0434\u0430\u0436\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Avro.  <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Json:<\/p>\n<p><code>[ {<\/code><\/p>\n<p><code>&nbsp; \"credit\" : \"NOAA's National Weather Service\",<\/code><\/p>\n<p><code>&nbsp; \"credit_URL\" : \"http:\/\/weather.gov\/\",<\/code><\/p>\n<p><code>&nbsp; \"image\" : {<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"url\" : \"http:\/\/weather.gov\/images\/xml_logo.gif\",<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"title\" : \"NOAA's National Weather Service\",<\/code><\/p>\n<p><code>&nbsp; &nbsp; \"link\" : \"http:\/\/weather.gov\"<\/code><\/p>\n<p><code>&nbsp; },<\/code><\/p>\n<p><code>&nbsp; \"suggested_pickup\" : \"15 minutes after the hour\",<\/code><\/p>\n<p><code>&nbsp; \"suggested_pickup_period\" : 60,<\/code><\/p>\n<p><code>&nbsp; \"location\" : \"Stanley Municipal Airport, ND\",<\/code><\/p>\n<p><code>&nbsp; \"station_id\" : \"K08D\",<\/code><\/p>\n<p><code>&nbsp; \"latitude\" : 48.3008,<\/code><\/p>\n<p><code>&nbsp; \"longitude\" : -102.4064,<\/code><\/p>\n<p><code>&nbsp; \"observation_time\" : \"Last Updated on Jul 10 2020, 9:55 am CDT\",<\/code><\/p>\n<p><code>&nbsp; \"observation_time_rfc822\" : \"Fri, 10 Jul 2020 09:55:00 -0500\",<\/code><\/p>\n<p><code>&nbsp; \"weather\" : \"Fair\",<\/code><\/p>\n<p><code>&nbsp; \"temperature_string\" : \"66.0 F (19.0 C)\",<\/code><\/p>\n<p><code>&nbsp; \"temp_f\" : 66.0,<\/code><\/p>\n<p><code>&nbsp; \"temp_c\" : 19.0,<\/code><\/p>\n<p><code>&nbsp; \"relative_humidity\" : 83,<\/code><\/p>\n<p><code>&nbsp; \"wind_string\" : \"South at 6.9 MPH (6 KT)\",<\/code><\/p>\n<p><code>&nbsp; \"wind_dir\" : \"South\",<\/code><\/p>\n<p><code>&nbsp; \"wind_degrees\" : 180,<\/code><\/p>\n<p><code>&nbsp; \"wind_mph\" : 6.9,<\/code><\/p>\n<p><code>&nbsp; \"wind_kt\" : 6,<\/code><\/p>\n<p><code>&nbsp; \"pressure_in\" : 30.03,<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_string\" : \"60.8 F (16.0 C)\",<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_f\" : 60.8,<\/code><\/p>\n<p><code>&nbsp; \"dewpoint_c\" : 16.0,<\/code><\/p>\n<p><code>&nbsp; \"visibility_mi\" : 10.0,<\/code><\/p>\n<p><code>&nbsp; \"icon_url_base\" : \"http:\/\/forecast.weather.gov\/images\/wtf\/small\/\",<\/code><\/p>\n<p><code>&nbsp; \"two_day_history_url\" : \"http:\/\/www.weather.gov\/data\/obhistory\/K08D.html\",<\/code><\/p>\n<p><code>&nbsp; \"icon_url_name\" : \"skc.png\",<\/code><\/p>\n<p><code>&nbsp; \"ob_url\" : \"http:\/\/www.weather.gov\/data\/METAR\/K08D.1.txt\",<\/code><\/p>\n<p><code>&nbsp; \"disclaimer_url\" : \"http:\/\/weather.gov\/disclaimer.html\",<\/code><\/p>\n<p><code>&nbsp; \"copyright_url\" : \"http:\/\/weather.gov\/disclaimer.html\",<\/code><\/p>\n<p><code>&nbsp; \"privacy_policy_url\" : \"http:\/\/weather.gov\/notice.html\"<\/code><\/p>\n<p><code>} ]<\/code><\/p>\n<hr>\n<p><strong>\u041a\u043e\u0434<\/strong><\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442: <a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/scripts\/setup.sh\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/scripts\/setup.sh<\/strong><\/a><\/p>\n<p>NiFi \u0444\u043b\u043e\u0443:<br \/><a href=\"https:\/\/github.com\/tspannhw\/ClouderaFlowManagementWorkshop\/tree\/main\/flows\"><strong>https:\/\/github.com\/tspannhw\/ClouderaFlowManagementWorkshop\/tree\/main\/flows<\/strong><\/a><\/p>\n<p><strong>SQL<\/strong><\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>INSERT INTO weathernj<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>SELECT `location`, station_id,latitude,longitude,observation_time,weather,<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>temperature_string, temp_f,temp_c,relative_humidity,wind_string,wind_dir,wind_degrees,wind_mph,<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>wind_kt, pressure_in,dewpoint_string,dewpoint_f,dewpoint_c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>FROM weather<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>WHERE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"50\" width=\"50\">\n<\/td>\n<td>\n<p>&nbsp;&nbsp;&nbsp; `location` is not null and `location` &lt;&gt; &#8216;null&#8217; and trim(`location`) &lt;&gt; &#187; and `location` like &#8216;%NJ&#8217;;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>&nbsp;<\/strong><\/p>\n<p><strong>Kafka Insert<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/flinksql\/weathernj.sql\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/flinksql\/weathernj.sql<\/strong><\/a><\/p>\n<p><strong>\u0421\u0445\u0435\u043c\u044b<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weathernj.avsc\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weathernj.avsc<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weather.avsc\"><strong>https:\/\/github.com\/tspannhw\/ApacheConAtHome2020\/blob\/main\/schemas\/weather.avsc<\/strong><\/a><strong>  <\/strong><\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 Slack<\/strong><\/p>\n<p>Location Cincinnati\/Northern Kentucky International Airport, KY Station KCVG<br \/>Temperature: 49.0 F (9.4 C)<br \/>Humdity: 83<br \/>Wind East at 3.5 MPH (3 KT)<br \/>Overcast<br \/>Dewpoint 44.1 F (6.7 C)Observed at Tue, 27 Oct 2020 11:52:00 -0400&#8212;- tracking info &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UUID: 2cb6bd67-148c-497d-badf-dfffb4906b89<br \/>&nbsp;&nbsp;Kafka offset: 0<br \/>Kafka Timestamp: 1603818351260<br \/>=========================================================<\/p>\n<\/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\/cloudera\/blog\/547050\/\"> https:\/\/habr.com\/ru\/company\/cloudera\/blog\/547050\/<\/a><br \/><\/br><\/br><\/br><\/br><\/br><\/br><\/br><\/br><\/p>\n<\/p>\n<\/hr>\n<\/div>\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-320222","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320222","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=320222"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320222\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}