{"id":485562,"date":"2026-06-30T03:50:53","date_gmt":"2026-06-30T03:50:53","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=485562"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=485562","title":{"rendered":"Apache Paimon: streamhouse \u043a\u0430\u043a \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u041a\u0425\u0414"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0410\u043d\u0434\u0440\u0435\u0435\u0432, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <\/em><a href=\"https:\/\/career.habr.com\/companies\/alfastrah\" rel=\"noopener noreferrer nofollow\"><em>&#171;\u0410\u043b\u044c\u0444\u0430\u0421\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u043d\u0438\u0435&#187;<\/em><\/a><em>. \u042f \u043b\u044e\u0431\u043b\u044e \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u0441\u0444\u0435\u0440\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u044f \u043b\u044e\u0431\u043b\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0437\u043e\u0440 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u043e\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; Apache Paimon. \u041c\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 streamhouse-\u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0441\u043d\u043e\u0432 Apache Paimon \u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 &#171;\u043f\u043e\u0436\u0435\u043d\u0438\u0442\u044c&#187; \u0431\u0430\u0442\u0447 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u043c.<\/em><\/p>\n<h4>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e data-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439: \u043a\u043b\u0438\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043b\u043e\u0433\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0434\u0430\u0442\u0430-\u0441\u0430\u0439\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u0436\u0434\u0443\u0442 \u0441\u0432\u0435\u0436\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041c\u0435\u0436\u0434\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: Kafka \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, Flink \u0438\u043b\u0438 Spark Streaming \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, HDFS \u0438\u043b\u0438 S3 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u043e\u0434\u0435 ClickHouse \u0438\u043b\u0438 Snowflake \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 &#171;data swamp&#187; &#8212; \u0431\u043e\u043b\u043e\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043d\u0430\u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435?&#187; \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432.<\/p>\n<p>Apache Paimon \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u043b\u0443\u0447\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432: \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0442\u0447-\u0441\u0438\u0441\u0442\u0435\u043c. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h4>\u041a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043f\u043e\u0447\u0435\u043c\u0443 streaming \u0438 batch \u0436\u0438\u0432\u0443\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e<\/h4>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0440\u0435\u0448\u0430\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0434\u0430\u043b\u044c\u0448\u0435. \u0418\u0445 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0443\u0441\u043f\u0435\u0445\u0430 &#8212; \u044d\u0442\u043e latency (\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 &#8212; \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u0441\u0435 \u0440\u0430\u0437\u043e\u043c. \u0418\u0445 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 &#8212; throughput (\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c), \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0437\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u042d\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u043b\u0438 \u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c. \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 append-only \u043b\u043e\u0433\u0430\u0445, \u0433\u0434\u0435 \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u0430\u043c\u0438: \u043b\u0438\u0431\u043e \u0432\u044b \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0430\u0434\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u041b\u044f\u043c\u0431\u0434\u0430-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0432 2010-\u0445, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b &#8212; speed layer \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 batch layer \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438.<\/p>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Apache Paimon<\/h4>\n<p>Apache Paimon \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u0434\u0438\u043b\u0435\u043c\u043c\u0443 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 LSM-tree (Log-Structured Merge-tree) \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 lakehouse \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 LSM-tree: \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0430 \u0435\u0449\u0435 \u0432 1996 \u0433\u043e\u0434\u0443, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0448\u043b\u0430 \u0441\u0432\u043e\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u0433, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0435\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0432\u044b \u0445\u0432\u0430\u0442\u0430\u0435\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043b\u0438\u0441\u0442\u043e\u043a \u0438 \u043f\u0438\u0448\u0435\u0442\u0435. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b \u0441\u0430\u0434\u0438\u0442\u0435\u0441\u044c \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u043d\u043e\u0442 (\u0438\u043b\u0438 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0443 it-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 Obsidian), \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044f \u043f\u043e \u0442\u0435\u043c\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435. LSM-tree \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443: \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 &#171;\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a&#187; (Level 0), \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432 &#171;\u0447\u0438\u0441\u0442\u043e\u0432\u0438\u043a&#187; (Level 1, 2, &#8230;).<\/p>\n<p>Lakehouse \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#8212; \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ACID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 data lake &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0442 \u0441\u0445\u0435\u043c\u044b, \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. Lakehouse \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0439 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>Paimon \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 LSM-tree \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 SQL-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c &#8212; \u0438 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 &#8212; \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f (\u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438), \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435).<\/p>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Paimon<\/h4>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Apache Paimon \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 Paimon, \u043e\u043d\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 MemTable (\u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/910656\/\" rel=\"noopener noreferrer nofollow\">ScyllaDB<\/a>). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0431\u0430\u0442\u0447\u0438, \u0447\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 MemTable \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 128-256 \u041c\u0411), \u043e\u043d\u0430 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a \u043a\u0430\u043a \u0444\u0430\u0439\u043b Level 0.<\/p>\n<p>\u0424\u0430\u0439\u043b\u044b Level 0 &#8212; \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u044b MemTable, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (\u043e\u0431\u044b\u0447\u043d\u043e Parquet \u0438\u043b\u0438 ORC). \u041e\u043d\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435, \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0439. \u041d\u043e &#8212; \u0438 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e &#8212; \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443: \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u043d\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u043f\u0440\u0438\u0432\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/933630\/\" rel=\"noopener noreferrer nofollow\">ScyllaDB<\/a>). \u041e\u043d \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0440\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 Level 0 \u0438 \u0441\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 Level 1, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f merge-\u043b\u043e\u0433\u0438\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439). \u0424\u0430\u0439\u043b\u044b Level 1, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 Level 2, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 10 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>\u042d\u0442\u0430 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 write amplification (&#171;\u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438&#187;). \u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 B-tree \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0446\u0435\u043b\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u0434\u0435\u0440\u0435\u0432\u0430. \u0412 LSM-tree \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 SSD \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0442\u0438\u043f\u0430 S3.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435? \u0417\u0434\u0435\u0441\u044c Paimon \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0435\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0411\u043b\u0443\u043c\u0430 &#8212; \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c &#171;\u044d\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u0435&#187; \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0430\u043c \u0444\u0430\u0439\u043b. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u043d\u0438\u0436\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0434\u0438\u0441\u043a\u0443.<\/p>\n<h4>Unified Changelog: \u044f\u0434\u0440\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Paimon &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f unified changelog. \u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 changelog (\u0436\u0443\u0440\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439) \u0438 table storage (\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435) &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Kafka \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e Hive\/Iceberg \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 &#8212; \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c.<\/p>\n<p>\u0412 Paimon changelog \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 changelog. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c changelog \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b LSM-tree. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438? \u041a\u043e\u0433\u0434\u0430 \u0444\u0430\u0439\u043b\u044b \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, Paimon \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b. \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 changelog.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. Batch-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u0438\u0434\u044f\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043d\u044d\u043f\u0448\u043e\u0442 &#8212; \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. Streaming-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 changelog \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c: streaming \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0432\u0438\u0434\u044f\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0438\u0434\u044f\u0442 batch \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0435. \u0421\u0430\u043c\u0430\u044f \u0431\u043b\u0438\u0437\u043a\u0430\u044f \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0430 &#8212; \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438. Batch-\u0440\u0435\u0436\u0438\u043c &#8212; \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u043d\u0438\u0433\u0443 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0433\u043b\u0430\u0432\u044b. Streaming-\u0440\u0435\u0436\u0438\u043c &#8212; \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u043a\u0430\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430: &#171;\u0432 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435 3 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441\u043b\u043e\u0432\u043e X \u043d\u0430 Y&#187;, &#171;\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0430 5&#187;. \u041e\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0434\u0430\u044e\u0442 \u0432\u0430\u043c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438: \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Paimon, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 Paimon \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0445, \u0430 \u0433\u0434\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 Apache Iceberg \u0438 Delta Lake &#8212; \u0434\u0432\u0443\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 open-source lakehouse \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u041e\u0431\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f batch-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c streaming \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u042d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0432 \u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435: \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 snapshot-based \u043f\u043e\u0434\u0445\u043e\u0434, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043d\u044d\u043f\u0448\u043e\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0414\u043b\u044f batch-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0434\u043b\u044f streaming \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 Iceberg\/Delta &#8212; \u044d\u0442\u043e \u043c\u0438\u043d\u0443\u0442\u044b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Paimon \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Iceberg \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HMS \u0438\u043b\u0438 Nessie), \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. Delta Lake \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Spark\/Databricks. \u0412 Paimon \u0432\u0441\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0438 \u043e\u043d \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u0432: Flink, Spark, Trino, StarRocks.<\/p>\n<p>Apache Hudi \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a streaming-first \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u043c Paimon. Hudi \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0442\u0430\u0431\u043b\u0438\u0446: Copy-on-Write (CoW) \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0438 Merge-on-Read (MoR) \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e. Paimon \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b: LSM-tree \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u044f\u0441\u044c \u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 Hudi \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0438 timeline \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438. Paimon \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0434\u0435\u043b\u044c: snapshot isolation \u0434\u043b\u044f batch \u0438 at-least-once\/exactly-once \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0434\u043b\u044f streaming.<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 streaming storage \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 Apache Pulsar \u0438\u043b\u0438 Kafka Streams \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u042d\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 SQL \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 JOIN-\u0430\u043c\u0438 \u043f\u043e Kafka topics &#8212; \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. Paimon \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 predicate pushdown.<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0421\u0423\u0411\u0414 \u0442\u0438\u043f\u0430 ClickHouse \u0438\u043b\u0438 Apache Druid. \u041e\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e ETL-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. Paimon \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 schema evolution \u043d\u0430 \u043b\u0435\u0442\u0443: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u0434\u0430\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f Apache Paimon \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438<\/h2>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0430 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c Apache Paimon \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h3>1. Apache Paimon \u043f\u0440\u043e\u0442\u0438\u0432 Apache Iceberg<\/h3>\n<h4>Streaming<\/h4>\n<p>\u041f\u043e <a href=\"https:\/\/www.alibabacloud.com\/blog\/apache-paimon-real-time-lake-storage-with-iceberg-compatibility-2025_602485\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u043d\u043d\u044b\u043c <\/a>\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Alibaba, Paimon \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 <strong>\u043c\u0435\u043d\u0435\u0435 100ms<\/strong> \u0434\u043b\u044f streaming \u0437\u0430\u043f\u0438\u0441\u0438, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Iceberg \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0438 \u0432 <strong>\u043c\u0438\u043d\u0443\u0442\u044b<\/strong>. \u042d\u0442\u043e \u043d\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a Iceberg &#8212; \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: Iceberg \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 snapshot-based \u043c\u043e\u0434\u0435\u043b\u044c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043d\u044d\u043f\u0448\u043e\u0442. <\/p>\n<h4>Batch<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f: Iceberg \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <strong>10-20% \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong> \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Hive \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. Iceberg \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Hidden partitioning<\/strong>: \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c<\/p>\n<\/li>\n<li>\n<p><strong>Metadata pruning<\/strong>: \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435<\/p>\n<\/li>\n<li>\n<p><strong>Vectorized reads<\/strong>: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445<\/p>\n<\/li>\n<\/ul>\n<p>Paimon \u0432 batch \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 merge-on-read \u0434\u043b\u044f primary key \u0442\u0430\u0431\u043b\u0438\u0446, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 15-30% \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<h4>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p><strong>Iceberg<\/strong>:<\/p>\n<ul>\n<li>\n<p>ACID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 optimistic concurrency control <\/p>\n<\/li>\n<li>\n<p>Snapshot isolation \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 time travel \u0447\u0435\u0440\u0435\u0437 snapshot history<\/p>\n<\/li>\n<li>\n<p>Schema evolution \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<p><strong>Paimon<\/strong>:<\/p>\n<ul>\n<li>\n<p>ACID \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0443\u0445\u0444\u0430\u0437\u043d\u044b\u0439 commit \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/p>\n<\/li>\n<li>\n<p>Snapshot isolation + continuous changelog<\/p>\n<\/li>\n<li>\n<p>Time travel + incremental consumption<\/p>\n<\/li>\n<li>\n<p>Schema evolution \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f CDC<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435: Paimon \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <strong>unified changelog<\/strong>, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043a\u0430\u043a \u0434\u043b\u044f batch, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f streaming \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439. Iceberg \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Kafka) \u0434\u043b\u044f streaming.<\/p>\n<h4>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/h4>\n<p><strong>Iceberg \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442<\/strong> \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0432\u0438\u0436\u043a\u0430\u043c\u0438:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"> <strong>\u0414\u0432\u0438\u0436\u043e\u043a <\/strong><\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\"> <strong>Iceberg <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"> <strong>Paimon <\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Spark<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">Full<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Flink<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Full<\/p>\n<\/td>\n<td>\n<p align=\"left\">Native<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Trino\/Presto<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">Full<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Dremio<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Snowflake<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">BigQuery<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Athena<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">Native<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Paimon \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c &#171;Iceberg compatibility mode<strong>&#171;<\/strong>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f Iceberg-\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Iceberg<\/h4>\n<ul>\n<li>\n<p><strong>\u041d\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, \u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong>: \u043f\u0435\u0442\u0430\u0431\u0430\u0439\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/p>\n<\/li>\n<li>\n<p><strong>Multi-cloud<\/strong>: \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Snowflake, BigQuery, Databricks<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0440\u0435\u043b\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439<\/strong>: \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0444\u043e\u043a\u0443\u0441 \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0430 \u043d\u0435 \u043d\u0430 real-time \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Paimon<\/h4>\n<ul>\n<li>\n<p><strong>\u0421\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0435<\/strong>: \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u0430 \u043d\u0438\u0437\u043a\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><strong>CDC<\/strong>: real-time \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0411\u0414<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u043e\u0434\u0438\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f streaming \u0438 batch<\/p>\n<\/li>\n<li>\n<p><strong>\u0428\u0438\u0440\u043e\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Apache Flink \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/strong>: \u0433\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Apache Flink \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f Apache Paimon&#8217;\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<h3>2. Apache Paimon \u043f\u0440\u043e\u0442\u0438\u0432 Delta Lake<\/h3>\n<p><strong>Delta Lake<\/strong> &#8212; \u0434\u0435\u0442\u0438\u0449\u0435 Databricks, \u0442\u0435\u0441\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441 \u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0438 Apache Spark.<\/p>\n<p><strong>Paimon<\/strong> &#8212; \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 Apache \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u0435\u043d\u0434\u043e\u0440\u0443.<\/p>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f<\/h4>\n<p><strong>Delta Lake<\/strong>:<\/p>\n<pre><code>\/delta-table\/  \u251c\u2500\u2500 _delta_log\/          # Transaction log  \u2502   \u251c\u2500\u2500 00000.json       # \u041f\u0435\u0440\u0432\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f  \u2502   \u251c\u2500\u2500 00001.json       # \u0412\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f  \u2502   \u2514\u2500\u2500 00010.checkpoint.parquet  # Checkp2oint  \u2514\u2500\u2500 part-00000-xxx.parquet  # \u0424\u0430\u0439\u043b\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Transaction log &#8212; \u044d\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c JSON \u0444\u0430\u0439\u043b\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0435 10 (\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c) \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f checkpoint \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<p><strong>Paimon<\/strong>: <\/p>\n<pre><code>\/paimon-table\/  \u251c\u2500\u2500 manifest\/          # \u0424\u0430\u0439\u043b\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430  \u251c\u2500\u2500 data\/              # \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 LSM-\u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0435  \u2502   \u251c\u2500\u2500 level-0\/       # \u0421\u0430\u043c\u044b\u0435 \u0441\u0432\u0435\u0436\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435  \u2502   \u2514\u2500\u2500 level-1\/       # \u0421\u0436\u0430\u0442\u044b\u0435 (\u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435) \u0434\u0430\u043d\u043d\u044b\u0435  \u2514\u2500\u2500 changelog\/         # \u0423\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 changelog<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p> \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 LSM-\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 log-based \u043f\u043e\u0434\u0445\u043e\u0434\u0430 Delta Lake. <\/p>\n<h4>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/h4>\n<h3>\u0417\u0430\u043f\u0438\u0441\u044c<\/h3>\n<p>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 <a href=\"https:\/\/www.alibabacloud.com\/blog\/building-a-streaming-lakehouse-performance-comparison-between-paimon-and-hudi_601013\" rel=\"noopener noreferrer nofollow\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a <\/a>2024 \u0433\u043e\u0434\u0430 \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 10GB, 100M \u0437\u0430\u043f\u0438\u0441\u0435\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\"> Delta Lake<\/p>\n<\/td>\n<td>\n<p align=\"left\"> Paimon<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\"> 15 \u043c\u0438\u043d.<\/p>\n<\/td>\n<td>\n<p align=\"left\"> 18 \u043c\u0438\u043d.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 (10% \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438)<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">3 \u043c\u0438\u043d.<\/p>\n<\/td>\n<td>\n<p align=\"left\">2 \u043c\u0438\u043d.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CDC (1 \u043c\u043b\u043d. \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443)<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\">45% CPU<\/p>\n<\/td>\n<td>\n<p align=\"left\">30% CPU<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Compaction<\/p>\n<\/td>\n<td data-colwidth=\"234\" width=\"234\">\n<p align=\"left\"> &#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">5 \u043c\u0438\u043d.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Delta Lake \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 append-only \u0437\u0430\u043f\u0438\u0441\u0438. Paimon \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0434\u043b\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u0433\u043e LSM-\u0434\u0435\u0440\u0435\u0432\u0443. <\/p>\n<h3>\u0427\u0442\u0435\u043d\u0438\u0435<\/h3>\n<p>TPC-DS 1TB benchmark \u043d\u0430 Spark 3.5 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u0441\u0435\u0445 &#171;\u0442\u044f\u0436\u0435\u043b\u044b\u0445&#187; \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0432\u0440\u043e\u0434\u0435 full scan&#8217;\u0430, \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0436\u043e\u0439\u043d\u043e\u0432 \u0438 time travel Paimon \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043d\u0430 5-20%, \u0447\u0435\u043c Delta Lake, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Apache Doris (\u0438 materialized views \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Paimon \u0434\u0430\u0435\u0442 \u043f\u044f\u0442\u0438\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Apache Trino + Paimon (<a href=\"https:\/\/www.velodb.io\/blog\/1461\" rel=\"noopener noreferrer nofollow\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a <\/a>\u043e\u0442 Xiaomi). \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Apache Doris, \u0442\u043e Paimon &#8212; \u044d\u0442\u043e \u0434\u043b\u044f \u0432\u0430\u0441.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Delta Lake<\/h4>\n<ul>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Databricks<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u044f\u0436\u0435\u043b\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spark<\/strong>: Delta Lake \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f Spark<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 streaming<\/strong>: \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f real-time \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043b\u044f \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 Data Governance<\/strong>: Unity Catalog \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043f\u0435\u0440\u0435\u0434 OpenMetadata (\u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0443\u0436\u0435 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Paimon<\/h4>\n<ul>\n<li>\n<p><strong>\u041d\u0443\u0436\u0435\u043d \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043e\u0442 \u0432\u0435\u043d\u0434\u043e\u0440\u0430<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433<\/strong>: \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 CDC \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043d\u0438\u0437\u043a\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043a\u043e\u043c\u0431\u043e-\u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441<\/strong>: Flink + Spark + Trino (\u0438\u043b\u0438 Doris) \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435<\/p>\n<\/li>\n<\/ul>\n<h3>3. Apache Paimon \u043f\u0440\u043e\u0442\u0438\u0432 Apache Hudi<\/h3>\n<p>Hudi \u0438 Paimon &#8212; \u0441\u0430\u043c\u044b\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u044b, \u043e\u0431\u0430 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 streaming \u0438 incremental processing. \u041d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043a\u0440\u043e\u044f\u0442\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445.<\/p>\n<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446<\/h4>\n<p><strong>Hudi<\/strong> \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0442\u0430\u0431\u043b\u0438\u0446:<\/p>\n<p><strong>Copy-on-Write (CoW)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 (Parquet)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p>CoW \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438<\/p>\n<\/li>\n<\/ul>\n<p><strong>Merge-on-Read (MoR)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0424\u0430\u0439\u043b\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 + delta logs<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 row-based delta \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>MoR \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u043d\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p><strong>Paimon<\/strong> \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>LSM-tree \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044c\u044e<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435<\/p>\n<\/li>\n<li>\n<p>\u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>Production \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/h4>\n<p>\u0412 2024 \u0433\u043e\u0434\u0443 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Alibaba <a href=\"https:\/\/www.alibabacloud.com\/blog\/building-a-streaming-lakehouse-performance-comparison-between-paimon-and-hudi_601013\" rel=\"noopener noreferrer nofollow\">\u0441\u0434\u0435\u043b\u0430\u043b\u0430 <\/a>\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435: 1 master + 4 core nodes (24 vCPU, 96GB RAM each) Dataset: 500M records, mixed workload (70% updates, 30% inserts). \u0412\u043e\u0442 \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Hudi<\/h4>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/strong>: \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0446\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0438, \u043c\u0430\u043b\u043e \u0447\u0442\u0435\u043d\u0438\u044f<\/strong>: MoR \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u0434\u043b\u044f write-heavy \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 HBase<\/strong>: \u0443 Hudi \u043e\u043d\u0430 \u0435\u0441\u0442\u044c, \u0443 Paimon \u043d\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c Paimon<\/h4>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/strong>: \u0435\u0441\u043b\u0438 \u0438 \u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u043f\u0438\u0448\u0435\u043c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043c\u043d\u043e\u0433\u043e<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CDC<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0444\u0438\u0446\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/strong>: Paimon \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 CPU<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043e \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0443:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \/ \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong> Apache Paimon <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong> Apache Hudi <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong> Apache Iceberg <\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (CDC\/Upsert) <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0412\u044b\u0441\u043e\u043a\u0430\u044f<\/strong> (\u0437\u0430 \u0441\u0447\u0435\u0442 LSM-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u044f\u044f (\u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043e\u0432\u0435\u0440\u0445\u0435\u0434) <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0438\u0437\u043a\u0430\u044f (\u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430) <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (RAM) <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u0412\u044b\u0441\u043e\u043a\u043e\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u0421\u0440\u0435\u0434\u043d\u0435\u0435 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (Latency) <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0435\u043a\u0443\u043d\u0434\u044b \/ \u041c\u0438\u043d\u0443\u0442\u044b <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u041c\u0438\u043d\u0443\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0432 Hudi<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0422\u043e\u0447\u0435\u0447\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 (OLAP) <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0435<\/strong> (\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0431\u0430\u043a\u0435\u0442\u043e\u0432) <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u0421\u0440\u0435\u0434\u043d\u0435\u0435 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (Full Scan) <\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u0421\u0440\u0435\u0434\u043d\u0435\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u0421\u0440\u0435\u0434\u043d\u0435\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\"> \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 <\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432 Alibaba:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0438 CDC (Streaming Ingestion). \u0417\u0430 \u0441\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f LSM-\u0434\u0435\u0440\u0435\u0432\u0430 (Log-Structured Merge-tree) Paimon \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 upsert) \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430 \u0434\u0438\u0441\u043a.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 100 \u043c\u043b\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439 Paimon \u0442\u0440\u0430\u0442\u0438\u0442 <strong>\u043d\u0430 30\u201340% \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong> \u043d\u0430 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044e \u0431\u0430\u0442\u0447\u0430 (commit time), \u0447\u0435\u043c Hudi.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0434\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 10 GB.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u043c\u044f\u0442\u044c:<\/strong> Paimon \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 RAM \u043f\u0440\u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0435. Hudi \u043d\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0432 OOM (Out of Memory) \u0438\u0437-\u0437\u0430 \u0442\u044f\u0436\u0435\u043b\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Write Amplification:<\/strong> \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043b\u0438\u044f\u043d\u0438\u044e \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (compaction) \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u043a\u043e\u0432 (Spark \/ Flink):<\/p>\n<ul>\n<li>\n<p><strong>Flink (Streaming):<\/strong> Paimon \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f Flink, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0441\u0443\u0431\u043c\u0438\u043d\u0443\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Spark (Batch):<\/strong> \u041f\u0440\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043d\u0430 \u0441\u043b\u043e\u044f\u0445 DWM\/DWS Paimon \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0443 Hudi \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u043b\u0438\u044f\u043d\u0438\u044f (<code>mergeFunction<\/code>), \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430: \u0432\u0441\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b<\/h3>\n<h4>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"160\" width=\"160\">\n<p align=\"left\">\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">Paimon<\/p>\n<\/th>\n<th>\n<p align=\"left\">Iceberg<\/p>\n<\/th>\n<th>\n<p align=\"left\">Delta Lake<\/p>\n<\/th>\n<th>\n<p align=\"left\">Hudi<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"left\"><strong>\u0421\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Alibaba<\/p>\n<\/td>\n<td>\n<p align=\"left\">Netflix<\/p>\n<\/td>\n<td>\n<p align=\"left\">Databricks<\/p>\n<\/td>\n<td>\n<p align=\"left\">Uber<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"left\"><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Java<\/p>\n<\/td>\n<td>\n<p align=\"left\">Java<\/p>\n<\/td>\n<td>\n<p align=\"left\">Scala<\/p>\n<\/td>\n<td>\n<p align=\"left\">Java<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"160\" width=\"160\">\n<p align=\"left\"><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">LSM-tree<\/p>\n<\/td>\n<td>\n<p align=\"left\">Snapshot<\/p>\n<\/td>\n<td>\n<p align=\"left\">Transaction Log<\/p>\n<\/td>\n<td>\n<p align=\"left\">Timeline<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"200\" width=\"200\">\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">Paimon<\/p>\n<\/th>\n<th>\n<p align=\"left\">Iceberg<\/p>\n<\/th>\n<th>\n<p align=\"left\">Delta Lake<\/p>\n<\/th>\n<th>\n<p align=\"left\">Hudi<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"200\" width=\"200\">\n<p align=\"left\"><strong>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">&lt;100ms<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u0438\u043d\u0443\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0435\u043a\u0443\u043d\u0434\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0435\u043a\u0443\u043d\u0434\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"200\" width=\"200\">\n<p align=\"left\"><strong>\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0431\u0430\u0442\u0447-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"200\" width=\"200\">\n<p align=\"left\"><strong>Write Amplification<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0438\u0437\u043a\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u044f\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0438\u0437\u043a\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u044f\u044f\/\u0432\u044b\u0441\u043e\u043a\u0430\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"200\" width=\"200\">\n<p align=\"left\"><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c update-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0438\u0437\u043a\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"200\" width=\"200\">\n<p align=\"left\"><strong>\u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c compaction<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0432\u0438\u0436\u043a\u043e\u0432<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0414\u0432\u0438\u0436\u043e\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">Paimon<\/p>\n<\/th>\n<th>\n<p align=\"left\">Iceberg<\/p>\n<\/th>\n<th>\n<p align=\"left\">Delta Lake<\/p>\n<\/th>\n<th>\n<p align=\"left\">Hudi<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Spark<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705 \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Flink<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705 \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Trino\/Presto<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Hive<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Impala<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Dremio<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Snowflake<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>BigQuery<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Athena<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>StarRocks<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0424\u0438\u0447\u0438<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0424\u0438\u0447\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">Paimon<\/p>\n<\/th>\n<th>\n<p align=\"left\">Iceberg<\/p>\n<\/th>\n<th>\n<p align=\"left\">Delta Lake<\/p>\n<\/th>\n<th>\n<p align=\"left\">Hudi<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>ACID Transactions<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Schema Evolution<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Partition Evolution<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u26a0\ufe0f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Hidden Partitioning<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Time Travel<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Incremental Read<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>CDC Native<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u26a0\ufe0f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Unified Changelog<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Z-Order<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Bloom Filters<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Delete Vectors<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Merge-on-Read<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>Copy-on-Write<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0413\u0434\u0435 Paimon \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0433\u0434\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Paimon \u0434\u0430\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0442\u0434\u0430\u0447\u0443. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 Paimon \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p><strong>Real-time DWH \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438<\/strong>. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 e-commerce \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0433\u0434\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u043e\u0434\u0430\u0436 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u0438\u043d\u0443\u0442\u044b, \u043c\u0430\u0440\u043a\u0435\u0442\u043e\u043b\u043e\u0433\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0434\u0435\u043b \u0441\u0442\u0440\u043e\u0438\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u0437\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u044b \u0438 \u0433\u043e\u0434\u044b. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e use case. \u0421 Paimon \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430. Streaming \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u044e\u0442 changelog \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f real-time \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432. Batch \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. Time-travel \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<p><strong>CDC \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c<\/strong>. \u041a\u0440\u0443\u043f\u043d\u044b\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0430\u0441\u0442\u043e \u0438\u043c\u0435\u044e\u0442 \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445: PostgreSQL \u0434\u043b\u044f \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, Oracle \u0434\u043b\u044f ERP, MongoDB \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c &#8212; \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. Paimon \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e: CDC-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p><strong>Feature Store \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/strong>. ML-\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u044a\u044f\u0432\u043b\u044f\u044e\u0442 \u043e\u0441\u043e\u0431\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c. \u0414\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 features \u0441 \u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043a\u0430\u043c\u0438 (\u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0443\u0442\u0435\u0447\u0435\u043a \u0434\u0430\u043d\u043d\u044b\u0445). \u0414\u043b\u044f \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u043d\u0443\u0436\u043d\u044b \u0441\u0432\u0435\u0436\u0430\u0439\u0448\u0438\u0435 \u0444\u0438\u0447\u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439. Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a\u0430\u043a feature store: \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0438\u0447\u0438 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 time-travel \u0437\u0430\u043f\u0440\u043e\u0441\u044b, real-time (online) \u0444\u0438\u0447\u0438 &#8212; \u0447\u0435\u0440\u0435\u0437 streaming API, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 training \u0438 serving.<\/p>\n<p><strong>Event Sourcing \u0438 \u0430\u0443\u0434\u0438\u0442<\/strong>. \u0412 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f\u0445 (\u0444\u0438\u043d\u0430\u043d\u0441\u044b, \u0437\u0434\u0440\u0430\u0432\u043e\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435) \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. Event sourcing \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. Paimon \u0441 \u0435\u0433\u043e unified changelog \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e\u043b\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0447\u0435\u0440\u0435\u0437 time-travel \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p><strong>IoT \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u044b<\/strong>. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441 IoT-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443: \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a real-time \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0442\u0430\u043a \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0447\u0430\u0441\u0442\u044b\u0435 out-of-order \u0441\u043e\u0431\u044b\u0442\u0438\u044f. Paimon \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438: \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435, watermark \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0437\u0434\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 downsampling \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 Paimon \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c<\/h4>\n<p>\u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447. \u0415\u0441\u0442\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0433\u0434\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437 \u0432 \u0434\u0435\u043d\u044c \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u0438 \u043d\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a real-time, \u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 batch \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0442\u0438\u043f\u0430 Parquet \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 Apache Iceberg \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. Paimon \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0430 \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u043e batch \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 (\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443) \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u0430 Apache Kafka \u0438\u043b\u0438 Apache Pulsar \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u041e\u043d\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 overhead \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u043e \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u044b\u0435 \u0421\u0423\u0411\u0414 \u0442\u0438\u043f\u0430 ClickHouse \u0438\u043b\u0438 Apache Druid \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0430\u0442 \u043b\u0443\u0447\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0438 \u043e\u043d\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043d\u0430 Paimon \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430. \u041b\u044e\u0431\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0441\u0435\u0442 \u0440\u0438\u0441\u043a\u0438 \u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u043a\u0443\u043f\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: Paimon \u043a\u0430\u043a \u043d\u043e\u0432\u0430\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (streamhouse)<\/h4>\n<p>Apache Paimon \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e data-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c &#8212; \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 streamhouse. \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044f streaming \u0438 batch \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u0432 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043e\u043d \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043c\u0435\u0436\u0434\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0439.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u0438 Paimon &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 LSM-tree \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f, unified changelog \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 streaming \u0438 batch \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u0438 self-contained \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 &#8212; \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 data-intensive \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u044b\u0431\u043e\u0440 lakehouse \u0444\u043e\u0440\u043c\u0430\u0442\u0430 &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0438\u0441\u043a &#171;\u043b\u0443\u0447\u0448\u0435\u0433\u043e&#187; \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e\u0434 \u0432\u0430\u0448\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><strong>Apache Paimon<\/strong> &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f streaming-first \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a \u043d\u0438\u0437\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435 real-time data platform \u043d\u0430 \u0431\u0430\u0437\u0435 Flink, Paimon \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p><strong>Apache Iceberg<\/strong> &#8212; \u0437\u0440\u0435\u043b\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f large-scale analytics \u0441 \u0448\u0438\u0440\u043e\u0447\u0430\u0439\u0448\u0435\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0438 proven scale &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 Iceberg.<\/p>\n<p><strong>Delta Lake<\/strong> &#8212; \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Spark-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Databricks. \u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u0442\u0435\u0441\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430.<\/p>\n<p><strong>Apache Hudi<\/strong> &#8212; \u0433\u0438\u0431\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u0433\u0430\u0442\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0434\u043b\u044f incremental processing. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d fine-grained control \u043d\u0430\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f &#8212; Hudi \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0440\u0430\u0437\u043c\u044b\u0432\u0430\u044e\u0442\u0441\u044f. Paimon \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 Iceberg, Iceberg \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u0436\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 streaming (\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u043a\u0430\u043a \u0443 Paimon), Delta Lake \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u044e \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443. \u0410 \u043f\u043e\u043a\u0430 &#8212; \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u0434 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 2: \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430<\/h3>\n<h4>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h4>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Apache Paimon \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u043a\u0430\u043a LSM-tree \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c streaming \u0438 batch \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Paimon, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u0442\u0435\u0441\u044c \u0432 production.<\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f production \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043d\u0430\u0431\u0436\u0435\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438, \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0449\u0438\u043c\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434, \u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u0414\u0443\u043c\u0430\u0439\u0442\u0435 \u043e\u0431 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043a\u0430\u043a \u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<h4>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/h4>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. Apache Paimon \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0432\u0438\u0436\u043a\u0430\u043c\u0438, \u043d\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438\u043c\u0435\u0435\u0442 Apache Flink. \u042d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e Paimon \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 Flink \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b unified streaming and batch storage. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<pre><code class=\"sql\">-- \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 Paimon-- \u041a\u0430\u0442\u0430\u043b\u043e\u0433 - \u044d\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0445 \u0442\u0430\u0431\u043b\u0438\u0446. \u0414\u0443\u043c\u0430\u0439\u0442\u0435 \u043e \u043d\u0435\u043c \u043a\u0430\u043a \u043e \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 -- \u0432 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414, \u043d\u043e \u0441 \u0432\u0430\u0436\u043d\u044b\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c: \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438CREATE CATALOG paimon_catalog WITH (    'type' = 'paimon',    -- warehouse - \u043a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430    -- \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043b\u0438 S3\/HDFS \u0434\u043b\u044f production    'warehouse' = 's3:\/\/your-bucket\/paimon-warehouse',    -- \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f S3 (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 AWS)    's3.endpoint' = 'https:\/\/s3.amazonaws.com',    's3.access-key' = '${env:AWS_ACCESS_KEY_ID}',    's3.secret-key' = '${env:AWS_SECRET_ACCESS_KEY}');-- \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433USE CATALOG paimon_catalog;-- \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 (namespace \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446)CREATE DATABASE IF NOT EXISTS production;USE production;-- \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439-- \u042d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 - \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f streamingCREATE TABLE user_events (    -- \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445    event_id BIGINT,    user_id BIGINT,    event_type STRING,    event_time TIMESTAMP(3),  -- (3) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0443\u044e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c        -- JSON \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0433\u0438\u0431\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u044f    -- \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b    properties STRING,        -- \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435    device ROW&lt;        type STRING,        os STRING,        browser STRING,        ip STRING    &gt;,        -- \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f    processing_time TIMESTAMP(3) METADATA FROM 'timestamp',  -- \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430        -- Primary key \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432    -- \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439    PRIMARY KEY (user_id, event_id) NOT ENFORCED,        -- Watermark \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 streaming \u0440\u0435\u0436\u0438\u043c\u0435    -- \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043e 10 \u0441\u0435\u043a\u0443\u043d\u0434    WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND) -- \u041f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0434\u043d\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e pruning \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445PARTITIONED BY (event_day STRING) WITH (    -- \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e bucket'\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0437\u0430\u043f\u0438\u0441\u0438    -- \u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443: (\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443) \/ (128 MB)    'bucket' = '8',        -- \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440: \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c changelog    -- full-compaction: changelog \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u043b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432)    -- input: changelog \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 (\u043b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u043d\u0438\u0437\u043a\u043e\u0439 latency)    'changelog-producer' = 'full-compaction',        -- \u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 - \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c\u044e changelog \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439    'changelog-producer.compaction-interval' = '2 min',        -- \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0435\u0440\u0435\u0434 \u0441\u0431\u0440\u043e\u0441\u043e\u043c \u043d\u0430 \u0434\u0438\u0441\u043a    -- \u0411\u043e\u043b\u044c\u0448\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 = \u043c\u0435\u043d\u044c\u0448\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u043e \u0432\u044b\u0448\u0435 latency    'write-buffer-size' = '256 MB',        -- \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439    'merge-engine' = 'deduplicate',  -- \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e        -- \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432    'compaction.min-file-num' = '3',  -- \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u0440\u0438 3+ \u0444\u0430\u0439\u043b\u0430\u0445    'compaction.max-file-num' = '10',  -- \u043d\u043e \u043d\u0435 \u0436\u0434\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 10 \u0444\u0430\u0439\u043b\u043e\u0432        -- \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u043b\u044f time-travel \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432    'snapshot.expire.limit' = '100',    'snapshot.expire.execution-mode' = 'async'  -- \u0447\u0438\u0441\u0442\u043a\u0430 \u0432 \u0444\u043e\u043d\u0435);-- \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043b\u043e\u043d\u043a\u0443-- \u042d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435ALTER TABLE user_events ADD event_hour AS HOUR(event_time);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u0435\u043d &#8212; \u043e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043d\u043e \u0438 \u0442\u043e, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u0430\u0445. \u0417\u0430\u043f\u0438\u0441\u0438 \u0441 \u0431\u043b\u0438\u0437\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c, \u0447\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 range-\u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 bucket&#8217;\u043e\u0432 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 bucket \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e bucket&#8217;\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 &#8216;input&#8217; \u0438 &#8216;full-compaction&#8217; \u0434\u043b\u044f changelog-producer &#8212; \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 latency \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<h4>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Kafka<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 production \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 Kafka, \u0438\u0445 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u042d\u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a Paimon \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 streaming \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439.<\/p>\n<pre><code class=\"java\">\/\/ Java \u043a\u043e\u0434 \u0434\u043b\u044f Flink DataStream API\/\/ \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f, \u0447\u0435\u043c \u0447\u0438\u0441\u0442\u044b\u0439 SQLimport org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import org.apache.flink.streaming.api.CheckpointingMode;import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;import org.apache.flink.table.api.*;import org.apache.flink.types.Row;import java.time.Duration;public class KafkaToPaimonPipeline {        public static void main(String[] args) throws Exception {        \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f Flink \u0441 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f production        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();                \/\/ Checkpoint'\u044b \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f exactly-once \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438        \/\/ \u0411\u0435\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438 \u0441\u0431\u043e\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0438\u043b\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435        env.enableCheckpointing(60000);  \/\/ \u043a\u0430\u0436\u0434\u044b\u0435 60 \u0441\u0435\u043a\u0443\u043d\u0434        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);        env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);  \/\/ \u043c\u0438\u043d\u0438\u043c\u0443\u043c 30 \u0441\u0435\u043a \u043c\u0435\u0436\u0434\u0443 checkpoint'\u0430\u043c\u0438        env.getCheckpointConfig().setCheckpointTimeout(120000);  \/\/ \u0442\u0430\u0439\u043c\u0430\u0443\u0442 2 \u043c\u0438\u043d\u0443\u0442\u044b        env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);  \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d checkpoint \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e                \/\/ Table API \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 SQL        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);                \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 idle timeout \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439        \/\/ \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e watermark \u043c\u043e\u0436\u0435\u0442 \"\u0437\u0430\u0441\u0442\u0440\u044f\u0442\u044c\" \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u0445 \u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0445        tableEnv.getConfig().set(            \"table.exec.source.idle-timeout\",             Duration.ofMinutes(1).toString()        );                \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 - Kafka topic        tableEnv.executeSql(\"\"\"            CREATE TEMPORARY TABLE kafka_events (                -- \u041f\u043e\u043b\u044f \u0438\u0437 Kafka \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f                event_id BIGINT,                user_id BIGINT,                event_type STRING,                event_timestamp BIGINT,  -- Unix timestamp \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445                properties STRING,  -- JSON \u0441\u0442\u0440\u043e\u043a\u0430                                -- \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 Kafka \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430                kafka_timestamp TIMESTAMP(3) METADATA FROM 'timestamp',                kafka_partition INT METADATA FROM 'partition',                kafka_offset BIGINT METADATA FROM 'offset',                                -- \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c Unix timestamp \u0432 TIMESTAMP \u0434\u043b\u044f watermark                event_time AS TO_TIMESTAMP_LTZ(event_timestamp, 3),                WATERMARK FOR event_time AS event_time - INTERVAL '10' SECOND            ) WITH (                'connector' = 'kafka',                'topic' = 'user-events-raw',                'properties.bootstrap.servers' = 'kafka-broker-1:9092,kafka-broker-2:9092',                'properties.group.id' = 'paimon-ingestion-${env:ENVIRONMENT}',                                -- \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e committed offset                'scan.startup.mode' = 'group-offsets',                -- \u0415\u0441\u043b\u0438 offset'\u043e\u0432 \u043d\u0435\u0442 (\u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a), \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430                'properties.auto.offset.reset' = 'earliest',                                'format' = 'json',                'json.fail-on-missing-field' = 'false',  -- \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u044f\u0445                'json.ignore-parse-errors' = 'false'  -- \u043d\u043e \u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u043c JSON            )        \"\"\");                \/\/ \u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f (\u0442\u0430\u043a\u0436\u0435 Paimon)        \/\/ \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d lookup join        tableEnv.executeSql(\"\"\"            CREATE TABLE user_profiles (                user_id BIGINT,                username STRING,                email STRING,                registration_date DATE,                user_segment STRING,                country STRING,                -- \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430                updated_at TIMESTAMP(3),                PRIMARY KEY (user_id) NOT ENFORCED            ) WITH (                'connector' = 'paimon',                -- \u0412\u0430\u0436\u043d\u043e: \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c continuous discovery \u0434\u043b\u044f \u0441\u0432\u0435\u0436\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445                'continuous.discovery-interval' = '30 s',                -- \u041a\u044d\u0448\u0438\u0440\u0443\u0435\u043c lookup \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438                'lookup.cache.ttl' = '10 min'            )        \"\"\");                \/\/ \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 side output)        tableEnv.executeSql(\"\"\"            CREATE TABLE suspicious_events (                event_id BIGINT,                user_id BIGINT,                event_type STRING,                reason STRING,                detection_time TIMESTAMP(3),                PRIMARY KEY (event_id) NOT ENFORCED            ) WITH (                'connector' = 'paimon',                'merge-engine' = 'deduplicate'            )        \"\"\");                \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 ETL pipeline \u0441 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0435\u0439        String mainPipeline = \"\"\"            -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c STATEMENT SET \u0434\u043b\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 INSERT            EXECUTE STATEMENT SET            BEGIN                -- \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a: \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f                INSERT INTO user_events                SELECT                     ke.event_id,                    ke.user_id,                    ke.event_type,                    ke.event_time,                                        -- \u041e\u0431\u043e\u0433\u0430\u0449\u0430\u0435\u043c properties \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 \u043f\u0440\u043e\u0444\u0438\u043b\u044f                    -- JSON_MERGE \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 Flink SQL, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e                    CONCAT(                        SUBSTR(ke.properties, 1, LENGTH(ke.properties) - 1),                        ',',                        '\"username\":\"', COALESCE(up.username, ''), '\",',                        '\"user_segment\":\"', COALESCE(up.user_segment, ''), '\",',                        '\"country\":\"', COALESCE(up.country, ''), '\",',                        '\"account_age_days\":',                         CAST(TIMESTAMPDIFF(DAY, up.registration_date, CURRENT_DATE) AS STRING),                        '}'                    ) as properties,                                        -- \u041f\u0430\u0440\u0441\u0438\u043c device \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 JSON                    ROW(                        JSON_VALUE(ke.properties, '$.device.type'),                        JSON_VALUE(ke.properties, '$.device.os'),                        JSON_VALUE(ke.properties, '$.device.browser'),                        JSON_VALUE(ke.properties, '$.device.ip')                    ) as device,                                        -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f                    DATE_FORMAT(ke.event_time, 'yyyy-MM-dd') as event_day                                    FROM kafka_events ke                -- Temporal join \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f                LEFT JOIN user_profiles FOR SYSTEM_TIME AS OF ke.event_time AS up                    ON ke.user_id = up.user_id                -- \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f                WHERE ke.event_type IS NOT NULL                    AND ke.user_id IS NOT NULL                    AND ke.event_id IS NOT NULL;                                -- Side output: \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430                INSERT INTO suspicious_events                SELECT                     event_id,                    user_id,                    event_type,                    CASE                         -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438                        WHEN event_type = 'purchase' AND                              CAST(JSON_VALUE(properties, '$.amount') AS DECIMAL(10,2)) &gt; 10000                              THEN 'high_value_transaction'                        WHEN event_type IN ('login', 'password_change') AND                              HOUR(event_time) BETWEEN 2 AND 5                              THEN 'unusual_time_activity'                        WHEN JSON_VALUE(properties, '$.failed_attempts') &gt; '5'                              THEN 'multiple_failed_attempts'                        ELSE 'other'                    END as reason,                    CURRENT_TIMESTAMP as detection_time                FROM kafka_events                WHERE                     -- \u0423\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439                    (event_type = 'purchase' AND                      CAST(JSON_VALUE(properties, '$.amount') AS DECIMAL(10,2)) &gt; 10000)                    OR (event_type IN ('login', 'password_change') AND                         HOUR(event_time) BETWEEN 2 AND 5)                    OR CAST(JSON_VALUE(properties, '$.failed_attempts') AS INT) &gt; 5;            END        \"\"\";                \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c pipeline        tableEnv.executeSql(mainPipeline);                \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c job        env.execute(\"Kafka to Paimon Streaming ETL\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432. Temporal join \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f &#8212; \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u044f, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 \u043d\u0435 \u0442\u0435\u043a\u0443\u0449\u0443\u044e. Side output \u0447\u0435\u0440\u0435\u0437 STATEMENT SET \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 JSON \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 semi-structured \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443.<\/p>\n<h4>\u0413\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u043e\u0434\u043d\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0447\u0442\u0435\u043d\u0438\u044f<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Paimon &#8212; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0432 streaming, \u0442\u0430\u043a \u0438 \u0432 batch \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442.<\/p>\n<pre><code class=\"python\"># Python \u043a\u043e\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c PyFlink# \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439from pyflink.table import EnvironmentSettings, TableEnvironmentfrom pyflink.table.expressions import col, lit, callfrom datetime import datetime, timedeltaimport jsonclass HybridAnalytics:    \"\"\"    \u041a\u043b\u0430\u0441\u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0447\u0442\u0435\u043d\u0438\u044f Paimon \u0442\u0430\u0431\u043b\u0438\u0446    \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432    \"\"\"        def __init__(self, warehouse_path: str):        \"\"\"        \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f batch \u0438 streaming \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438                \u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e        batch \u0438 streaming \u0440\u0435\u0436\u0438\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f        \"\"\"        # Batch \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432        self.batch_env = TableEnvironment.create(            EnvironmentSettings.in_batch_mode()        )                # Streaming \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f real-time \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438        self.stream_env = TableEnvironment.create(            EnvironmentSettings.in_streaming_mode()        )                # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439        for env in [self.batch_env, self.stream_env]:            env.execute_sql(f\"\"\"                CREATE CATALOG paimon_catalog WITH (                    'type' = 'paimon',                    'warehouse' = '{warehouse_path}'                )            \"\"\")            env.use_catalog(\"paimon_catalog\")            env.use_database(\"production\")        def batch_analytics(self) -&gt; None:        \"\"\"        Batch \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430: \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438                \u0412 batch \u0440\u0435\u0436\u0438\u043c\u0435 Paimon \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b,        \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 I\/O \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439        \"\"\"                # \u0421\u043b\u043e\u0436\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 window \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438        # \u0422\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b \u0432 batch \u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f columnar storage        result = self.batch_env.sql_query(\"\"\"            WITH user_metrics AS (                -- \u041f\u0435\u0440\u0432\u044b\u0439 CTE: \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c                SELECT                     user_id,                    DATE(event_time) as event_date,                    COUNT(*) as daily_events,                    COUNT(DISTINCT event_type) as unique_event_types,                                        -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c MAP_AGG \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e \u0442\u0438\u043f\u0430\u043c                    -- \u042d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b                    MAP_AGG(event_type, event_id) as events_by_type,                                        -- Window \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0434\u043e\u0432                    COUNT(*) OVER (                        PARTITION BY user_id                         ORDER BY DATE(event_time)                         ROWS BETWEEN 6 PRECEDING AND CURRENT ROW                    ) as weekly_events,                                        -- \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c                    FIRST_VALUE(event_type) OVER (                        PARTITION BY user_id, DATE(event_time)                        ORDER BY COUNT(*) DESC                    ) as most_frequent_event                                    FROM user_events                WHERE event_time &gt;= CURRENT_TIMESTAMP - INTERVAL '30' DAY                GROUP BY user_id, DATE(event_time), event_type            ),            cohort_analysis AS (                -- \u0412\u0442\u043e\u0440\u043e\u0439 CTE: \u043a\u043e\u0433\u043e\u0440\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437                SELECT                     up.registration_date,                    um.event_date,                    -- \u0414\u043d\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438                    DATEDIFF(um.event_date, up.registration_date) as days_since_registration,                    COUNT(DISTINCT um.user_id) as active_users,                    AVG(um.daily_events) as avg_events_per_user                FROM user_metrics um                JOIN user_profiles up ON um.user_id = up.user_id                GROUP BY up.registration_date, um.event_date            )            -- \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441: retention \u043c\u0430\u0442\u0440\u0438\u0446\u0430            SELECT                 registration_date as cohort,                days_since_registration,                active_users,                -- \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c retention rate                active_users * 100.0 \/ FIRST_VALUE(active_users) OVER (                    PARTITION BY registration_date                     ORDER BY days_since_registration                ) as retention_rate,                avg_events_per_user            FROM cohort_analysis            WHERE days_since_registration BETWEEN 0 AND 30            ORDER BY registration_date, days_since_registration        \"\"\")                # Batch \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c        result.execute_insert(\"cohort_retention_analysis\")        print(\"Cohort analysis completed and saved\")        def streaming_monitoring(self) -&gt; None:        \"\"\"        Streaming \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433: real-time \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0430\u043b\u0435\u0440\u0442\u044b                \u0412 streaming \u0440\u0435\u0436\u0438\u043c\u0435 Paimon \u0447\u0438\u0442\u0430\u0435\u0442 changelog \u0438 continuously        \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445        \"\"\"                # \u0421\u043e\u0437\u0434\u0430\u0435\u043c continuous view \u0434\u043b\u044f real-time \u043c\u0435\u0442\u0440\u0438\u043a        # TUMBLE window \u0441\u043e\u0437\u0434\u0430\u0435\u0442 non-overlapping \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u043d\u0430        self.stream_env.execute_sql(\"\"\"            CREATE TEMPORARY VIEW realtime_metrics AS            SELECT                 -- \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043e\u043a\u043d\u043e                TUMBLE_START(event_time, INTERVAL '1' MINUTE) as window_start,                TUMBLE_END(event_time, INTERVAL '1' MINUTE) as window_end,                                -- \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u043e\u043a\u043d\u0435                COUNT(*) as total_events,                COUNT(DISTINCT user_id) as unique_users,                COUNT(DISTINCT event_type) as event_types,                                -- \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439                MAP_AGG(event_type, COUNT(*)) as event_distribution,                                -- P95 latency (\u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439)                PERCENTILE_CONT(                    EXTRACT(EPOCH FROM processing_time - event_time),                     0.95                ) as p95_latency_seconds,                                -- \u0414\u0435\u0442\u0435\u043a\u0446\u0438\u044f \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0439: \u0432\u0441\u043f\u043b\u0435\u0441\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438                CASE                     WHEN COUNT(*) &gt; (                        -- \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u0430\u0441                        SELECT AVG(cnt) * 2                        FROM (                            SELECT COUNT(*) as cnt                            FROM user_events                            WHERE event_time &gt;= CURRENT_TIMESTAMP - INTERVAL '1' HOUR                            GROUP BY TUMBLE(event_time, INTERVAL '1' MINUTE)                        )                    ) THEN TRUE                    ELSE FALSE                END as is_anomaly                            FROM user_events            GROUP BY TUMBLE(event_time, INTERVAL '1' MINUTE)        \"\"\")                # \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430        self.stream_env.execute_sql(\"\"\"            CREATE TABLE IF NOT EXISTS monitoring_metrics (                window_start TIMESTAMP(3),                window_end TIMESTAMP(3),                total_events BIGINT,                unique_users BIGINT,                event_types INT,                event_distribution STRING,  -- \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441 MAP \u043d\u0430 STRING                p95_latency_seconds DOUBLE,                is_anomaly BOOLEAN,                -- \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430                ingestion_time TIMESTAMP(3) METADATA FROM 'timestamp',                PRIMARY KEY (window_start) NOT ENFORCED            ) WITH (                'merge-engine' = 'deduplicate',                -- \u0425\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u0435\u0442\u0440\u0438\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u043d\u0430                'changelog-producer' = 'none',                -- \u0410\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0435\u0442\u0440\u0438\u043a                'compaction.max-file-num' = '5'            )        \"\"\")                # \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438        self.stream_env.execute_sql(\"\"\"            INSERT INTO monitoring_metrics            SELECT * FROM realtime_metrics        \"\"\")                # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u043b\u0435\u0440\u0442\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a        alerts = self.stream_env.sql_query(\"\"\"            SELECT                 window_start,                'ANOMALY_DETECTED' as alert_type,                CONCAT(                    'Unusual activity detected: ',                    CAST(total_events AS STRING),                    ' events in window'                ) as message,                MAP[                    'total_events', CAST(total_events AS STRING),                    'unique_users', CAST(unique_users AS STRING),                    'event_distribution', CAST(event_distribution AS STRING)                ] as context            FROM realtime_metrics            WHERE is_anomaly = TRUE        \"\"\")                # \u0412 production \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u0430 \u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 Kafka\/Slack\/PagerDuty        alerts.execute_insert(\"alerts_table\")        def time_travel_analysis(self, hours_ago: int = 1) -&gt; None:        \"\"\"        Time Travel \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432                Paimon \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c        \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c        \"\"\"                # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c timestamp \u0434\u043b\u044f time travel        target_timestamp = int(            (datetime.now() - timedelta(hours=hours_ago)).timestamp() * 1000        )                # Time travel \u0447\u0435\u0440\u0435\u0437 SQL hint        historical_data = self.batch_env.sql_query(f\"\"\"            -- OPTIONS hint \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f            SELECT                 user_id,                COUNT(*) as event_count,                COLLECT(event_type) as event_sequence,                MIN(event_time) as first_event,                MAX(event_time) as last_event            FROM user_events             \/*+ OPTIONS(                'scan.timestamp-millis' = '{target_timestamp}',                -- \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c snapshot-id \u0432\u043c\u0435\u0441\u0442\u043e timestamp                -- 'scan.snapshot-id' = '12345'            ) *\/            WHERE user_id IN (                -- \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438                SELECT DISTINCT user_id                 FROM user_events                 \/*+ OPTIONS('scan.timestamp-millis' = '{target_timestamp}') *\/                WHERE event_time &gt;= TIMESTAMP '{datetime.now() - timedelta(hours=hours_ago+1)}'                  AND event_time &lt;= TIMESTAMP '{datetime.now() - timedelta(hours=hours_ago)}'                LIMIT 100            )            GROUP BY user_id        \"\"\")                # \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439        comparison = self.batch_env.sql_query(f\"\"\"            WITH historical AS (                SELECT user_id, COUNT(*) as historical_count                FROM user_events                 \/*+ OPTIONS('scan.timestamp-millis' = '{target_timestamp}') *\/                GROUP BY user_id            ),            current AS (                SELECT user_id, COUNT(*) as current_count                FROM user_events                GROUP BY user_id            )            SELECT                 COALESCE(h.user_id, c.user_id) as user_id,                COALESCE(h.historical_count, 0) as events_then,                COALESCE(c.current_count, 0) as events_now,                COALESCE(c.current_count, 0) - COALESCE(h.historical_count, 0) as events_added,                CASE                     WHEN h.historical_count IS NULL THEN 'new_user'                    WHEN c.current_count IS NULL THEN 'churned_user'                    WHEN c.current_count &gt; h.historical_count * 1.5 THEN 'growing_activity'                    WHEN c.current_count &lt; h.historical_count * 0.5 THEN 'declining_activity'                    ELSE 'stable_activity'                END as user_status            FROM historical h            FULL OUTER JOIN current c ON h.user_id = c.user_id            WHERE COALESCE(c.current_count, 0) - COALESCE(h.historical_count, 0) != 0            ORDER BY ABS(COALESCE(c.current_count, 0) - COALESCE(h.historical_count, 0)) DESC            LIMIT 100        \"\"\")                print(f\"Time travel analysis for {hours_ago} hours ago completed\")        return comparison        def incremental_processing(self) -&gt; None:        \"\"\"        \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u0447\u0438\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430                \u042d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 batch \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446        \"\"\"                # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 snapshot \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f        last_processed = self.batch_env.sql_query(\"\"\"            SELECT MAX(last_snapshot_id) as snapshot_id            FROM processing_state            WHERE job_name = 'daily_aggregation'        \"\"\").collect()[0][0] or 0                # \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e snapshot        incremental_data = self.batch_env.sql_query(f\"\"\"            SELECT                 user_id,                DATE(event_time) as event_date,                event_type,                COUNT(*) as event_count,                -- \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 snapshot \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                _SNAPSHOT_ID_ as snapshot_id            FROM user_events            \/*+ OPTIONS(                'scan.mode' = 'incremental',                'incremental-between' = '{last_processed},latest'            ) *\/            GROUP BY user_id, DATE(event_time), event_type, _SNAPSHOT_ID_        \"\"\")                # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435        self.batch_env.execute_sql(\"\"\"            -- MERGE INTO \u0434\u043b\u044f upsert \u043b\u043e\u0433\u0438\u043a\u0438            MERGE INTO daily_user_aggregates target            USING (                SELECT                     user_id,                    event_date,                    SUM(event_count) as total_events,                    MAP_AGG(event_type, event_count) as events_by_type,                    MAX(snapshot_id) as snapshot_id                FROM incremental_data                GROUP BY user_id, event_date            ) source            ON target.user_id = source.user_id                AND target.event_date = source.event_date            WHEN MATCHED THEN                UPDATE SET                     total_events = target.total_events + source.total_events,                    -- Merge maps: \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439                    events_by_type = MAP_UNION_SUM(                        target.events_by_type,                         source.events_by_type                    ),                    last_updated = CURRENT_TIMESTAMP            WHEN NOT MATCHED THEN                INSERT (user_id, event_date, total_events, events_by_type, last_updated)                VALUES (                    source.user_id,                     source.event_date,                     source.total_events,                     source.events_by_type,                    CURRENT_TIMESTAMP                )        \"\"\")                # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438        self.batch_env.execute_sql(f\"\"\"            INSERT INTO processing_state (job_name, last_snapshot_id, processed_at)            VALUES (                'daily_aggregation',                (SELECT MAX(snapshot_id) FROM incremental_data),                CURRENT_TIMESTAMP            )        \"\"\")                print(\"Incremental processing completed\")# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430if __name__ == \"__main__\":    analytics = HybridAnalytics(\"s3:\/\/your-bucket\/paimon-warehouse\")        # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430    analytics.batch_analytics()  # \u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u043d\u0430\u0434 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438    analytics.streaming_monitoring()  # Real-time \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433    analytics.time_travel_analysis(hours_ago=24)  # \u0410\u043d\u0430\u043b\u0438\u0437 \u0432\u0447\u0435\u0440\u0430\u0448\u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f    analytics.incremental_processing()  # \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0449\u044c \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Paimon. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 <code>user_events<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432: batch \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0439, streaming \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, time travel \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<h4>CDC \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439<\/h4>\n<p>Change Data Capture (CDC) &#8212; \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. Paimon \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 CDC \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0432\u043e\u0435\u0439 LSM-tree \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 unified changelog. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 CDC pipeline \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"sql\">-- SQL \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CDC pipeline \u043e\u0442 MySQL \u043a Paimon-- \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0430\u0443\u0434\u0438\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439-- \u0428\u0430\u0433 1: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a CDC \u0438\u0437 MySQL-- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Flink CDC connector \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f binlogCREATE TEMPORARY TABLE mysql_orders_cdc (    -- \u041f\u043e\u043b\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    order_id BIGINT,    user_id BIGINT,    product_id BIGINT,    quantity INT,    price DECIMAL(10, 2),    order_status STRING,    payment_method STRING,    shipping_address STRING,    created_at TIMESTAMP(3),    updated_at TIMESTAMP(3),        -- \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 CDC \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    -- \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0439    op_type STRING METADATA FROM 'op_type' VIRTUAL,    op_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL,        -- Primary key \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435    PRIMARY KEY (order_id) NOT ENFORCED) WITH (    'connector' = 'mysql-cdc',    'hostname' = '${env:MYSQL_HOST}',    'port' = '3306',    'username' = '${env:MYSQL_USER}',    'password' = '${env:MYSQL_PASSWORD}',    'database-name' = 'ecommerce',    'table-name' = 'orders',        -- \u0412\u0430\u0436\u043d\u043e: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 binlog    -- \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435    'scan.startup.mode' = 'initial',        -- \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f production    'server-id' = '5400-5404',  -- \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f    'scan.snapshot.fetch.size' = '1024',  -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430 \u043f\u0440\u0438 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u0435    'connect.timeout' = '30s',    'server-time-zone' = 'UTC',        -- Debezium properties \u0434\u043b\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438    'debezium.snapshot.locking.mode' = 'none',  -- \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b    'debezium.include.schema.changes' = 'false'  -- \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c DDL);-- \u0428\u0430\u0433 2: \u0426\u0435\u043b\u0435\u0432\u0430\u044f Paimon \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0439-- \u042d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438CREATE TABLE IF NOT EXISTS orders_history (    -- \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u043e\u043b\u044f    order_id BIGINT,    user_id BIGINT,    product_id BIGINT,    quantity INT,    price DECIMAL(10, 2),    order_status STRING,    payment_method STRING,    shipping_address STRING,        -- \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0438\u0437 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430    created_at TIMESTAMP(3),    updated_at TIMESTAMP(3),        -- \u041f\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f    version_number BIGINT,  -- \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438    valid_from TIMESTAMP(3),  -- \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439    valid_to TIMESTAMP(3),  -- \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 (NULL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439)    is_current BOOLEAN,  -- \u0444\u043b\u0430\u0433 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438        -- \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    operation_type STRING,  -- INSERT, UPDATE, DELETE, SNAPSHOT    operation_timestamp TIMESTAMP(3),  -- \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f    operation_user STRING,  -- \u043a\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e (\u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e)        -- \u0410\u0443\u0434\u0438\u0442    ingestion_timestamp TIMESTAMP(3) METADATA FROM 'timestamp',  -- \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 Paimon        -- \u0421\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 primary key \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0441\u0438\u0439    PRIMARY KEY (order_id, version_number) NOT ENFORCED) PARTITIONED BY (DATE_FORMAT(valid_from, 'yyyy-MM')) WITH (    -- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c partial-update \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439    'merge-engine' = 'partial-update',    'partial-update.ignore-delete' = 'false',        -- Changelog \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f streaming \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439    'changelog-producer' = 'input',    'changelog-producer.row-deduplicate' = 'false',  -- \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438        -- \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445    'bucket' = '16',  -- \u0431\u043e\u043b\u044c\u0448\u0435 bucket'\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438    'bucket-key' = 'order_id',  -- \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e order_id        -- \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f    'compaction.min-file-num' = '5',    'compaction.max-file-num' = '10',    'compaction.optimization-interval' = '1 h',  -- \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441        -- \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u043e\u0432 \u0434\u043b\u044f time travel    'snapshot.time-retained' = '7 d',  -- \u0445\u0440\u0430\u043d\u0438\u043c \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b 7 \u0434\u043d\u0435\u0439    'snapshot.num-retained.min' = '10',    'snapshot.num-retained.max' = '100');-- \u0428\u0430\u0433 3: \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (SCD Type 1) \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432-- \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438CREATE TABLE IF NOT EXISTS orders_current (    order_id BIGINT,    user_id BIGINT,    product_id BIGINT,    quantity INT,    price DECIMAL(10, 2),    order_status STRING,    payment_method STRING,    shipping_address STRING,    created_at TIMESTAMP(3),    updated_at TIMESTAMP(3),        -- \u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f    last_operation STRING,    last_modified TIMESTAMP(3),        PRIMARY KEY (order_id) NOT ENFORCED) WITH (    'merge-engine' = 'deduplicate',  -- \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e    'changelog-producer' = 'full-compaction',    'changelog-producer.compaction-interval' = '5 min');-- \u0428\u0430\u0433 4: ETL \u043b\u043e\u0433\u0438\u043a\u0430 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 CDC \u0441\u043e\u0431\u044b\u0442\u0438\u0439-- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Table API \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044fCREATE TEMPORARY VIEW orders_with_versions ASWITH version_calc AS (    -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438    SELECT         *,        -- ROW_NUMBER \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0432\u0435\u0440\u0441\u0438\u0438        ROW_NUMBER() OVER (            PARTITION BY order_id             ORDER BY op_ts        ) as version_number    FROM mysql_orders_cdc),versioned_data AS (    -- \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438    SELECT         order_id,        user_id,        product_id,        quantity,        price,        order_status,        payment_method,        shipping_address,        created_at,        updated_at,        version_number,        op_ts as valid_from,        -- valid_to - \u044d\u0442\u043e valid_from \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438        LEAD(op_ts) OVER (            PARTITION BY order_id             ORDER BY version_number        ) as valid_to,        -- \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u043c\u0435\u0435\u0442 valid_to = NULL        CASE             WHEN LEAD(op_ts) OVER (PARTITION BY order_id ORDER BY version_number) IS NULL             THEN TRUE             ELSE FALSE         END as is_current,        -- \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438        CASE op_type            WHEN '+I' THEN 'INSERT'            WHEN '-U' THEN 'UPDATE_BEFORE'            WHEN '+U' THEN 'UPDATE_AFTER'            WHEN '-D' THEN 'DELETE'            ELSE 'UNKNOWN'        END as operation_type,        op_ts as operation_timestamp,        -- \u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430        COALESCE(SYSTEM_USER(), 'system') as operation_user    FROM version_calc)SELECT * FROM versioned_data-- \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c UPDATE_BEFORE \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e UPDATE_AFTERWHERE operation_type != 'UPDATE_BEFORE';-- \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443INSERT INTO orders_historySELECT     order_id,    user_id,    product_id,    quantity,    price,    order_status,    payment_method,    shipping_address,    created_at,    updated_at,    version_number,    valid_from,    valid_to,    is_current,    operation_type,    operation_timestamp,    operation_userFROM orders_with_versions;-- \u0412\u0441\u0442\u0430\u0432\u043a\u0430\/\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044fINSERT INTO orders_currentSELECT     order_id,    user_id,    product_id,    quantity,    price,    order_status,    payment_method,    shipping_address,    created_at,    updated_at,    operation_type as last_operation,    operation_timestamp as last_modifiedFROM orders_with_versionsWHERE is_current = TRUE;-- \u0428\u0430\u0433 5: \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438CREATE TABLE IF NOT EXISTS order_status_transitions (    order_id BIGINT,    from_status STRING,    to_status STRING,    transition_time TIMESTAMP(3),    time_in_status BIGINT,  -- \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441\u0435    PRIMARY KEY (order_id, transition_time) NOT ENFORCED) WITH ('changelog-producer' = 'none');-- \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432INSERT INTO order_status_transitionsSELECT     order_id,    LAG(order_status) OVER (PARTITION BY order_id ORDER BY version_number) as from_status,    order_status as to_status,    valid_from as transition_time,    TIMESTAMPDIFF(        SECOND,         LAG(valid_from) OVER (PARTITION BY order_id ORDER BY version_number),        valid_from    ) as time_in_statusFROM orders_historyWHERE operation_type IN ('INSERT', 'UPDATE_AFTER')    AND LAG(order_status) OVER (PARTITION BY order_id ORDER BY version_number) != order_status;-- \u0428\u0430\u0433 6: \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445-- \u041f\u0440\u0438\u043c\u0435\u0440: \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430SELECT     version_number,    operation_type,    order_status,    price,    quantity,    valid_from,    valid_to,    CASE         WHEN valid_to IS NULL THEN 'Current'        ELSE CONCAT(            'Historical (',             CAST(TIMESTAMPDIFF(HOUR, valid_to, CURRENT_TIMESTAMP) AS STRING),            ' hours ago)'        )    END as version_statusFROM orders_historyWHERE order_id = 12345ORDER BY version_number DESC;-- \u041f\u0440\u0438\u043c\u0435\u0440: \u0410\u0443\u0434\u0438\u0442 \u0432\u0441\u0435\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043a\u0430\u0437\u043e\u0432 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 24 \u0447\u0430\u0441\u0430SELECT     order_id,    user_id,    order_status,    price,    operation_timestamp as deleted_at,    operation_user as deleted_byFROM orders_historyWHERE operation_type = 'DELETE'    AND operation_timestamp &gt;= CURRENT_TIMESTAMP - INTERVAL '24' HOURORDER BY operation_timestamp DESC;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 CDC \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h4>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/h4>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 Paimon \u0442\u0430\u0431\u043b\u0438\u0446. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432: \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432 LSM-tree. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<pre><code class=\"java\">\/\/ Java \u043a\u043e\u0434 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 Paimon \u0442\u0430\u0431\u043b\u0438\u0446import org.apache.paimon.catalog.Catalog;import org.apache.paimon.catalog.CatalogFactory;import org.apache.paimon.table.Table;import org.apache.paimon.table.source.TableScan;import org.apache.paimon.data.InternalRow;import org.apache.paimon.operation.metrics.MetricRegistry;import java.util.*;import java.util.concurrent.CompletableFuture;public class PaimonOptimizationManager {        private final Catalog catalog;    private final MetricRegistry metrics;        public PaimonOptimizationManager(String warehousePath) throws Exception {        \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a        Map&lt;String, String&gt; catalogOptions = new HashMap&lt;&gt;();        catalogOptions.put(\"warehouse\", warehousePath);        this.catalog = CatalogFactory.createCatalog(catalogOptions);        this.metrics = new MetricRegistry();    }        \/**     * \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438     *      * \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430     *\/    public TableHealth analyzeTableHealth(String database, String tableName) throws Exception {        Table table = catalog.getTable(database + \".\" + tableName);        TableHealth health = new TableHealth();                \/\/ \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443        TableStats stats = collectTableStatistics(table);        health.stats = stats;                \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0434\u0430\u0435\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438        analyzeFileDistribution(stats, health);        analyzeCompactionNeeds(stats, health);        analyzeQueryPerformance(table, health);        analyzeBucketSkew(stats, health);                return health;    }        private TableStats collectTableStatistics(Table table) throws Exception {        TableStats stats = new TableStats();                \/\/ \u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u0430\u0439\u043b\u0430\u0445        TableScan scan = table.newScan();        List&lt;DataFileMeta&gt; files = scan.plan().files();                \/\/ \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c LSM-tree        Map&lt;Integer, List&lt;DataFileMeta&gt;&gt; filesByLevel = new HashMap&lt;&gt;();        for (DataFileMeta file : files) {            filesByLevel.computeIfAbsent(file.level(), k -&gt; new ArrayList&lt;&gt;()).add(file);        }                \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c        for (Map.Entry&lt;Integer, List&lt;DataFileMeta&gt;&gt; entry : filesByLevel.entrySet()) {            int level = entry.getKey();            List&lt;DataFileMeta&gt; levelFiles = entry.getValue();                        LevelStats levelStats = new LevelStats();            levelStats.level = level;            levelStats.fileCount = levelFiles.size();                        \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432            long totalSize = 0;            long minSize = Long.MAX_VALUE;            long maxSize = 0;                        for (DataFileMeta file : levelFiles) {                long size = file.fileSize();                totalSize += size;                minSize = Math.min(minSize, size);                maxSize = Math.max(maxSize, size);                                \/\/ \u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e (\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a \u043e\u0431\u0449\u0438\u043c)                if (file.deleteRecordCount() &gt; 0) {                    double deleteRatio = (double) file.deleteRecordCount() \/                                        (file.recordCount() + file.deleteRecordCount());                    levelStats.fragmentation = Math.max(levelStats.fragmentation, deleteRatio);                }            }                        levelStats.totalSize = totalSize;            levelStats.avgFileSize = levelFiles.isEmpty() ? 0 : totalSize \/ levelFiles.size();            levelStats.minFileSize = minSize == Long.MAX_VALUE ? 0 : minSize;            levelStats.maxFileSize = maxSize;                        stats.levelStats.put(level, levelStats);        }                \/\/ \u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430        stats.totalFiles = files.size();        stats.totalSize = stats.levelStats.values().stream()            .mapToLong(l -&gt; l.totalSize)            .sum();        stats.partitionCount = scan.listPartitions().size();                return stats;    }        private void analyzeFileDistribution(TableStats stats, TableHealth health) {        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c        \/\/ \u0412 \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0439 LSM-tree \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e                int prevLevelFiles = 0;        for (int level = 0; level &lt;= 5; level++) {            LevelStats levelStats = stats.levelStats.get(level);            if (levelStats == null) continue;                        if (level == 0) {                \/\/ Level 0 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432                if (levelStats.fileCount &gt; 50) {                    health.addIssue(                        HealthIssue.Severity.HIGH,                        \"Too many files in Level 0\",                        String.format(\"Level 0 has %d files, indicating slow compaction\",                                     levelStats.fileCount),                        \"Increase compaction threads or reduce write rate\"                    );                }                                \/\/ \u0424\u0430\u0439\u043b\u044b \u043d\u0430 Level 0 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438                if (levelStats.avgFileSize &gt; 256 * 1024 * 1024) { \/\/ 256 MB                    health.addIssue(                        HealthIssue.Severity.MEDIUM,                        \"Large files in Level 0\",                        \"Files in Level 0 are too large, affecting write latency\",                        \"Decrease write-buffer-size parameter\"                    );                }            } else {                \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u043e\u0441\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438                LevelStats prevLevel = stats.levelStats.get(level - 1);                if (prevLevel != null &amp;&amp; levelStats.avgFileSize &lt; prevLevel.avgFileSize * 2) {                    health.addIssue(                        HealthIssue.Severity.LOW,                        \"Suboptimal level ratio\",                        String.format(\"Level %d files are not significantly larger than Level %d\",                                     level, level - 1),                        \"Consider adjusting compaction.max-file-num\"                    );                }            }                        prevLevelFiles = levelStats.fileCount;        }    }        private void analyzeCompactionNeeds(TableStats stats, TableHealth health) {        \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438                for (LevelStats levelStats : stats.levelStats.values()) {            \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e            if (levelStats.fragmentation &gt; 0.3) {                health.addIssue(                    HealthIssue.Severity.HIGH,                    \"High fragmentation\",                    String.format(\"Level %d has %.1f%% deleted records\",                                 levelStats.level, levelStats.fragmentation * 100),                    \"Run full compaction to reclaim space\"                );            }                        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432            if (levelStats.fileCount &gt; 10 &amp;&amp;                 levelStats.avgFileSize &lt; 64 * 1024 * 1024) { \/\/ &lt; 64 MB                health.addIssue(                    HealthIssue.Severity.MEDIUM,                    \"Too many small files\",                    String.format(\"Level %d has %d files with avg size %.1f MB\",                                 levelStats.level, levelStats.fileCount,                                levelStats.avgFileSize \/ (1024.0 * 1024.0)),                    \"Increase compaction frequency or trigger manual compaction\"                );            }        }                \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432        if (stats.totalFiles &gt; 1000) {            health.addIssue(                HealthIssue.Severity.HIGH,                \"Excessive file count\",                String.format(\"Table has %d files total\", stats.totalFiles),                \"Enable more aggressive compaction or partition the table\"            );        }    }        private void analyzeQueryPerformance(Table table, TableHealth health) {        \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432                \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f        Properties tableProps = table.options();        String cacheSize = tableProps.getProperty(\"read.cache-size\", \"0\");        if (\"0\".equals(cacheSize)) {            health.addIssue(                HealthIssue.Severity.LOW,                \"Caching disabled\",                \"Read cache is not configured\",                \"Set read.cache-size to improve query performance (e.g., '512 MB')\"            );        }                \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432        String bloomFilter = tableProps.getProperty(\"bloom-filter.columns\");        if (bloomFilter == null || bloomFilter.isEmpty()) {            health.addIssue(                HealthIssue.Severity.LOW,                \"No bloom filters\",                \"Bloom filters not configured for any columns\",                \"Add bloom filters for frequently filtered columns\"            );        }    }        private void analyzeBucketSkew(TableStats stats, TableHealth health) {        \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e bucket'\u0430\u043c        \/\/ \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430                Map&lt;Integer, Long&gt; bucketSizes = new HashMap&lt;&gt;();        \/\/ \u0417\u0434\u0435\u0441\u044c \u0431\u044b\u043b \u0431\u044b \u043a\u043e\u0434 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e bucket'\u0430\u043c        \/\/ \u041e\u043f\u0443\u0449\u0435\u043d \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438    }        \/**     * \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430     *\/    public CompletableFuture&lt;OptimizationResult&gt; optimizeTable(            String database,             String tableName,            OptimizationLevel level) {                    return CompletableFuture.supplyAsync(() -&gt; {            OptimizationResult result = new OptimizationResult();                        try {                Table table = catalog.getTable(database + \".\" + tableName);                TableHealth health = analyzeTableHealth(database, tableName);                                \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f                switch (level) {                    case LIGHT:                        \/\/ \u041b\u0435\u0433\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b                        performLightOptimization(table, health, result);                        break;                                            case MODERATE:                        \/\/ \u0423\u043c\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439                        performModerateOptimization(table, health, result);                        break;                                            case FULL:                        \/\/ \u041f\u043e\u043b\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: full compaction + \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f                        performFullOptimization(table, health, result);                        break;                }                                result.success = true;                result.message = \"Optimization completed successfully\";                            } catch (Exception e) {                result.success = false;                result.message = \"Optimization failed: \" + e.getMessage();                result.error = e;            }                        return result;        });    }        private void performLightOptimization(Table table, TableHealth health,                                          OptimizationResult result) throws Exception {        \/\/ \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e Level 0 \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432        LevelStats level0 = health.stats.levelStats.get(0);        if (level0 != null &amp;&amp; level0.fileCount &gt; 20) {            compactLevel(table, 0);            result.actionsPerformed.add(\"Compacted Level 0\");        }                \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b        cleanupSnapshots(table);        result.actionsPerformed.add(\"Cleaned up old snapshots\");    }        private void performModerateOptimization(Table table, TableHealth health,                                           OptimizationResult result) throws Exception {        \/\/ \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438        for (HealthIssue issue : health.issues) {            if (issue.severity == HealthIssue.Severity.HIGH &amp;&amp;                issue.title.contains(\"fragmentation\")) {                \/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0443\u0440\u043e\u0432\u043d\u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439                for (LevelStats level : health.stats.levelStats.values()) {                    if (level.fragmentation &gt; 0.3) {                        compactLevel(table, level.level);                        result.actionsPerformed.add(                            String.format(\"Compacted Level %d (fragmentation: %.1f%%)\",                                        level.level, level.fragmentation * 100)                        );                    }                }            }        }                \/\/ \u0422\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043b\u0435\u0433\u043a\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e        performLightOptimization(table, health, result);    }        private void performFullOptimization(Table table, TableHealth health,                                        OptimizationResult result) throws Exception {        \/\/ Full compaction - \u0441\u0430\u043c\u0430\u044f \u0442\u044f\u0436\u0435\u043b\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f        \/\/ \u041f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b        fullCompaction(table);        result.actionsPerformed.add(\"Performed full compaction\");                \/\/ \u041f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443        recomputeStatistics(table);        result.actionsPerformed.add(\"Recomputed table statistics\");                \/\/ \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b        cleanupOrphanFiles(table);        result.actionsPerformed.add(\"Cleaned up orphan files\");    }        \/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b    private void compactLevel(Table table, int level) {        \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f        \/\/ \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 (Flink\/Spark)        System.out.printf(\"Compacting level %d of table %s%n\", level, table.name());    }        private void fullCompaction(Table table) {        System.out.printf(\"Running full compaction for table %s%n\", table.name());    }        private void cleanupSnapshots(Table table) {        System.out.printf(\"Cleaning up old snapshots for table %s%n\", table.name());    }        private void recomputeStatistics(Table table) {        System.out.printf(\"Recomputing statistics for table %s%n\", table.name());    }        private void cleanupOrphanFiles(Table table) {        System.out.printf(\"Cleaning up orphan files for table %s%n\", table.name());    }        private static class TableStats {        int totalFiles;        long totalSize;        int partitionCount;        Map&lt;Integer, LevelStats&gt; levelStats = new HashMap&lt;&gt;();    }        private static class LevelStats {        int level;        int fileCount;        long totalSize;        long avgFileSize;        long minFileSize;        long maxFileSize;        double fragmentation;    }        private static class OptimizationResult {        boolean success;        String message;        List&lt;String&gt; actionsPerformed = new ArrayList&lt;&gt;();        Exception error;    }        private enum OptimizationLevel {        LIGHT,    \/\/ \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0438        MODERATE, \/\/ \u0423\u043c\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c        FULL      \/\/ \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f (\u043c\u043e\u0436\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c maintenance window)    }        private static class HealthIssue {        enum Severity { LOW, MEDIUM, HIGH }        Severity severity;        String title;        String description;        String recommendation;                HealthIssue(Severity severity, String title, String description, String recommendation) {            this.severity = severity;            this.title = title;            this.description = description;            this.recommendation = recommendation;        }    }        private static class TableHealth {        TableStats stats;        List&lt;HealthIssue&gt; issues = new ArrayList&lt;&gt;();                void addIssue(HealthIssue.Severity severity, String title,                      String description, String recommendation) {            issues.add(new HealthIssue(severity, title, description, recommendation));        }    }        \/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f    public static void main(String[] args) throws Exception {        PaimonOptimizationManager manager = new PaimonOptimizationManager(            \"s3:\/\/your-bucket\/warehouse\"        );                \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b        TableHealth health = manager.analyzeTableHealth(\"production\", \"user_events\");                \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b        System.out.println(\"Table Health Analysis:\");        for (HealthIssue issue : health.issues) {            System.out.printf(\"[%s] %s%n\", issue.severity, issue.title);            System.out.printf(\"  Description: %s%n\", issue.description);            System.out.printf(\"  Recommendation: %s%n\", issue.recommendation);        }                \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b        boolean hasCritical = health.issues.stream()            .anyMatch(i -&gt; i.severity == HealthIssue.Severity.HIGH);                    if (hasCritical) {            System.out.println(\"Critical issues found, starting optimization...\");            CompletableFuture&lt;OptimizationResult&gt; future = manager.optimizeTable(                \"production\",                 \"user_events\",                OptimizationLevel.MODERATE            );                        OptimizationResult result = future.get();            if (result.success) {                System.out.println(\"Optimization completed:\");                result.actionsPerformed.forEach(action -&gt;                     System.out.println(\"  - \" + action)                );            } else {                System.err.println(\"Optimization failed: \" + result.message);            }        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 Paimon \u0442\u0430\u0431\u043b\u0438\u0446. \u041c\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 LSM-tree, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c) \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f &#8212; \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0410\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b CPU \u0438 I\/O.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Apache Paimon \u0434\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432 \u043f\u0440\u043e\u0434\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438 \u0438 \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435: \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 &#8212; \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0441 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0435: \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. Batch \u0440\u0435\u0436\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u043d\u0430\u0434 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. Streaming \u0440\u0435\u0436\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f real-time \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 continuous \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. Time travel \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. Incremental processing \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435: CDC \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c &#8212; \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0420\u0435\u0448\u0438\u0442\u0435 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043d\u0443\u0436\u043d\u0430 \u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043b\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041f\u043e\u043b\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u043d\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0430\u0443\u0434\u0438\u0442\u0430.<\/p>\n<p>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0435: \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. LSM-tree \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e Apache Paimon &#8212; \u044d\u0442\u043e \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f. \u042d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0437\u0430\u0434\u0430\u0447: unified streaming and batch processing \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a \u043d\u0438\u0437\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u044d\u0442\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e, Paimon \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. <\/p>\n<hr\/>\n<h3>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/h3>\n<ul>\n<li>\n<p>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: <a href=\"https:\/\/paimon.apache.org\/docs\/1.1\/\" rel=\"noopener noreferrer nofollow\">https:\/\/paimon.apache.org\/docs\/1.1\/<\/a><\/p>\n<\/li>\n<li>\n<p>Paimon \u043d\u0430 Python: <a href=\"https:\/\/github.com\/apache\/paimon-python\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/apache\/paimon-python<\/a><\/p>\n<\/li>\n<li>\n<p>Paimon \u043d\u0430 Rust: <a href=\"https:\/\/github.com\/apache\/paimon-rust\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/apache\/paimon-rust<\/a><\/p>\n<\/li>\n<li>\n<p>WebUI \u0434\u043b\u044f Paimon (\u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0441\u044f, \u043d\u043e UI \u0435\u0441\u0442\u044c): <a href=\"https:\/\/github.com\/apache\/paimon-webui\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/apache\/paimon-webui<\/a><\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f Trino: <a href=\"https:\/\/github.com\/apache\/paimon-trino\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/apache\/paimon-trino<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u043e Paimon + StarRocks: <a href=\"https:\/\/habr.com\/ru\/articles\/961268\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/961268\/<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1053674\/\">https:\/\/habr.com\/ru\/articles\/1053674\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0410\u043d\u0434\u0440\u0435\u0435\u0432, \u044f \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 &#171;\u0410\u043b\u044c\u0444\u0430\u0421\u0442\u0440\u0430\u0445\u043e\u0432\u0430\u043d\u0438\u0435&#187;. \u042f \u043b\u044e\u0431\u043b\u044e \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u0441\u0444\u0435\u0440\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u044f \u043b\u044e\u0431\u043b\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0437\u043e\u0440 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u043e\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; Apache Paimon. \u041c\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 streamhouse-\u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0441\u043d\u043e\u0432 Apache Paimon \u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 &#171;\u043f\u043e\u0436\u0435\u043d\u0438\u0442\u044c&#187; \u0431\u0430\u0442\u0447 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u043c.\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435: \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e data-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439: \u043a\u043b\u0438\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043b\u043e\u0433\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0434\u0430\u0442\u0430-\u0441\u0430\u0439\u0435\u043d\u0442\u0438\u0441\u0442\u044b \u0436\u0434\u0443\u0442 \u0441\u0432\u0435\u0436\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041c\u0435\u0436\u0434\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: Kafka \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, Flink \u0438\u043b\u0438 Spark Streaming \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, HDFS \u0438\u043b\u0438 S3 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u043e\u0434\u0435 ClickHouse \u0438\u043b\u0438 Snowflake \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.\u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 &#171;data swamp&#187; &#8212; \u0431\u043e\u043b\u043e\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 &#171;\u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043d\u0430\u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435?&#187; \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432.Apache Paimon \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u043b\u0443\u0447\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432: \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0442\u0447-\u0441\u0438\u0441\u0442\u0435\u043c. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.\u041a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043f\u043e\u0447\u0435\u043c\u0443 streaming \u0438 batch \u0436\u0438\u0432\u0443\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0440\u0435\u0448\u0430\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0434\u0430\u043b\u044c\u0448\u0435. \u0418\u0445 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0443\u0441\u043f\u0435\u0445\u0430 &#8212; \u044d\u0442\u043e latency (\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 &#8212; \u0441\u043e\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u0441\u0435 \u0440\u0430\u0437\u043e\u043c. \u0418\u0445 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 &#8212; throughput (\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c), \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0437\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u042d\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u043b\u0438 \u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c. \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 append-only \u043b\u043e\u0433\u0430\u0445, \u0433\u0434\u0435 \u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u0430\u043c\u0438: \u043b\u0438\u0431\u043e \u0432\u044b \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0430\u0434\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u041b\u044f\u043c\u0431\u0434\u0430-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0432 2010-\u0445, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b &#8212; speed layer \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 batch layer \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 &#8212; \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Apache PaimonApache Paimon \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u0434\u0438\u043b\u0435\u043c\u043c\u0443 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 LSM-tree (Log-Structured Merge-tree) \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 lakehouse \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435.\u041d\u0430\u0447\u043d\u0435\u043c \u0441 LSM-tree: \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0430 \u0435\u0449\u0435 \u0432 1996 \u0433\u043e\u0434\u0443, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0448\u043b\u0430 \u0441\u0432\u043e\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043b\u043e\u0433, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0435\u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f.\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0432\u044b \u0445\u0432\u0430\u0442\u0430\u0435\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043b\u0438\u0441\u0442\u043e\u043a \u0438 \u043f\u0438\u0448\u0435\u0442\u0435. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b \u0441\u0430\u0434\u0438\u0442\u0435\u0441\u044c \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u043d\u043e\u0442 (\u0438\u043b\u0438 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0443 it-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 Obsidian), \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044f \u043f\u043e \u0442\u0435\u043c\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435. LSM-tree \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443: \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 &#171;\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a&#187; (Level 0), \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432 &#171;\u0447\u0438\u0441\u0442\u043e\u0432\u0438\u043a&#187; (Level 1, 2, &#8230;).Lakehouse \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 &#8212; \u0443\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 ACID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 data lake &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0439 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0442 \u0441\u0445\u0435\u043c\u044b, \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. Lakehouse \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0439 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.Paimon \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 LSM-tree \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 SQL-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c &#8212; \u0438 \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 &#8212; \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f (\u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438), \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435).\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Paimon\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Apache Paimon \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.\u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 Paimon, \u043e\u043d\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 MemTable (\u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u0432 ScyllaDB). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0431\u0430\u0442\u0447\u0438, \u0447\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 MemTable \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 128-256 \u041c\u0411), \u043e\u043d\u0430 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a \u043a\u0430\u043a \u0444\u0430\u0439\u043b Level 0.\u0424\u0430\u0439\u043b\u044b Level 0 &#8212; \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043d\u044d\u043f\u0448\u043e\u0442\u044b MemTable, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043e\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (\u043e\u0431\u044b\u0447\u043d\u043e Parquet \u0438\u043b\u0438 ORC). \u041e\u043d\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435, \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u043a\u043b\u044e\u0447\u0435\u0439. \u041d\u043e &#8212; \u0438 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e &#8212; \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. \u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443: \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u043d\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f.\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u043f\u0440\u0438\u0432\u0435\u0442 ScyllaDB). \u041e\u043d \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0440\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 Level 0 \u0438 \u0441\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 Level 1, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f merge-\u043b\u043e\u0433\u0438\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439). \u0424\u0430\u0439\u043b\u044b Level 1, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 Level 2, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 10 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.\u042d\u0442\u0430 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 write amplification (&#171;\u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438&#187;). \u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 B-tree \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0446\u0435\u043b\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0435 \u0434\u0435\u0440\u0435\u0432\u0430. \u0412 LSM-tree \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 SSD \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0442\u0438\u043f\u0430 S3.\u041d\u043e \u043a\u0430\u043a \u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435? \u0417\u0434\u0435\u0441\u044c Paimon \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0435\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0411\u043b\u0443\u043c\u0430 &#8212; \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c &#171;\u044d\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u0435&#187; \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0430\u043c \u0444\u0430\u0439\u043b. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u043d\u0438\u0436\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0434\u0438\u0441\u043a\u0443.Unified Changelog: \u044f\u0434\u0440\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u041e\u0434\u043d\u0430 \u0438\u0437 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Paimon &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f unified changelog. \u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 changelog (\u0436\u0443\u0440\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439) \u0438 table storage (\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435) &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Kafka \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e Hive\/Iceberg \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 &#8212; \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u0430\u044f \u0431\u043e\u043b\u044c.\u0412 Paimon changelog \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 changelog. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c changelog \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b LSM-tree. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438? \u041a\u043e\u0433\u0434\u0430 \u0444\u0430\u0439\u043b\u044b \u0441\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, Paimon \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b. \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 changelog.\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. Batch-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u0438\u0434\u044f\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043d\u044d\u043f\u0448\u043e\u0442 &#8212; \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. Streaming-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 changelog \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c: streaming \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0432\u0438\u0434\u044f\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0438\u0434\u044f\u0442 batch \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u0440\u043c\u0435. \u0421\u0430\u043c\u0430\u044f \u0431\u043b\u0438\u0437\u043a\u0430\u044f \u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0430 &#8212; \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438. Batch-\u0440\u0435\u0436\u0438\u043c &#8212; \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u043a\u043d\u0438\u0433\u0443 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0433\u043b\u0430\u0432\u044b. Streaming-\u0440\u0435\u0436\u0438\u043c &#8212; \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0430\u0432\u043a\u0430\u043c\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430: &#171;\u0432 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435 3 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0441\u043b\u043e\u0432\u043e X \u043d\u0430 Y&#187;, &#171;\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444 \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0430 5&#187;. \u041e\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0434\u0430\u044e\u0442 \u0432\u0430\u043c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438: \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Paimon, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0435\u0433\u043e \u0441 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 Paimon \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0445, \u0430 \u0433\u0434\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.\u041d\u0430\u0447\u043d\u0435\u043c \u0441 Apache Iceberg \u0438 Delta Lake &#8212; \u0434\u0432\u0443\u0445 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 open-source lakehouse \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u041e\u0431\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f batch-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c streaming \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u042d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u0432 \u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435: \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 snapshot-based \u043f\u043e\u0434\u0445\u043e\u0434, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043d\u044d\u043f\u0448\u043e\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0414\u043b\u044f batch-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0434\u043b\u044f streaming \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 Iceberg\/Delta &#8212; \u044d\u0442\u043e \u043c\u0438\u043d\u0443\u0442\u044b, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Paimon \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u043a\u0443\u043d\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443.\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Iceberg \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HMS \u0438\u043b\u0438 Nessie), \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-485562","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485562","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=485562"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485562\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}