{"id":457877,"date":"2025-04-29T09:11:02","date_gmt":"2025-04-29T09:11:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=457877"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=457877","title":{"rendered":"<span>\u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433 Apache Flink \u0438\u0437 MongoDB \u0432 PostgreSQL \u043d\u0430 Python<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0426\u0430\u0439, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0432 \u041c\u0422\u0421 Web Services, \u043d\u043e \u043d\u0430 \u0434\u0435\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f DA\/DE\/BI: \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u0431\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0438 \u0432\u0438\u0442\u0440\u0438\u043d \u0434\u043b\u044f \u043d\u0438\u0445, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 ETL-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043f\u043e \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435, DQ, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u043c \u0435\u0449\u0435. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043f\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 MongoDB \u0432 PostgreSQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Flink (<em>\u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c \u0438\u0437 Kafka \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e, \u0430 \u0442\u0430\u043a \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0449\u0443\u043f\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0411\u0414<\/em>). \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 minikube (kubernetes), \u0430 \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442 Python. \u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u043f\u043e\u0441\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 MacBook \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c i7. <\/p>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c, \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0435 \u0438\u0437 MongoDB \u0432 Postgres \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e Flink, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043f\u0435\u0440\u0435\u0436\u0435\u0432\u044b\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 WordCount \u0438\u0437 flink-kubernetes-operator, \u0433\u0434\u0435 \u043d\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0435 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u043d\u0435\u043c. \u0415\u0441\u043b\u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f PyFlink, \u0442\u043e \u043c\u044b \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0441 Harness SDK \u0438 Apache Beam \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u0417\u043d\u0430\u043a\u043e\u043c\u043e?<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448 \u043f\u0443\u0442\u044c! \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0442\u0435\u043c, \u043a\u0442\u043e <s>\u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0435\u0446<\/s> \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c Flink \u043d\u0430 \u0440\u043e\u0434\u043d\u043e\u043c Python \u0438 \u043a\u0442\u043e \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043e\u0442\u043e\u0440\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.  \u0412\u0441\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\">\u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub<\/a>. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e6\/6d7\/955\/1e66d7955ca9be5b9c01b109bb6e8e96.png\" width=\"1600\" height=\"900\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1e6\/6d7\/955\/1e66d7955ca9be5b9c01b109bb6e8e96.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e6\/6d7\/955\/1e66d7955ca9be5b9c01b109bb6e8e96.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0432\u0430\u0448\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438 \u043a\u0430\u043a. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0440\u0436\u0435\u043d\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0442\u043e\u0438\u0442. <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#1\"><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#2\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MongoDB<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#3\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 PostgreSQL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#4\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MinIo<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#5\"><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Apache Flink<\/strong><\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#6\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c Flink c \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink-kubernetes-operator<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#7\">Flink Native Kubernetes<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#8\"><strong>\u041d\u0443 \u0432\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0435<\/strong><\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0427\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c: <\/p>\n<ul>\n<li>\n<p>\u043b\u044e\u0431\u043e\u0435 IDE \u043f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443 \u2014 \u0443 \u043c\u0435\u043d\u044f VsCode;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/ru\/docs\/tasks\/tools\/install-minikube\/\">Minikube<\/a> (kubernetes) \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Docker<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b minikube; <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/helm.sh\/ru\/docs\/intro\/install\/\">Helm<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438; <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apache\/flink-kubernetes-operator\/tree\/main\">Flink-kubernetes-operator<\/a> \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/minio.yaml\">Minio<\/a> \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f checkpoints\/savepoints Flink (\u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435); <\/p>\n<\/li>\n<li>\n<p>mongodb \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a; <\/p>\n<\/li>\n<li>\n<p>postgresql \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b. <\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">docker<\/a>, <a href=\"https:\/\/kubernetes.io\/ru\/docs\/tasks\/tools\/install-minikube\/\">minikube<\/a> \u0438 <a href=\"https:\/\/helm.sh\/ru\/docs\/intro\/install\/\">helm<\/a> \u044f \u043d\u0435 \u0431\u0443\u0434\u0443: \u0443 \u043d\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0438 \u0435\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0439\u043c\u0435\u0442 \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0435\u0431\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c\u00a0\u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c minikube. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043f\u0438\u0448\u0435\u043c: <\/p>\n<pre><code class=\"bash\">minikube start --cpus=5 --memory=8096;<\/code><\/pre>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u041a\u043e\u0433\u0434\u0430 \u043c\u0438\u043d\u0438-\u043a\u0443\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a4\/39e\/9ac\/1a439e9ac02247b87951dc071d139e44.png\" alt=\"\u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u0438\u043d\u0438\u043a\u0443\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f\" title=\"\" width=\"715\" height=\"228\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1a4\/39e\/9ac\/1a439e9ac02247b87951dc071d139e44.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a4\/39e\/9ac\/1a439e9ac02247b87951dc071d139e44.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 Web UI minikube dashboard:<\/p>\n<pre><code class=\"bash\">minikube dashboard;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e50\/0f1\/1d3\/e500f11d36701218e26c7ea482de9c8e.png\" alt=\"\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f WebUI\" title=\"\" width=\"1600\" height=\"501\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e50\/0f1\/1d3\/e500f11d36701218e26c7ea482de9c8e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e50\/0f1\/1d3\/e500f11d36701218e26c7ea482de9c8e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u0441\u044f WebUI. \u041e\u0442\u043b\u0438\u0447\u043d\u043e. Minikube \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flink-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"bash\">kubectl apply -f https:\/\/github.com\/jetstack\/cert-manager\/releases\/download\/v1.11.0\/cert-manager.yaml; <\/code><\/pre>\n<p>\u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Flink-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443. <\/p>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MongoDB\u00a0<\/h3>\n<blockquote>\n<p><em>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 MacBook \u043d\u0430 M-\u0447\u0438\u043f\u0435, \u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443:\u00a0<\/em><\/p>\n<\/blockquote>\n<pre><code class=\"bash\">ErrImagePull: no matching manifest for linux\/arm64\/v8 in the manifest list entries <\/code><\/pre>\n<blockquote>\n<p><em>\u041d\u0430 Stackoverflow \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u0434 amd64 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443:<\/em><\/p>\n<\/blockquote>\n<pre><code class=\"bash\">minikube start --cpus=5 --memory=8096 --driver=docker --kubernetes-version=v1.26.3 --base-image=kicbase\/ubuntu:v1.26.3 <\/code><\/pre>\n<blockquote>\n<p><em>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431, \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 \u043d\u0430 M-\u0447\u0438\u043f\u0435 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/em><\/p>\n<\/blockquote>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/bitnami\/charts\/tree\/main\/bitnami\/mongodb\">helm-\u043e\u0431\u0440\u0430\u0437 \u043e\u0442 bitnami<\/a>. \u041f\u043e\u0434\u043d\u044f\u0442\u044c MongoDB \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 kubernetes \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0443\u0447\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u2014 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c helm chart \u0432\u0441\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 yaml-\u0444\u0430\u0439\u043b\u0443 \u043d\u0430 12 \u0441\u0442\u0440\u043e\u0447\u0435\u043a.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a cdc-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a OPLOG-\u0436\u0443\u0440\u043d\u0430\u043b\u0443 (\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445) \u0438 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0431\u0430\u0437\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e replica set.<\/p>\n<p>\u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/bitnami_mongo_replica_set\">bitnami_mongo_replica_set<\/a> \u043b\u0435\u0436\u0430\u0442 2 \u0444\u0430\u0439\u043b\u0430: <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/bitnami_mongo_replica_set\/values.yaml\">values.yaml<\/a> \u0438<a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/bitnami_mongo_replica_set\/init-mongo.js\"> init-mongo.js<\/a>. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u043d\u0435\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c namespace \u0438 configMap, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0443 MongoDB \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 replica set:<\/p>\n<pre><code class=\"bash\">kubectl create namespace mongodb;  kubectl -n mongodb create configmap init-mongo --from-file .\/bitnami_mongo_replica_set\/init-mongo.js;  helm install mongodb oci:\/\/registry-1.docker.io\/bitnamicharts\/mongodb -f .\/bitnami_mongo_replica_set\/values.yaml --namespace mongodb;<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53f\/ac3\/709\/53fac3709547e7adc7e64d0d760df796.png\" alt=\"\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439\" title=\"\" width=\"1460\" height=\"444\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/53f\/ac3\/709\/53fac3709547e7adc7e64d0d760df796.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53f\/ac3\/709\/53fac3709547e7adc7e64d0d760df796.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0430\u0448 WebUI \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5b7\/f7e\/7e4\/5b7f7e7e49e299f4208929bf63ada60c.png\" alt=\"\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0430\u0448 WebUI \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\" title=\"\" width=\"1600\" height=\"816\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5b7\/f7e\/7e4\/5b7f7e7e49e299f4208929bf63ada60c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5b7\/f7e\/7e4\/5b7f7e7e49e299f4208929bf63ada60c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0434\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u043e\u0434\u0430: \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043f\u043e\u0434 mongodb-0, \u0437\u0430\u0442\u0435\u043c \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 exec into pod. \u0412\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">mongosh;  use database;  db.users.find();<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a0\/673\/03b\/9a067303b88ec98c4310feb83aca3a4e.png\" alt=\"\u0412\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0431\u0430\u0437\u0430 \u0435\u0441\u0442\u044c, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c\" title=\"\u0412\u0438\u0434\u0438\u043c \u0431\u0430\u0437\u0443, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439\" width=\"1600\" height=\"781\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9a0\/673\/03b\/9a067303b88ec98c4310feb83aca3a4e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a0\/673\/03b\/9a067303b88ec98c4310feb83aca3a4e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0412\u0438\u0434\u0438\u043c \u0431\u0430\u0437\u0443, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439<\/em><\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"3\" id=\"3\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 PostgreSQL\u00a0<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c Postgres \u0441\u043e \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437\u0432\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a:<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/postgresql-deployment.yaml;<\/code><\/pre>\n<p>\u0412 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/postgresql-deployment.yaml\">postgresql-deployment.yam<\/a><u>l<\/u> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 namespace, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0438\u0437\u0432\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043a\u0443\u0434\u0430 \u043d\u0430\u0448\u0430 \u0431\u0443\u0434\u0443\u0449\u0430\u044f Flink job \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0435\u0448\u0430\u044e\u0442\u0441\u044f 2 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0441\u0442\u0430\u043c\u043f\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0441\u0442\u0430\u043c\u043f\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 (soft delete). \u0422\u0430\u043a \u043c\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 flink \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e insert, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 update \u0438 delete.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/136\/1d8\/7d7\/1361d87d7a0c2b1093bdae12a256a8cc.png\" alt=\"\u041f\u043e\u0434\u043d\u044f\u0442\u0430\u044f \u0411\u0414\" title=\"\u041f\u043e\u0434\u043d\u044f\u0442\u0430\u044f \u0411\u0414\" width=\"1600\" height=\"778\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/136\/1d8\/7d7\/1361d87d7a0c2b1093bdae12a256a8cc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/136\/1d8\/7d7\/1361d87d7a0c2b1093bdae12a256a8cc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u043e\u0434\u043d\u044f\u0442\u0430\u044f \u0411\u0414<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 MongoDB, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430: <\/p>\n<pre><code class=\"bash\">psql -U user -password password -p 5432 -d mydb;  SELECT table_name FROM information_schema.tables WHERE table_schema='public'; <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 DBeaver, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437\u0432\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0440\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"bash\">kubectl port-forward service\/postgresql-nodeport 30432:5432 --namespace=postgresql;<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:\u00a0<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c9\/a2d\/509\/1c9a2d50908284dc84cacb863af783f3.png\" alt=\"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\" title=\"\" width=\"1588\" height=\"921\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1c9\/a2d\/509\/1c9a2d50908284dc84cacb863af783f3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c9\/a2d\/509\/1c9a2d50908284dc84cacb863af783f3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><a class=\"anchor\" name=\"4\" id=\"4\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MinIo\u00a0<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Minio \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0434\u043b\u044f checkpoint- \u0438 savepoint-\u0437\u0430\u0434\u0430\u043d\u0438\u0439 Flink. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u044f\u0445 \u0438\u043b\u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0418\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c oplog-\u0436\u0443\u0440\u043d\u0430\u043b (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435) \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. <\/p>\n<blockquote>\n<p>Flink \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f FsStateBackend\/RocksDBStateBackend \u0438\u043b\u0438 MemoryStateBackend. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 \u0434\u043b\u044f state.backend, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PVC. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 MinIo. <\/p>\n<\/blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e Postgres \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 <u>minio.yaml<\/u> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f namespace, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c Flink \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439.<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/minio.yaml;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0440\u0442\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"bash\">kubectl port-forward services\/minio-service 9090:9090 --namespace=minio;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0438\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 MinIo \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0431\u0430\u043a\u0435\u0442\u043e\u043c \u043f\u043e\u0434 checkpoint Flink:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d90\/6e0\/fe2\/d906e0fe2b69d0ad2883ae061bf40848.png\" alt=\"\u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\" title=\"\u041b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e login = minio, password = minio123\" width=\"1600\" height=\"620\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d90\/6e0\/fe2\/d906e0fe2b69d0ad2883ae061bf40848.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d90\/6e0\/fe2\/d906e0fe2b69d0ad2883ae061bf40848.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e login = minio, password = minio123<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e: Fake pipe<\/h3>\n<p>\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u043f\u043e\u0434 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 MongoDB, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 (<em>\u0434\u0430, \u043e\u043f\u044f\u0442\u044c<\/em>) \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"bash\">eval $(minikube docker-env);  docker build -t myimages\/python_mongo_generator:latest .\/fake_source_pipe;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca5\/f5d\/7bc\/ca5f5d7bc0ec5d85bc603a9140b2828a.png\" alt=\"\u041d\u0430\u0447\u043d\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448 \u043e\u0431\u0440\u0430\u0437 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 minikube \u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.\" title=\"\" width=\"999\" height=\"697\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ca5\/f5d\/7bc\/ca5f5d7bc0ec5d85bc603a9140b2828a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca5\/f5d\/7bc\/ca5f5d7bc0ec5d85bc603a9140b2828a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0432\u043e\u0434\u0438\u043b\u0438 \u0432\u044b\u0448\u0435, \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0432\u043d\u0443\u0442\u0440\u0438 minikube. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c eval $(minikube docker-env), \u0442\u043e \u043e\u043d \u0441\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438 minikube \u0435\u0433\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u0434\u0430 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <s>\u044f\u0440\u043e\u0441\u0442\u043d\u043e<\/s> \u043d\u0430\u0447\u043d\u0435\u0442 \u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e MongoDB: <\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/fake_source_pipe\/python-pod.yaml;<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 users \u0432 MongoDB, \u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a users_postgres \u0432 PostgreSQL, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 S3 \u0441 \u0431\u0430\u043a\u0435\u0442\u043e\u043c \u0434\u043b\u044f checkpoint\u2019\u043e\u0432\/savepoint\u2019\u043e\u0432 Flink \u0432 \u0432\u0438\u0434\u0435 MinIo. <em>\u0424\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0436\u0435 \u0432\u043e\u0432\u0441\u044e \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/em><\/p>\n<p><a class=\"anchor\" name=\"5\" id=\"5\"><\/a><\/p>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Apache Flink<\/h2>\n<p><em>\u041f\u043e\u0434\u043d\u044f\u0442\u044c Apache Flink \u043c\u043e\u0436\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:\u00a0<\/em><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438 application mode \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <u>flink-kubernetes-operator<\/u>. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0434\u043b\u044f <strong>\u043a\u0430\u0436\u0434\u043e\u0433\u043e <\/strong>\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 job- \u0438 task-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0443\u044e \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0437\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442\u0443 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u041f\u0440\u0430\u0432\u0434\u0430, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 WebUI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0447\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 session mode \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c Apache Flink \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c kubernetes. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d job manager (<em>\u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438<\/em>), \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0434\u0438\u043d\u044b\u0439 WebUI \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u041d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 <s>\u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0440\u043e\u0431\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447<\/s> \u0443\u0436\u0435 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430\u0445 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_high_availability\">flink_cluster_high_availability<\/a>, <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_no_high_availability\">flink_cluster_no_high_availability<\/a> \u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink-operator\/flink_job\">flink-operator\/flink_job<\/a> \u043b\u0435\u0436\u0430\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0434\u043e\u043a\u0435\u0440-\u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 Python-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0441 \u043a\u043e\u0434\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041e\u043d\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c Flink \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437, \u0433\u0434\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Fake pipe, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"bash\">eval $(minikube docker-env);  docker build -t myimages\/pyflink-base:latest .\/path\/to\/folder\/with\/flink_jobs;<\/code><\/pre>\n<p><a class=\"anchor\" name=\"6\" id=\"6\"><\/a><\/p>\n<h3>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c Flink c \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink-kubernetes-operator<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0432 helm:<\/p>\n<pre><code class=\"bash\">helm repo add flink-operator-1-10-0-repo https:\/\/downloads.apache.org\/flink\/flink-kubernetes-operator-1.10.0\/;  helm install flink-kubernetes-operator flink-operator-1-10-0-repo\/flink-kubernetes-operator --namespace flink-operator --create-namespace; <\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/517\/195\/616\/51719561632265a6658ee06f1a39dc67.png\" alt=\"\u0432 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 kubernetes \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c\" title=\"\u0412 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 kubernetes \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c\" width=\"1600\" height=\"790\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/517\/195\/616\/51719561632265a6658ee06f1a39dc67.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/517\/195\/616\/51719561632265a6658ee06f1a39dc67.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0412 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0435 kubernetes \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437, \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e \u0432 MongoDB \u0443\u0436\u0435 \u043b\u044c\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c submit \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u043e Flink:<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/flink-operator\/flink_jobs\/flink-users-job.yaml; <\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f checkpoint \u0438 savepoint;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Python-\u0437\u0430\u0434\u0430\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a MinIo, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d. <\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u0434\u0432\u0430: presto \u0438 hadoop. \u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0437\u044f\u0442\u044c hadoop, \u0442.\u00a0\u043a. presto \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438\u0437 checkpoint. \u0414\u0430, \u044d\u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0447\u0435\u043c\u0443, \u0441\u0430\u043c \u043d\u0435 \u0437\u043d\u0430\u044e.<\/p>\n<\/blockquote>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0435\u0449\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0434\u0432\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:\u00a0<\/p>\n<ul>\n<li>\n<p>upgrade mode \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u042f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b savepoint. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043b\u0435\u043f\u043e\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. <\/p>\n<\/li>\n<li>\n<p>state \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435. <\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442, \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043d\u044f\u043b\u043e\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/72e\/ba1\/0ff\/72eba10ff11802966b92f8118984eae5.png\" alt=\"\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c job manager \u0438 \u0432 \u043f\u0430\u0440\u0435 \u043a \u043d\u0435\u043c\u0443 task manager\" title=\"\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c job manager \u0438 \u0432 \u043f\u0430\u0440\u0435 \u043a \u043d\u0435\u043c\u0443 task manager\" width=\"1600\" height=\"693\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/72e\/ba1\/0ff\/72eba10ff11802966b92f8118984eae5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/72e\/ba1\/0ff\/72eba10ff11802966b92f8118984eae5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c job manager \u0438 \u0432 \u043f\u0430\u0440\u0435 \u043a \u043d\u0435\u043c\u0443 task manager<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a WebUI \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0440\u0442\u044b \u0434\u043e \u043f\u043e\u0434\u0430. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"bash\">kubectl port-forward -n flink-operator &lt;flink-jobmanager-pod-id&gt; 8081:8081;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb9\/8d7\/de8\/bb98d7de87a8d2bb1d6617a875104d53.png\" alt=\"\u0412\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0438\" title=\"\u0412\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0438\" width=\"1600\" height=\"749\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bb9\/8d7\/de8\/bb98d7de87a8d2bb1d6617a875104d53.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb9\/8d7\/de8\/bb98d7de87a8d2bb1d6617a875104d53.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u0432 \u043d\u0435\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f, checkpoint\u2019\u044b, \u043b\u043e\u0433\u0438 job- \u0438 task-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u0438 \u0442.\u00a0\u0434.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e, \u0442\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 PostgreSQL \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u0435\u0440\u0435\u043a\u043e\u0447\u0435\u0432\u0430\u0432\u0448\u0438\u0435 \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 MongoDB. \u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438 Fake pipe, \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043b\u0438\u0442\u044c\u0441\u044f. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/93e\/50a\/b4a\/93e50ab4a744c5876ab8b8ef86e93ab0.png\" alt=\"\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e Flink \u0437\u0430\u0434\u0430\u043d\u0438\u044f\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e Flink-\u0437\u0430\u0434\u0430\u043d\u0438\u044f\" width=\"1109\" height=\"307\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/93e\/50a\/b4a\/93e50ab4a744c5876ab8b8ef86e93ab0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/93e\/50a\/b4a\/93e50ab4a744c5876ab8b8ef86e93ab0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e Flink-\u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435, \u043c\u0435\u043d\u044f\u0435\u043c state <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/flink-operator\/flink_job\/flink-users-job.yaml\">\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435<\/a> \u0441 &#171;running&#187; \u043d\u0430 &#171;suspended&#187; \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0433\u043e.<\/p>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 MongoDB \u0432 PostgreSQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Flink \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c kubernetes. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443. <\/p>\n<p><a class=\"anchor\" name=\"7\" id=\"7\"><\/a><\/p>\n<h3>Flink Native Kubernetes\u00a0<\/h3>\n<blockquote>\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0434\u0430\u043b\u0438\u043c Flink-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440: <\/em><\/p>\n<\/blockquote>\n<pre><code class=\"bash\">helm uninstall flink-kubernetes-operator -n flink-operator;  kubectl delete namespace flink-operator; <\/code><\/pre>\n<blockquote>\n<p><em>\u0410 \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u0441\u044e\u0434\u0430, \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u0448\u0430\u0433.<\/em><\/p>\n<\/blockquote>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 2 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430: <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_high_availability\">flink_cluster_high_availability<\/a> \u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_no_high_availability\">flink_cluster_no_high_availability<\/a>. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 job manager \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 kubernetes \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0435\u0432, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u0442. <s>\u00a9 \u043a\u044d\u043f<\/s> <\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0447\u0438\u0441\u043b\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043f\u043b\u0438\u043a job manager. \u0422\u0443\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0447\u0442\u043e \u0432\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439. \u042f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 high availability. <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_high_availability\">flink_cluster_high_availability<\/a> \u043b\u0435\u0436\u0430\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430 \u0440\u043e\u043b\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u043a\u043e\u043d\u0444\u0438\u0433-\u043c\u0430\u043f\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432\u043e Flink, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430 \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430. <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/flink_cluster_high_availability\/flink-configuration-configmap.yaml\">Flink-configuration-configmap.yaml<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f MinIo, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f checkpoint\u2019\u043e\u0432 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0438\u0448\u0435\u043c: <\/p>\n<pre><code class=\"bash\">eval $(minikube docker-env);  docker build -t myimages\/pyflink-base:latest .\/flink_cluster_high_availability\/flink_jobs; <\/code><\/pre>\n<p>\u041f\u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432 \u043f\u0430\u043f\u043a\u0435:\u00a0<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/flink_cluster_high_availability;<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b8\/b1f\/fa9\/0b8b1ffa9d7e9a145ea437436e66aedd.png\" alt=\"\" title=\"\" width=\"1600\" height=\"482\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0b8\/b1f\/fa9\/0b8b1ffa9d7e9a145ea437436e66aedd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b8\/b1f\/fa9\/0b8b1ffa9d7e9a145ea437436e66aedd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 <em>(\u043a\u0430\u043a \u043c\u044b \u043b\u044e\u0431\u0438\u043c) <\/em>\u043f\u043e\u0440\u0442\u044b \u0434\u043e WebUI.<\/p>\n<pre><code class=\"bash\">kubectl port-forward services\/flink-jobmanager-rest 8081:8081 --namespace=flink; <\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 Flink \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 job manager, \u043a\u0443\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0430\u0431\u043c\u0438\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f <s>\u043f\u043e\u0442\u043d\u044b\u043c\u0438<\/s> \u0440\u0443\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u043f\u043e\u0434 job manager. \u0414\u0430, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0430, \u043d\u043e \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0442\u0430\u043a. <s>\u0427\u0442\u043e \u0432\u044b \u043c\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0435, \u044f \u0442\u0435\u043a\u0441\u0442)<\/s>.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u043c id \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 job manager, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u043f\u043e\u0434 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">kubectl -n flink cp .\/flink_cluster_high_availability\/flink-job\/users-job.py &lt;flink-job-manager-pod-id&gt;:\/tmp\/users-job.py;  kubectl -n flink exec -it &lt;flink-job-manager-pod-id&gt; -- \/opt\/flink\/bin\/flink run --python \/tmp\/users-job.py; <\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90d\/f3c\/615\/90df3c615ce63c793c093aef5c39e5e7.png\" alt=\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\" title=\"\u0412\u0438\u0434\u0438\u043c \u0432 \u0432\u044b\u0432\u043e\u0434\u0435, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\" width=\"1218\" height=\"75\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/90d\/f3c\/615\/90df3c615ce63c793c093aef5c39e5e7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90d\/f3c\/615\/90df3c615ce63c793c093aef5c39e5e7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0412\u0438\u0434\u0438\u043c \u0432 \u0432\u044b\u0432\u043e\u0434\u0435, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 WebUI, checkpoint\u2019\u044b \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 MinIo, \u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 Postgres \u043f\u043e\u043b\u0435\u0442\u044f\u0442 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/943\/c35\/5da\/943c355da1825bcd8b79cb3b96d03942.png\" alt=\"\u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c\" title=\"\" width=\"1109\" height=\"307\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/943\/c35\/5da\/943c355da1825bcd8b79cb3b96d03942.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/943\/c35\/5da\/943c355da1825bcd8b79cb3b96d03942.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432 WebUI \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u043d\u0430\u0436\u0430\u0442\u044c Cancel Job (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0438 <strong>savepoint \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f<\/strong>). \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440: \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c savepoint \u0432 MinIo.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043d\u0435\u043c \u043c\u044b \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0443\u043a\u0430\u0437\u0430\u0432 id \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f savepoint: <\/p>\n<pre><code class=\"bash\">kubectl -n flink exec -it &lt;flink job-manager-pod-id&gt; -- \/opt\/flink\/bin\/flink stop --savepointPath s3a:\/\/apache-flink\/savepoints\/users-job\/ &lt;job-id&gt;; <\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b4\/9b8\/285\/2b49b8285fb61337503bf6029aabb1b1.png\" alt=\"\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f savepoint \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c id \u0437\u0430\u0434\u0430\u043d\u0438\u044f\" title=\"\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f savepoint \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c id \u0437\u0430\u0434\u0430\u043d\u0438\u044f\" width=\"1600\" height=\"447\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2b4\/9b8\/285\/2b49b8285fb61337503bf6029aabb1b1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b4\/9b8\/285\/2b49b8285fb61337503bf6029aabb1b1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f savepoint \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c id \u0437\u0430\u0434\u0430\u043d\u0438\u044f<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 savepoint \u0438\u043b\u0438 checkpoint, \u0441\u0445\u043e\u0434\u0438\u043c \u0432 MinIo \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u043e \u043d\u0435\u0433\u043e. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 Flink \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 <em>execution.checkpointing.externalized-checkpoint-retention: RETAIN_ON_CANCELLATION, <\/em>checkpoint \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 savepoint, \u043d\u043e \u0438 \u0441 checkpoint. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0438 \u0431\u044b \u0443\u0434\u0430\u043b\u0438\u043b\u0438\u0441\u044c, \u0438 \u0443 \u043d\u0430\u0441 \u0431\u044b \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f savepoint. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441 che\u0441kpoint: <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75f\/80b\/c93\/75f80bc9304056f849cacdb127927747.png\" alt=\"\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\" title=\"\" width=\"1600\" height=\"343\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/75f\/80b\/c93\/75f80bc9304056f849cacdb127927747.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/75f\/80b\/c93\/75f80bc9304056f849cacdb127927747.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c checkpoint:\u00a0<\/p>\n<pre><code class=\"bash\">kubectl -n flink exec -it &lt;flink-jobmanager-pod-id&gt; -- \/opt\/flink\/bin\/flink run --python \/tmp\/flink-job\/users-job.py -s s3a:\/\/apache-flink\/checkpoints\/users-job\/aa05d2d7f89335aa898c381dba05a420\/chk-58;<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0441 savepoint:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c0\/63f\/f69\/9c063ff69f7b199a4fb55e2b10705cd7.png\" alt=\"\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0435\u0439\u0432\u043f\u043e\u0438\u043d\u0442\" title=\"\" width=\"1600\" height=\"416\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9c0\/63f\/f69\/9c063ff69f7b199a4fb55e2b10705cd7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c0\/63f\/f69\/9c063ff69f7b199a4fb55e2b10705cd7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c savepoint:\u00a0<\/p>\n<pre><code class=\"bash\">kubectl -n flink exec -it &lt;flink-jobmanager-pod-id&gt; -- \/opt\/flink\/bin\/flink run --fromSavepoint s3a:\/\/apache-flink\/savepoints\/users-job\/savepoint-829251-03bc2e202d0e --python \/tmp\/users-job.py; <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u044e \u0440\u0435\u043c\u0430\u0440\u043a\u0443 \u043f\u0440\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 checkpoint \u0438 savepoint. \u041e\u043d\u0438 \u043f\u043e\u0445\u043e\u0436\u0438, \u0438 \u0438\u0445 \u0447\u0430\u0441\u0442\u043e \u043f\u0443\u0442\u0430\u044e\u0442, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c: <\/p>\n<ul>\n<li>\n<p>checkpoint\u2019\u044b \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u2014 \u043e\u043d\u0438 \u043b\u0435\u0433\u043a\u0438\u0435, \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u044f. Flink \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0441\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>savepoint\u2019\u044b \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041e\u043d\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0434\u0430\u043d\u0438\u044f\u0445. \u0418\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0432\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0443\u0436\u0435 \u0441\u0430\u043c\u0438. <\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0436\u0443\u0440\u043d\u0430\u043b\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u0432\u0442\u043e\u0440\u044b\u0435 \u2014 \u043a\u0430\u043a \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438.<\/p>\n<p><a class=\"anchor\" name=\"8\" id=\"8\"><\/a><\/p>\n<h2>\u041d\u0443 \u0432\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0435\u00a0<\/h2>\n<p>\u041c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c MongoDB, PostgreSQL, Apache Flink, Minio \u0438 Python \u2014 \u0438 \u0432\u0441\u0435 \u043d\u0430 minikube (kubernetes). \u0421\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0442\u0430\u043a \u0438 \u043f\u043e\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 minikube \u0441\u0442\u043e\u0438\u0442 \u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c:<\/p>\n<pre><code class=\"bash\">minikube stop;<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0412\u041c, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430:<\/p>\n<pre><code class=\"bash\">minikube delete;<\/code><\/pre>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u0447\u0430\u0441\u044b (<em>\u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u043d\u0438 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435<\/em>) \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430. \u0410 \u0441 \u0432\u0430\u043c\u0438 \u0431\u044b\u043b \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0426\u0430\u0439, \u0443\u0441\u043f\u0435\u0445\u043e\u0432, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/898636\/\"> https:\/\/habr.com\/ru\/articles\/898636\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0426\u0430\u0439, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0432 \u041c\u0422\u0421 Web Services, \u043d\u043e \u043d\u0430 \u0434\u0435\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f DA\/DE\/BI: \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u0431\u043e\u0440\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0438 \u0432\u0438\u0442\u0440\u0438\u043d \u0434\u043b\u044f \u043d\u0438\u0445, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 ETL-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043f\u043e \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435, DQ, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u043c \u0435\u0449\u0435. <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043f\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 MongoDB \u0432 PostgreSQL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Flink (<em>\u0441\u0442\u0440\u0438\u043c\u0438\u0442\u044c \u0438\u0437 Kafka \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e, \u0430 \u0442\u0430\u043a \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0449\u0443\u043f\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0411\u0414<\/em>). \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 minikube (kubernetes), \u0430 \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442 Python. \u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u043f\u043e\u0441\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 MacBook \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c i7. <\/p>\n<p>\u0412 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c, \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0435 \u0438\u0437 MongoDB \u0432 Postgres \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e Flink, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043f\u0435\u0440\u0435\u0436\u0435\u0432\u044b\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 WordCount \u0438\u0437 flink-kubernetes-operator, \u0433\u0434\u0435 \u043d\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0435 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0438 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0432 \u043d\u0435\u043c. \u0415\u0441\u043b\u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f PyFlink, \u0442\u043e \u043c\u044b \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0441 Harness SDK \u0438 Apache Beam \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u0417\u043d\u0430\u043a\u043e\u043c\u043e?<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448 \u043f\u0443\u0442\u044c! \u0414\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0442\u0435\u043c, \u043a\u0442\u043e <s>\u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0435\u0446<\/s> \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c Flink \u043d\u0430 \u0440\u043e\u0434\u043d\u043e\u043c Python \u0438 \u043a\u0442\u043e \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043e\u0442\u043e\u0440\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.  \u0412\u0441\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\">\u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub<\/a>. <\/p>\n<figure class=\"full-width\"><\/figure>\n<details class=\"spoiler\">\n<summary>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u044e \u0432\u0430\u0448\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438 \u043a\u0430\u043a. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0440\u0436\u0435\u043d\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0442\u043e\u0438\u0442. <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><a href=\"#1\"><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/strong><\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#2\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MongoDB<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#3\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 PostgreSQL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#4\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MinIo<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#5\"><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Apache Flink<\/strong><\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#6\">\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c Flink c \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flink-kubernetes-operator<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#7\">Flink Native Kubernetes<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#8\"><strong>\u041d\u0443 \u0432\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0435<\/strong><\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0427\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c: <\/p>\n<ul>\n<li>\n<p>\u043b\u044e\u0431\u043e\u0435 IDE \u043f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443 \u2014 \u0443 \u043c\u0435\u043d\u044f VsCode;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/ru\/docs\/tasks\/tools\/install-minikube\/\">Minikube<\/a> (kubernetes) \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Docker<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b minikube; <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/helm.sh\/ru\/docs\/intro\/install\/\">Helm<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438; <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/apache\/flink-kubernetes-operator\/tree\/main\">Flink-kubernetes-operator<\/a> \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/minio.yaml\">Minio<\/a> \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f checkpoints\/savepoints Flink (\u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435); <\/p>\n<\/li>\n<li>\n<p>mongodb \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a; <\/p>\n<\/li>\n<li>\n<p>postgresql \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b. <\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">docker<\/a>, <a href=\"https:\/\/kubernetes.io\/ru\/docs\/tasks\/tools\/install-minikube\/\">minikube<\/a> \u0438 <a href=\"https:\/\/helm.sh\/ru\/docs\/intro\/install\/\">helm<\/a> \u044f \u043d\u0435 \u0431\u0443\u0434\u0443: \u0443 \u043d\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0438 \u0435\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0439\u043c\u0435\u0442 \u0443 \u0432\u0430\u0441 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0435\u0431\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c\u00a0\u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c minikube. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043f\u0438\u0448\u0435\u043c: <\/p>\n<pre><code class=\"bash\">minikube start --cpus=5 --memory=8096;<\/code><\/pre>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e. \u041a\u043e\u0433\u0434\u0430 \u043c\u0438\u043d\u0438-\u043a\u0443\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 Web UI minikube dashboard:<\/p>\n<pre><code class=\"bash\">minikube dashboard;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u0441\u044f WebUI. \u041e\u0442\u043b\u0438\u0447\u043d\u043e. Minikube \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b Flink-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"bash\">kubectl apply -f https:\/\/github.com\/jetstack\/cert-manager\/releases\/download\/v1.11.0\/cert-manager.yaml; <\/code><\/pre>\n<p>\u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 Flink-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443. <\/p>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MongoDB\u00a0<\/h3>\n<blockquote>\n<p><em>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 MacBook \u043d\u0430 M-\u0447\u0438\u043f\u0435, \u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443:\u00a0<\/em><\/p>\n<\/blockquote>\n<pre><code class=\"bash\">ErrImagePull: no matching manifest for linux\/arm64\/v8 in the manifest list entries <\/code><\/pre>\n<blockquote>\n<p><em>\u041d\u0430 Stackoverflow \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u043e\u0434 amd64 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443:<\/em><\/p>\n<\/blockquote>\n<pre><code class=\"bash\">minikube start --cpus=5 --memory=8096 --driver=docker --kubernetes-version=v1.26.3 --base-image=kicbase\/ubuntu:v1.26.3 <\/code><\/pre>\n<blockquote>\n<p><em>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431, \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 \u043d\u0430 M-\u0447\u0438\u043f\u0435 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/em><\/p>\n<\/blockquote>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/bitnami\/charts\/tree\/main\/bitnami\/mongodb\">helm-\u043e\u0431\u0440\u0430\u0437 \u043e\u0442 bitnami<\/a>. \u041f\u043e\u0434\u043d\u044f\u0442\u044c MongoDB \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 kubernetes \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0443\u0447\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u2014 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c helm chart \u0432\u0441\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0438 yaml-\u0444\u0430\u0439\u043b\u0443 \u043d\u0430 12 \u0441\u0442\u0440\u043e\u0447\u0435\u043a.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a cdc-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a OPLOG-\u0436\u0443\u0440\u043d\u0430\u043b\u0443 (\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445) \u0438 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0431\u0430\u0437\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e replica set.<\/p>\n<p>\u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/bitnami_mongo_replica_set\">bitnami_mongo_replica_set<\/a> \u043b\u0435\u0436\u0430\u0442 2 \u0444\u0430\u0439\u043b\u0430: <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/bitnami_mongo_replica_set\/values.yaml\">values.yaml<\/a> \u0438<a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/bitnami_mongo_replica_set\/init-mongo.js\"> init-mongo.js<\/a>. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u0437\u0430\u043a\u0438\u043d\u0443\u0442\u044c \u0432 \u043d\u0435\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c namespace \u0438 configMap, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0443 MongoDB \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 replica set:<\/p>\n<pre><code class=\"bash\">kubectl create namespace mongodb;  kubectl -n mongodb create configmap init-mongo --from-file .\/bitnami_mongo_replica_set\/init-mongo.js;  helm install mongodb oci:\/\/registry-1.docker.io\/bitnamicharts\/mongodb -f .\/bitnami_mongo_replica_set\/values.yaml --namespace mongodb;<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0430\u0448 WebUI \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0434\u044b \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0434\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u043e\u0434\u0430: \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043f\u043e\u0434 mongodb-0, \u0437\u0430\u0442\u0435\u043c \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 exec into pod. \u0412\u0432\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">mongosh;  use database;  db.users.find();<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u0412\u0438\u0434\u0438\u043c \u0431\u0430\u0437\u0443, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u043d\u0435\u0439<\/em><\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"3\" id=\"3\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 PostgreSQL\u00a0<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c Postgres \u0441\u043e \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437\u0432\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a:<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/postgresql-deployment.yaml;<\/code><\/pre>\n<p>\u0412 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/blob\/main\/postgresql-deployment.yaml\">postgresql-deployment.yam<\/a><u>l<\/u> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 namespace, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0438\u0437\u0432\u043d\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043a\u0443\u0434\u0430 \u043d\u0430\u0448\u0430 \u0431\u0443\u0434\u0443\u0449\u0430\u044f Flink job \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0435\u0448\u0430\u044e\u0442\u0441\u044f 2 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0441\u0442\u0430\u043c\u043f\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0441\u0442\u0430\u043c\u043f\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 (soft delete). \u0422\u0430\u043a \u043c\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 flink \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e insert, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 update \u0438 delete.<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041f\u043e\u0434\u043d\u044f\u0442\u0430\u044f \u0411\u0414<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 MongoDB, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430: <\/p>\n<pre><code class=\"bash\">psql -U user -password password -p 5432 -d mydb;  SELECT table_name FROM information_schema.tables WHERE table_schema='public'; <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 DBeaver, \u043d\u043e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438\u0437\u0432\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0440\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"bash\">kubectl port-forward service\/postgresql-nodeport 30432:5432 --namespace=postgresql;<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:\u00a0<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><a class=\"anchor\" name=\"4\" id=\"4\"><\/a><\/p>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MinIo\u00a0<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Minio \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0434\u043b\u044f checkpoint- \u0438 savepoint-\u0437\u0430\u0434\u0430\u043d\u0438\u0439 Flink. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u044f\u0445 \u0438\u043b\u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0418\u043d\u0430\u0447\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c oplog-\u0436\u0443\u0440\u043d\u0430\u043b (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435) \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. <\/p>\n<blockquote>\n<p>Flink \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f FsStateBackend\/RocksDBStateBackend \u0438\u043b\u0438 MemoryStateBackend. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 \u0434\u043b\u044f state.backend, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PVC. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 MinIo. <\/p>\n<\/blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e Postgres \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 <u>minio.yaml<\/u> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f namespace, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u043a\u0435\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c Flink \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0439.<\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/minio.yaml;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0440\u0442\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"bash\">kubectl port-forward services\/minio-service 9090:9090 --namespace=minio;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0438\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 MinIo \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0431\u0430\u043a\u0435\u0442\u043e\u043c \u043f\u043e\u0434 checkpoint Flink:<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e login = minio, password = minio123<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e: Fake pipe<\/h3>\n<p>\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u043f\u043e\u0434 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 MongoDB, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 (<em>\u0434\u0430, \u043e\u043f\u044f\u0442\u044c<\/em>) \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"bash\">eval $(minikube docker-env);  docker build -t myimages\/python_mongo_generator:latest .\/fake_source_pipe;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0432\u043e\u0434\u0438\u043b\u0438 \u0432\u044b\u0448\u0435, \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0432\u043d\u0443\u0442\u0440\u0438 minikube. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c eval $(minikube docker-env), \u0442\u043e \u043e\u043d \u0441\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438 minikube \u0435\u0433\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u0434\u0430 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <s>\u044f\u0440\u043e\u0441\u0442\u043d\u043e<\/s> \u043d\u0430\u0447\u043d\u0435\u0442 \u0441\u043b\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e MongoDB: <\/p>\n<pre><code class=\"bash\">kubectl apply -f .\/fake_source_pipe\/python-pod.yaml;<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 users \u0432 MongoDB, \u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a users_postgres \u0432 PostgreSQL, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 S3 \u0441 \u0431\u0430\u043a\u0435\u0442\u043e\u043c \u0434\u043b\u044f checkpoint\u2019\u043e\u0432\/savepoint\u2019\u043e\u0432 Flink \u0432 \u0432\u0438\u0434\u0435 MinIo. <em>\u0424\u0435\u0439\u043a\u043e\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0436\u0435 \u0432\u043e\u0432\u0441\u044e \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.<\/em><\/p>\n<p><a class=\"anchor\" name=\"5\" id=\"5\"><\/a><\/p>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Apache Flink<\/h2>\n<p><em>\u041f\u043e\u0434\u043d\u044f\u0442\u044c Apache Flink \u043c\u043e\u0436\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:\u00a0<\/em><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438 application mode \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <u>flink-kubernetes-operator<\/u>. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0434\u043b\u044f <strong>\u043a\u0430\u0436\u0434\u043e\u0433\u043e <\/strong>\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 job- \u0438 task-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0443\u044e \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0437\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442\u0443 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u041f\u0440\u0430\u0432\u0434\u0430, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 WebUI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0447\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 session mode \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c Apache Flink \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c kubernetes. \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d job manager (<em>\u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438<\/em>), \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0434\u0438\u043d\u044b\u0439 WebUI \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439. \u041d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 <s>\u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u0440\u043e\u0431\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447<\/s> \u0443\u0436\u0435 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430\u0445 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_high_availability\">flink_cluster_high_availability<\/a>, <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink_cluster_no_high_availability\">flink_cluster_no_high_availability<\/a> \u0438 <a href=\"https:\/\/github.com\/Kami-sama322\/flink_streaming_python_mongodb_postgresql\/tree\/main\/flink-operator\/flink_job\">flink-operator\/flink_job<\/a> \u043b\u0435\u0436\u0430\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0434\u043e\u043a\u0435\u0440-\u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438<\/p>\n<\/div>\n<\/div>\n<\/div>\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-457877","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457877","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=457877"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457877\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=457877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=457877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=457877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}