[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-834":3,"consumer-news-interaction-834":39,"consumer-news-related-834":42},{"detail":4,"item":35},{"card":5,"schemaVersion":22,"fields":23,"content":29},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":15,"href":16,"sourceName":12,"meta":17,"metrics":19,"tags":20,"resolved":21},"NEWS_ARTICLE:834","news","NEWS_ARTICLE",834,"资讯","用 Apache SeaTunnel 同步 DynamoDB 到 Redis，一个配置文件就够","博客园","作者：Ricardo Ferreira 编译：Debra Chen 假设你把客户数据存储在 Amazon DynamoDB 中，作为应用的唯一数据源（single source of truth）。但如今你需要同样的数据放在 Redis 里，进行快速缓存、实时分析，或是为向量搜索推荐引擎赋能。举例来","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F3195851\u002F202609\u002F3195851-20260902145155710-759131565.jpg","","\u002Fnews\u002F834",[18],"2026",{},[],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":24,"summary":13,"description":13,"publishTime":25,"updateTime":26,"sourceUrl":27,"language":28},"ApacheSeaTunnel","2026-09-02T15:07","2026-09-02T20:37:48","https:\u002F\u002Fwww.cnblogs.com\u002Fseatunnel\u002Fp\u002F22808204","中文",{"format":30,"policy":31,"normalized":21,"html":32,"text":33,"wordCount":34,"hasBody":21},"HTML","NEWS_CONTENT_V1","\u003Cp>作者：Ricardo Ferreira\u003Cbr>\n  编译：Debra Chen\u003C\u002Fp>\n\u003Cp>假设你把客户数据存储在 Amazon DynamoDB 中，作为应用的唯一数据源（single source of truth）。但如今你需要同样的数据放在 Redis 里，进行快速缓存、实时分析，或是为向量搜索推荐引擎赋能。举例来说，DynamoDB 中这张名为 \u003Ccode>mySourceTable\u003C\u002Fcode> 的表当前包含两条数据记录。\u003C\u002Fp>\n\u003Cp>\u003Cimg alt=\"\" src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F3195851\u002F202609\u002F3195851-20260902145155710-759131565.jpg?w=720&amp;quality=65&amp;strip=all\">\u003C\u002Fp>\n\u003Cp>那么这个任务的挑战在哪呢？如何在不大写一堆代码的情况下，让两边保持同步？\u003C\u002Fp>\n\u003Cp>就我个人而言，我最理想的方案是使用 \u003Cstrong>Redis Data Integration（RDI）\u003C\u002Fstrong>，但遗憾的是，在撰写本文时，RDI 还不支持把 Amazon DynamoDB 作为数据源。这就让开发者只剩下两个选择：自己编写复杂的数据集成管道，或者投入昂贵（而且往往溢价过高）的 ETL 解决方案。这两个选项都不怎么让人满意。\u003C\u002Fp>\n\u003Cp>但还有另一条路。\u003C\u002Fp>\n\u003Cp>那就是 \u003Cstrong>Apache SeaTunnel\u003C\u002Fstrong>——一个开源数据集成项目，它让数据同步变得像写一个配置文件一样简单。在这篇博客中，我会深入介绍这个项目，并一步步讲解如何把数据从 Amazon DynamoDB 同步到 Redis。\u003C\u002Fp>\n\u003Ch2>Apache SeaTunnel：你的开源数据管道好帮手\u003C\u002Fh2>\n\u003Cp>Apache SeaTunnel 是一个多模态、高性能、分布式的海量数据集成工具，同时支持批处理和流式两种模式。你可以把它想象成你数据系统的\"万能翻译官\"——它精通 DynamoDB、Redis 以及其他 100 多种数据系统。\u003C\u002Fp>\n\u003Cp>在这个场景下，SeaTunnel 的突出优势在于：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>零代码\u003C\u002Fstrong>：用简单的配置文件即可定义你的数据管道\u003C\u002Fli>\n \u003Cli>\u003Cstrong>分布式\u003C\u002Fstrong>：当数据增长时，同步可横向扩展\u003C\u002Fli>\n \u003Cli>\u003Cstrong>容错\u003C\u002Fstrong>：内置 checkpoint 机制，确保数据不丢失\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>你可以用两种不同的配置方式使用 SeaTunnel：\u003Cstrong>单机模式\u003C\u002Fstrong>（standalone），用于一次性的数据搬运；或者\u003Cstrong>集群模式\u003C\u002Fstrong>（cluster），它能搭建一套常驻在线的数据管道基础设施，随时准备执行新任务。\u003C\u002Fp>\n\u003Ch3>方案一：快速上手（单机模式）\u003C\u002Fh3>\n\u003Cp>这个方案非常适合一次性迁移、本地开发或定时批处理任务。一条命令，搞定一切。\u003C\u002Fp>\n\u003Cp>第一步，创建你的管道配置文件（\u003Ccode>jobs\u002Fmy.config\u003C\u002Fcode>）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>env {\n  parallelism = 1\n  job.mode = \"BATCH\"\n}\nsource {\n  Amazondynamodb {\n    url = \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\"\n    region = \"us-east-1\"\n    access_key_id = \"YOUR_ACCESS_KEY\"\n    secret_access_key = \"YOUR_SECRET_KEY\"\n    table = \"mySourceTable\"\n    schema = {\n      fields {\n        customerId = int\n        customerName = string\n        address = string\n      }\n    }\n  }\n}\nsink {\n  Redis {\n    host = host.docker.internal  # 或者你的 Redis 主机地址\n    port = 6379\n    support_custom_key = true\n    key = \"customer:{customerId}\"\n    data_type = hash\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>用一条 Docker 命令即可运行：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run --rm -it \\\n  -v $(pwd)\u002Fjobs:\u002Fconfig \\\n  apache\u002Fseatunnel:2.3.12 \\\n  .\u002Fbin\u002Fseatunnel.sh -m local -c \u002Fconfig\u002Fmy.config\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这条命令会启动一个新容器，里面运行一个单机模式 SeaTunnel 实例，执行 \u003Ccode>my.config\u003C\u002Fcode> 文件中描述的任务。你会看到类似下面的输出：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>2026-01-09 16:57:50,786 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml' from System property 'seatunnel.config'\n2026-01-09 16:57:50,788 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml\n2026-01-09 16:57:50,789 INFO  [o.a.s.e.c.c.SeaTunnelConfig   ] [main] - seatunnel.home is \u002Fopt\u002Fseatunnel\n2026-01-09 16:57:50,830 INFO  [amlSeaTunnelDomConfigProcessor] [main] - Dynamic slot is enabled, the schedule strategy is set to REJECT\n2026-01-09 16:57:50,830 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml' from System property 'hazelcast.config'\n2026-01-09 16:57:50,830 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml\n2026-01-09 16:57:50,962 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-client.yaml' from System property 'hazelcast.client.config'\n2026-01-09 16:57:50,962 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-client.yaml\n2026-01-09 16:57:50,985 WARN  [c.h.i.AddressPicker           ] [main] - [LOCAL] [seatunnel-420804] [5.1] You configured your member address as host name. Please be aware of that your dns can be spoofed. Make sure that your dns configurations are correct.\n2026-01-09 16:57:50,985 INFO  [c.h.i.AddressPicker           ] [main] - [LOCAL] [seatunnel-420804] [5.1] Resolving domain name 'localhost' to address(es): [127.0.0.1, 0:0:0:0:0:0:0:1]\n2026-01-09 16:57:50,986 INFO  [c.h.i.AddressPicker           ] [main] - [LOCAL] [seatunnel-420804] [5.1] Interfaces is disabled, trying to pick one address from TCP-IP config addresses: [localhost\u002F127.0.0.1, localhost\u002F0:0:0:0:0:0:0:1]\nSLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".\nSLF4J: Defaulting to no-operation (NOP) logger implementation\nSLF4J: See http:\u002F\u002Fwww.slf4j.org\u002Fcodes.html#StaticLoggerBinder for further details.\n2026-01-09 16:57:51,189 INFO  [o.a.s.e.s.SeaTunnelServer     ] [main] - SeaTunnel server start...\n2026-01-09 16:57:51,191 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Based on Hazelcast IMDG version: 5.1.0 (20220228 - 21f20e7)\n2026-01-09 16:57:51,191 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Cluster name: seatunnel-420804\n2026-01-09 16:57:51,191 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] \n\n _____               _____                             _ \n\u002F  ___|             |_   _|                           | |\n\\ `--.   ___   __ _   | |   _   _  _ __   _ __    ___ | |\n `--. \\ \u002F _ \\ \u002F _` |  | |  | | | || '_ \\ | '_ \\  \u002F _ \\| |\n\u002F\\__\u002F \u002F|  __\u002F| (_| |  | |  | |_| || | | || | | ||  __\u002F| |\n\\____\u002F  \\___| \\__,_|  \\_\u002F   \\__,_||_| |_||_| |_| \\___||_|\n\n\n2026-01-09 16:57:51,191 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Copyright © 2021-2024 The Apache Software Foundation. Apache SeaTunnel, SeaTunnel, and its feather logo are trademarks of The Apache Software Foundation.\n2026-01-09 16:57:51,191 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Integrity Checker is disabled. Fail-fast on corrupted executables will not be performed.\nTo enable integrity checker do one of the following: \n  - Change member config using Java API: config.setIntegrityCheckerEnabled(true);\n  - Change XML\u002FYAML configuration property: Set hazelcast.integrity-checker.enabled to true\n  - Add system property: -Dhz.integritychecker.enabled=true (for Hazelcast embedded, works only when loading config via Config.load)\n  - Add environment variable: HZ_INTEGRITYCHECKER_ENABLED=true (recommended when running container image. For Hazelcast embedded, works only when loading config via Config.load)\n2026-01-09 16:57:51,193 INFO  [c.h.system                    ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] The Jet engine is disabled.\nTo enable the Jet engine on the members, do one of the following:\n  - Change member config using Java API: config.getJetConfig().setEnabled(true)\n  - Change XML\u002FYAML configuration property: Set hazelcast.jet.enabled to true\n  - Add system property: -Dhz.jet.enabled=true (for Hazelcast embedded, works only when loading config via Config.load)\n  - Add environment variable: HZ_JET_ENABLED=true (recommended when running container image. For Hazelcast embedded, works only when loading config via Config.load)\n2026-01-09 16:57:51,331 INFO  [c.h.s.security                ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Enable DEBUG\u002FFINE log level for log category com.hazelcast.system.security  or use -Dhazelcast.security.recommendations system property to see 🔒 security recommendations and the status of current config.\n2026-01-09 16:57:51,392 INFO  [o.a.s.e.s.SeaTunnelNodeContext] [main] - Using LiteNodeDropOutTcpIpJoiner TCP\u002FIP discovery\n2026-01-09 16:57:51,393 WARN  [c.h.c.CPSubsystem             ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] CP Subsystem is not enabled. CP data structures will operate in UNSAFE mode! Please note that UNSAFE mode will not provide strong consistency guarantees.\n2026-01-09 16:57:51,462 INFO  [.c.c.DefaultClassLoaderService] [main] - start classloader service with cache mode\n2026-01-09 16:57:51,464 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml' from System property 'seatunnel.config'\n2026-01-09 16:57:51,464 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml\n2026-01-09 16:57:51,466 INFO  [amlSeaTunnelDomConfigProcessor] [main] - Dynamic slot is enabled, the schedule strategy is set to REJECT\n2026-01-09 16:57:51,466 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml' from System property 'hazelcast.config'\n2026-01-09 16:57:51,466 INFO  [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml\n2026-01-09 16:57:51,471 WARN  [o.a.s.e.s.TaskExecutionService] [pool-3-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] The Node is not ready yet, Node state STARTING,looking forward to the next scheduling\n2026-01-09 16:57:51,471 INFO  [o.a.s.e.s.TaskExecutionService] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Created new BusWork : 1257526338\n2026-01-09 16:57:51,474 WARN  [a.s.e.s.s.s.DefaultSlotService] [hz.main.seaTunnel.slotService.thread] - failed send heartbeat to resource manager, will retry later. this address: [localhost]:5801\n2026-01-09 16:57:51,475 INFO  [o.a.s.e.s.CoordinatorService  ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Start pending job schedule thread\n2026-01-09 16:57:51,554 WARN  [o.a.h.u.NativeCodeLoader      ] [main] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n2026-01-09 16:57:51,607 INFO  [o.a.s.e.s.CoordinatorService  ] [pool-7-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] \n***********************************************\n     CoordinatorService Thread Pool Status\n***********************************************\nactiveCount               :                   1\ncorePoolSize              :                  10\nmaximumPoolSize           :          2147483647\npoolSize                  :                   1\ncompletedTaskCount        :                   0\ntaskCount                 :                   1\n***********************************************\n\n2026-01-09 16:57:51,612 INFO  [o.a.s.e.s.JettyService        ] [main] - SeaTunnel REST service will start on port 8080\n2026-01-09 16:57:51,617 INFO  [o.a.s.s.o.e.j.u.log           ] [main] - Logging initialized @1069ms to org.apache.seatunnel.shade.org.eclipse.jetty.util.log.Slf4jLog\n2026-01-09 16:57:51,643 WARN  [a.s.s.o.e.j.s.h.ContextHandler] [main] - Empty contextPath\n2026-01-09 16:57:51,652 INFO  [o.a.s.s.o.e.j.s.Server        ] [main] - jetty-9.4.56.v20240826; built: 2024-08-26T17:15:05.868Z; git: ec6782ff5ead824dabdcf47fa98f90a4aedff401; jvm 1.8.0_342-b07\n2026-01-09 16:57:51,665 INFO  [o.a.s.s.o.e.j.s.session       ] [main] - DefaultSessionIdManager workerName=node0\n2026-01-09 16:57:51,665 INFO  [o.a.s.s.o.e.j.s.session       ] [main] - No SessionScavenger set, using defaults\n2026-01-09 16:57:51,666 INFO  [o.a.s.s.o.e.j.s.session       ] [main] - node0 Scavenging every 660000ms\n2026-01-09 16:57:51,727 INFO  [a.s.s.o.e.j.s.h.ContextHandler] [main] - Started o.a.s.s.o.e.j.s.ServletContextHandler@7069f076{\u002F,null,AVAILABLE}\n2026-01-09 16:57:51,731 INFO  [.s.s.o.e.j.s.AbstractConnector] [main] - Started ServerConnector@6e31d989{HTTP\u002F1.1, (http\u002F1.1)}{0.0.0.0:8080}\n2026-01-09 16:57:51,732 INFO  [o.a.s.s.o.e.j.s.Server        ] [main] - Started @1184ms\n2026-01-09 16:57:51,747 INFO  [c.h.i.d.Diagnostics           ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Diagnostics disabled. To enable add -Dhazelcast.diagnostics.enabled=true to the JVM arguments.\n2026-01-09 16:57:51,749 INFO  [c.h.c.LifecycleService        ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is STARTING\nMembers {size:1, ver:1} [\n        Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node] [active master] this\n]\n\n2026-01-09 16:57:52,775 INFO  [o.a.s.e.s.CoordinatorService  ] [pool-5-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] This node become a new active master node, begin init coordinator service\n2026-01-09 16:57:52,779 INFO  [c.h.c.LifecycleService        ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is STARTED\n2026-01-09 16:57:52,797 INFO  [o.a.s.e.s.CoordinatorService  ] [pool-5-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] Loaded event handlers: [org.apache.seatunnel.api.event.LoggingEventHandler@1ebbcf65]\n2026-01-09 16:57:52,803 INFO  [.c.i.s.ClientInvocationService] [main] - hz.client_1 [seatunnel-420804] [5.1] Running with 2 response threads, dynamic=true\n2026-01-09 16:57:52,807 INFO  [.h.i.p.i.PartitionStateManager] [seatunnel-coordinator-service-1] - [localhost]:5801 [seatunnel-420804] [5.1] Initializing cluster partition table arrangement...\n2026-01-09 16:57:52,811 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is STARTING\n2026-01-09 16:57:52,811 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is STARTED\n2026-01-09 16:57:52,814 INFO  [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Trying to connect to cluster: seatunnel-420804\n2026-01-09 16:57:52,815 INFO  [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Trying to connect to [localhost]:5801\n2026-01-09 16:57:52,823 INFO  [.p.t.AuthenticationMessageTask] [hz.main.priority-generic-operation.thread-0] - [localhost]:5801 [seatunnel-420804] [5.1] Received auth from Connection[id=1, \u002F127.0.0.1:5801-&gt;\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=true, connectionType=JVM, planeIndex=-1], successfully authenticated, clientUuid: 3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, client name: hz.client_1, client version: 5.1\n2026-01-09 16:57:52,824 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is CLIENT_CONNECTED\n2026-01-09 16:57:52,824 INFO  [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Authenticated with server [localhost]:5801:579e9374-7d47-4d91-80d5-c7a9155d42d0, server version: 5.1, local address: \u002F127.0.0.1:45255\n2026-01-09 16:57:52,825 INFO  [c.h.i.d.Diagnostics           ] [main] - hz.client_1 [seatunnel-420804] [5.1] Diagnostics disabled. To enable add -Dhazelcast.diagnostics.enabled=true to the JVM arguments.\n2026-01-09 16:57:52,829 INFO  [c.h.c.i.s.ClientClusterService] [hz.client_1.event-10] - hz.client_1 [seatunnel-420804] [5.1] \n\nMembers [1] {\n        Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node]\n}\n\n2026-01-09 16:57:52,841 INFO  [.c.i.s.ClientStatisticsService] [main] - Client statistics is enabled with period 5 seconds.\n2026-01-09 16:57:52,858 INFO  [o.a.s.c.s.u.ConfigBuilder     ] [main] - Loading config file from path: \u002Fconfig\u002Fmy.config\n2026-01-09 16:57:52,951 INFO  [o.a.s.c.s.u.ConfigShadeUtils  ] [main] - Load config shade spi: [base64]\n2026-01-09 16:57:52,967 INFO  [o.a.s.c.s.u.ConfigBuilder     ] [main] - Parsed config file: \n{\n    \"env\" : {\n        \"parallelism\" : 1,\n        \"job.mode\" : \"BATCH\"\n    },\n    \"source\" : [\n        {\n            \"url\" : \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\",\n            \"region\" : \"us-east-1\",\n            \"access_key_id\" : \"&lt;REDACTED&gt;\",\n            \"secret_access_key\" : \"&lt;REDACTED&gt;\",\n            \"table\" : \"mySourceTable\",\n            \"schema\" : {\n                \"fields\" : {\n                    \"customerId\" : \"int\",\n                    \"customerName\" : \"string\",\n                    \"address\" : \"string\"\n                }\n            },\n            \"plugin_name\" : \"Amazondynamodb\"\n        }\n    ],\n    \"sink\" : [\n        {\n            \"host\" : \"host.docker.internal\",\n            \"port\" : 6379,\n            \"support_custom_key\" : true,\n            \"key\" : \"customer:{customerId}\",\n            \"data_type\" : \"hash\",\n            \"plugin_name\" : \"Redis\"\n        }\n    ]\n}\n\n2026-01-09 16:57:52,971 INFO  [p.MultipleTableJobConfigParser] [main] - add common jar in plugins :[]\n2026-01-09 16:57:52,978 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors\n2026-01-09 16:57:52,980 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar]\n2026-01-09 16:57:52,980 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar]\n2026-01-09 16:57:52,982 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors\n2026-01-09 16:57:52,985 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors\n2026-01-09 16:57:52,986 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar]\n2026-01-09 16:57:52,986 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar]\n2026-01-09 16:57:52,988 INFO  [p.MultipleTableJobConfigParser] [main] - start generating all sources.\n2026-01-09 16:57:53,003 INFO  [o.a.s.a.t.f.FactoryUtil       ] [main] - get the CatalogTable from source AmazonDynamodb: .default.default.default\n2026-01-09 16:57:53,008 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSource Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors\n2026-01-09 16:57:53,011 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar]\n2026-01-09 16:57:53,011 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar]\n2026-01-09 16:57:53,012 INFO  [p.MultipleTableJobConfigParser] [main] - start generating all transforms.\n2026-01-09 16:57:53,012 INFO  [p.MultipleTableJobConfigParser] [main] - start generating all sinks.\n2026-01-09 16:57:53,013 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors\n2026-01-09 16:57:53,014 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar]\n2026-01-09 16:57:53,014 INFO  [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar]\n2026-01-09 16:57:53,024 INFO  [o.a.s.a.t.f.FactoryUtil       ] [main] - Create sink 'Redis' with upstream input catalog-table[database: default, schema: default, table: default]\n2026-01-09 16:57:53,042 INFO  [o.a.s.e.c.j.ClientJobProxy    ] [main] - Start submit job, job id: 1062052604328017921, with plugin jar [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar, file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar]\n2026-01-09 16:57:53,047 INFO  [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - Init ResourceManager\n2026-01-09 16:57:53,047 INFO  [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - initWorker... \n2026-01-09 16:57:53,047 INFO  [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - init live nodes: [[localhost]:5801]\n2026-01-09 16:57:53,048 INFO  [.e.s.r.AbstractResourceManager] [SeaTunnel-CompletableFuture-Thread-2] - received new worker register: [localhost]:5801\n2026-01-09 16:57:53,152 INFO  [o.a.s.c.s.r.c.RedisParameters ] [hz.main.seaTunnel.task.thread-4] - Try to get redis version information from the jedis.info() method\n2026-01-09 16:57:53,152 INFO  [o.a.s.c.s.r.c.RedisParameters ] [hz.main.seaTunnel.task.thread-4] - The version of Redis is :8.4.0\n2026-01-09 16:57:53,154 INFO  [a.s.a.s.m.MultiTableSinkWriter] [hz.main.seaTunnel.task.thread-4] - init multi table sink writer, queue size: 1\n2026-01-09 16:57:53,233 INFO  [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-12] - log event: ReaderOpenEvent(createdTime=1767977873233, jobId=1062052604328017921, eventType=LIFECYCLE_READER_OPEN)\n2026-01-09 16:57:53,402 INFO  [.s.t.SourceSplitEnumeratorTask] [hz.main.seaTunnel.task.thread-4] - received reader register, readerID: TaskLocation{taskGroupLocation=TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}, taskID=1000200000000, index=0}\n2026-01-09 16:57:53,429 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-9] - checkpoint is disabled, because in batch mode and 'checkpoint.interval' of env is missing.\n2026-01-09 16:57:53,506 INFO  [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits\n2026-01-09 16:57:53,506 INFO  [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits\n2026-01-09 16:57:53,529 INFO  [.s.t.SourceSplitEnumeratorTask] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - received enough reader, starting enumerator...\n2026-01-09 16:57:53,530 INFO  [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assigning org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@36fe5b1d to 0 reader.\n2026-01-09 16:57:53,530 INFO  [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assigning org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@81bd425 to 0 reader.\n2026-01-09 16:57:53,530 INFO  [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assign splits [org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@36fe5b1d, org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@81bd425] to reader 0\n2026-01-09 16:57:53,533 INFO  [a.s.AmazonDynamoDBSourceReader] [hz.main.generic-operation.thread-21] - Reader [0] received noMoreSplit event.\n2026-01-09 16:57:53,934 INFO  [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits\n2026-01-09 16:57:53,934 INFO  [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - Closed the bounded amazonDynamodb source\n2026-01-09 16:57:53,941 INFO  [.s.e.s.c.CheckpointCoordinator] [hz.main.generic-operation.thread-23] - skip schedule trigger checkpoint because checkpoint type is COMPLETED_POINT_TYPE\n2026-01-09 16:57:53,943 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - wait checkpoint completed: 9223372036854775807\n2026-01-09 16:57:55,974 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - pending checkpoint(9223372036854775807\u002F1@1062052604328017921) notify finished!\n2026-01-09 16:57:55,974 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - start notify checkpoint completed, job id: 1062052604328017921, pipeline id: 1, checkpoint id:9223372036854775807\n2026-01-09 16:57:55,979 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - start clean pending checkpoint cause CheckpointCoordinator completed.\n2026-01-09 16:57:55,979 INFO  [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - Turn checkpoint_state_1062052604328017921_1 state from null to FINISHED\n2026-01-09 16:57:55,987 INFO  [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000100000000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}\n2026-01-09 16:57:55,987 INFO  [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-32] - log event: EnumeratorCloseEvent(createdTime=1767977875987, jobId=1062052604328017921, eventType=LIFECYCLE_ENUMERATOR_CLOSE)\n2026-01-09 16:57:55,998 INFO  [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - [localhost]:5801 [seatunnel-420804] [5.1] taskGroup TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1} complete with FINISHED\n2026-01-09 16:57:55,998 INFO  [o.a.s.e.s.TaskExecutionService] [hz.main.seaTunnel.task.thread-5] - [localhost]:5801 [seatunnel-420804] [5.1] Task TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1} complete with state FINISHED\n2026-01-09 16:57:55,998 INFO  [o.a.s.e.s.CoordinatorService  ] [hz.main.seaTunnel.task.thread-5] - [localhost]:5801 [seatunnel-420804] [5.1] Received task end from execution TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}, state FINISHED\n2026-01-09 16:57:56,000 INFO  [o.a.s.e.s.d.p.PhysicalVertex  ] [hz.main.seaTunnel.task.thread-5] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] turned from state RUNNING to FINISHED.\n2026-01-09 16:57:56,000 INFO  [o.a.s.e.s.d.p.PhysicalVertex  ] [hz.main.seaTunnel.task.thread-5] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] state process is stopped\n2026-01-09 16:57:56,000 INFO  [o.a.s.e.s.d.p.SubPlan         ] [seatunnel-coordinator-service-8] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] future complete with state FINISHED\n2026-01-09 16:57:56,039 INFO  [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-33] - log event: ReaderCloseEvent(createdTime=1767977876039, jobId=1062052604328017921, eventType=LIFECYCLE_READER_CLOSE)\n2026-01-09 16:57:56,040 INFO  [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000200000000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}\n2026-01-09 16:57:56,076 INFO  [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000200010000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}\n2026-01-09 16:57:56,077 INFO  [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-34] - log event: WriterCloseEvent(createdTime=1767977876076, jobId=1062052604328017921, eventType=LIFECYCLE_WRITER_CLOSE)\n2026-01-09 16:57:56,079 INFO  [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskGroup TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} complete with FINISHED\n2026-01-09 16:57:56,079 INFO  [o.a.s.e.s.TaskExecutionService] [hz.main.seaTunnel.task.thread-2] - [localhost]:5801 [seatunnel-420804] [5.1] Task TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} complete with state FINISHED\n2026-01-09 16:57:56,079 INFO  [o.a.s.e.s.CoordinatorService  ] [hz.main.seaTunnel.task.thread-2] - [localhost]:5801 [seatunnel-420804] [5.1] Received task end from execution TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}, state FINISHED\n2026-01-09 16:57:56,080 INFO  [o.a.s.e.s.d.p.PhysicalVertex  ] [hz.main.seaTunnel.task.thread-2] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] turned from state RUNNING to FINISHED.\n2026-01-09 16:57:56,080 INFO  [o.a.s.e.s.d.p.PhysicalVertex  ] [hz.main.seaTunnel.task.thread-2] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] state process is stopped\n2026-01-09 16:57:56,080 INFO  [o.a.s.e.s.d.p.SubPlan         ] [seatunnel-coordinator-service-8] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] future complete with state FINISHED\n2026-01-09 16:57:56,080 INFO  [o.a.s.e.s.d.p.SubPlan         ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] will end with state FINISHED\n2026-01-09 16:57:56,081 INFO  [o.a.s.e.s.m.JobMaster         ] [hz.main.seaTunnel.task.thread-2] - release the task group resource TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}\n2026-01-09 16:57:56,081 INFO  [o.a.s.e.s.d.p.SubPlan         ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] turned from state RUNNING to FINISHED.\n2026-01-09 16:57:56,081 INFO  [a.s.e.s.s.s.DefaultSlotService] [hz.main.generic-operation.thread-35] - received slot release request, jobID: 1062052604328017921, slot: SlotProfile{worker=[localhost]:5801, slotID=2, ownerJobID=1062052604328017921, assigned=true, resourceProfile=ResourceProfile{cpu=CPU{core=0}, heapMemory=Memory{bytes=0}}, sequence='e992c180-0d29-42db-ac3f-249a1130c0b1'}\n2026-01-09 16:57:56,105 INFO  [o.a.s.e.s.m.JobMaster         ] [seatunnel-coordinator-service-8] - release the pipeline Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] resource\n2026-01-09 16:57:56,105 INFO  [a.s.e.s.s.s.DefaultSlotService] [hz.main.generic-operation.thread-39] - received slot release request, jobID: 1062052604328017921, slot: SlotProfile{worker=[localhost]:5801, slotID=1, ownerJobID=1062052604328017921, assigned=true, resourceProfile=ResourceProfile{cpu=CPU{core=0}, heapMemory=Memory{bytes=0}}, sequence='e992c180-0d29-42db-ac3f-249a1130c0b1'}\n2026-01-09 16:57:56,106 INFO  [o.a.s.e.s.d.p.SubPlan         ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] state process is stop\n2026-01-09 16:57:56,106 INFO  [o.a.s.e.s.d.p.PhysicalPlan    ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] future complete with state FINISHED\n2026-01-09 16:57:56,107 INFO  [o.a.s.e.s.d.p.PhysicalPlan    ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921) turned from state RUNNING to FINISHED.\n2026-01-09 16:57:56,107 INFO  [o.a.s.e.s.d.p.PhysicalPlan    ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921) state process is stop\n2026-01-09 16:57:56,116 INFO  [o.a.s.a.e.LoggingEventHandler ] [seatunnel-coordinator-service-7] - log event: JobStateEvent(jobId=1062052604328017921, jobName=SeaTunnel_Job, jobStatus=FINISHED, createdTime=1767977876116)\n2026-01-09 16:57:56,117 INFO  [o.a.s.e.c.j.ClientJobProxy    ] [main] - Job (1062052604328017921) end with state FINISHED\n2026-01-09 16:57:56,132 INFO  [s.c.s.s.c.ClientExecuteCommand] [main] - \n***********************************************\n           Job Statistic Information\n***********************************************\nStart Time                : 2026-01-09 16:57:52\nEnd Time                  : 2026-01-09 16:57:56\nTotal Time(s)             :                   3\nTotal Read Count          :                   2\nTotal Write Count         :                   2\nTotal Failed Count        :                   0\n***********************************************\n\n2026-01-09 16:57:56,133 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is SHUTTING_DOWN\n2026-01-09 16:57:56,135 INFO  [c.h.i.s.t.TcpServerConnection ] [hz.main.IO.thread-in-1] - [localhost]:5801 [seatunnel-420804] [5.1] Connection[id=1, \u002F127.0.0.1:5801-&gt;\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=false, connectionType=JVM, planeIndex=-1] closed. Reason: Connection closed by the other side\n2026-01-09 16:57:56,135 INFO  [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Removed connection to endpoint: [localhost]:5801:579e9374-7d47-4d91-80d5-c7a9155d42d0, connection: ClientConnection{alive=false, connectionId=1, channel=NioChannel{\u002F127.0.0.1:45255-&gt;localhost\u002F127.0.0.1:5801}, remoteAddress=[localhost]:5801, lastReadTime=2026-01-09 16:57:56.131, lastWriteTime=2026-01-09 16:57:56.117, closedTime=2026-01-09 16:57:56.134, connected server version=5.1}\n2026-01-09 16:57:56,135 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is CLIENT_DISCONNECTED\n2026-01-09 16:57:56,136 INFO  [c.h.c.i.ClientEndpointManager ] [hz.main.event-1] - [localhost]:5801 [seatunnel-420804] [5.1] Destroying ClientEndpoint{connection=Connection[id=1, \u002F127.0.0.1:5801-&gt;\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=false, connectionType=JVM, planeIndex=-1], clientUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, clientName=hz.client_1, authenticated=true, clientVersion=5.1, creationTime=1767977872821, latest clientAttributes=lastStatisticsCollectionTime=1767977872841,enterprise=false,clientType=JVM,clientVersion=5.1,clusterConnectionTimestamp=1767977872816,clientAddress=127.0.0.1,clientName=hz.client_1,credentials.principal=null,os.committedVirtualMemorySize=9714790400,os.freePhysicalMemorySize=2077376512,os.freeSwapSpaceSize=1073737728,os.maxFileDescriptorCount=1048576,os.openFileDescriptorCount=103,os.processCpuTime=4280000000,os.systemLoadAverage=3.26,os.totalPhysicalMemorySize=8321540096,os.totalSwapSpaceSize=1073737728,runtime.availableProcessors=14,runtime.freeMemory=286196824,runtime.maxMemory=477626368,runtime.totalMemory=376438784,runtime.uptime=2297,runtime.usedMemory=90241960, labels=[]}\n2026-01-09 16:57:56,136 INFO  [c.h.c.LifecycleService        ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is SHUTDOWN\n2026-01-09 16:57:56,136 INFO  [s.c.s.s.c.ClientExecuteCommand] [main] - Closed SeaTunnel client......\n2026-01-09 16:57:56,136 INFO  [c.h.c.LifecycleService        ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is SHUTTING_DOWN\n2026-01-09 16:57:56,138 INFO  [c.h.i.p.i.MigrationManager    ] [hz.main.cached.thread-15] - [localhost]:5801 [seatunnel-420804] [5.1] Shutdown request of Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node] [active master] this is handled\n2026-01-09 16:57:56,141 INFO  [c.h.i.i.Node                  ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Shutting down connection manager...\n2026-01-09 16:57:56,142 INFO  [c.h.i.i.Node                  ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Shutting down node engine...\n2026-01-09 16:57:56,149 INFO  [.s.s.o.e.j.s.AbstractConnector] [main] - Stopped ServerConnector@6e31d989{HTTP\u002F1.1, (http\u002F1.1)}{0.0.0.0:8080}\n2026-01-09 16:57:56,149 INFO  [o.a.s.s.o.e.j.s.session       ] [main] - node0 Stopped scavenging\n2026-01-09 16:57:56,150 INFO  [a.s.s.o.e.j.s.h.ContextHandler] [main] - Stopped o.a.s.s.o.e.j.s.ServletContextHandler@7069f076{\u002F,null,STOPPED}\n2026-01-09 16:57:56,151 INFO  [.c.c.DefaultClassLoaderService] [main] - close classloader service\n2026-01-09 16:57:56,152 INFO  [o.a.s.e.s.EventService        ] [event-forwarder-0] - Event forward thread interrupted\n2026-01-09 16:57:56,155 INFO  [c.h.i.i.NodeExtension         ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Destroying node NodeExtension.\n2026-01-09 16:57:56,156 INFO  [c.h.i.i.Node                  ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Hazelcast Shutdown is completed in 18 ms.\n2026-01-09 16:57:56,156 INFO  [c.h.c.LifecycleService        ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is SHUTDOWN\n2026-01-09 16:57:56,156 INFO  [s.c.s.s.c.ClientExecuteCommand] [main] - Closed HazelcastInstance ......\n2026-01-09 16:57:56,156 INFO  [s.c.s.s.c.ClientExecuteCommand] [main] - Closed metrics executor service ......\n2026-01-09 16:57:56,156 INFO  [s.c.s.s.c.ClientExecuteCommand] [SeaTunnel-CompletableFuture-Thread-7] - run shutdown hook because get close signal\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>任务执行完成后，用于执行它的 Docker 容器会被终止，此时你就能在 Redis 中看到写入的数据记录了。\u003C\u002Fp>\n\u003Cp>\u003Cimg alt=\"\" src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F3195851\u002F202609\u002F3195851-20260902145155678-1235224439.jpg?w=720&amp;quality=65&amp;strip=all\">\u003C\u002Fp>\n\u003Cp>正如 SeaTunnel 官方所说，整个过程简单到只需写一个配置文件。当然，要真正吃透 source 和 sink 连接器提供的众多配置项，可能还需要花些时间。你可以点击\u003Ca href=\"https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.12\u002Fconnector-v2\u002Fsource\u002FAmazonDynamodb\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">此处\u003C\u002Fa>查看 Amazon DynamoDB 的配置属性，点击\u003Ca href=\"https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.12\u002Fconnector-v2\u002Fsink\u002FRedis\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">此处\u003C\u002Fa>查看 Redis 的配置属性。\u003C\u002Fp>\n\u003Ch3>方案二：生产级引擎（集群模式）\u003C\u002Fh3>\n\u003Cp>当你需要一套常驻在线的数据管道基础设施，能够处理多个任务、按需扩容，并提供 REST API 访问时，集群模式就是你的选择。\u003C\u002Fp>\n\u003Ch4>第一步：搭建基础设施\u003C\u002Fh4>\n\u003Cp>创建一个 \u003Ccode>docker-compose.yaml\u003C\u002Fcode>，拉起一个完整的 SeaTunnel 集群。它同时也会带上 Redis——在这个用例里，Redis 是数据管道的目标端（sink）。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>version: '3.8'\nservices:\n  seatunnel-master:\n    image: apache\u002Fseatunnel:2.3.12\n    container_name: seatunnel-master\n    environment:\n      - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5\n    volumes:\n      - .\u002Fconfig\u002Fhazelcast-master.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-master.yaml\n      - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml\n    entrypoint: &gt;\n      \u002Fbin\u002Fsh -c \"\n      \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r master\n      \"\n    ports:\n      - \"5801:5801\"\n      - \"8080:8080\"  # REST API 端点\n    networks:\n      seatunnel_network:\n        ipv4_address: 172.16.0.3\n    healthcheck:\n      test: [ \"CMD-SHELL\", \"curl -f http:\u002F\u002Flocalhost:8080\u002Fsystem-monitoring-information || exit 1\" ]\n      interval: 30s\n      timeout: 10s\n      retries: 10\n      start_period: 60s\n\n  seatunnel-worker1:\n    image: apache\u002Fseatunnel:2.3.12\n    container_name: seatunnel-worker1\n    environment:\n      - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5\n    volumes:\n      - .\u002Fconfig\u002Fhazelcast-worker.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-worker.yaml\n      - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml\n    entrypoint: &gt;\n      \u002Fbin\u002Fsh -c \"\n      \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r worker\n      \"\n    depends_on:\n      - seatunnel-master\n    networks:\n      seatunnel_network:\n        ipv4_address: 172.16.0.4\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pgrep -f seatunnel || exit 1\"]\n      interval: 30s\n      timeout: 10s\n      retries: 5\n      start_period: 45s\n\n  seatunnel-worker2:\n    image: apache\u002Fseatunnel:2.3.12\n    container_name: seatunnel-worker2\n    environment:\n      - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5\n    volumes:\n      - .\u002Fconfig\u002Fhazelcast-worker.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-worker.yaml\n      - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml\n    entrypoint: &gt;\n      \u002Fbin\u002Fsh -c \"\n      \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r worker\n      \"\n    depends_on:\n      - seatunnel-master\n    networks:\n      seatunnel_network:\n        ipv4_address: 172.16.0.5\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pgrep -f seatunnel || exit 1\"]\n      interval: 30s\n      timeout: 10s\n      retries: 5\n      start_period: 45s\n\n  redis-database:\n    container_name: redis-database\n    hostname: redis-database\n    image: redis:8.4.0\n    ports:\n      - \"6379:6379\"\n    networks:\n      seatunnel_network:\n        ipv4_address: 172.16.0.2\n    healthcheck:\n      test: [ \"CMD-SHELL\", \"redis-cli ping | grep PONG\" ]\n      interval: 10s\n      retries: 5\n      start_period: 5s\n      timeout: 5s\nnetworks:\n  seatunnel_network:\n    driver: bridge\n    ipam:\n      config:\n        - subnet: 172.16.0.0\u002F24\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>第二步：配置集群\u003C\u002Fh4>\n\u003Cp>创建 \u003Ccode>config\u002Fseatunnel.yaml\u003C\u002Fcode> 以启用 REST API：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>seatunnel:\n  engine:\n    http:\n      enable-http: true\n      port: 8080\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>创建 \u003Ccode>config\u002Fhazelcast-master.yaml\u003C\u002Fcode> 和 \u003Ccode>config\u002Fhazelcast-worker.yaml\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>hazelcast:\n  network:\n    rest-api:\n      enabled: true\n      endpoint-groups:\n        CLUSTER_READ:\n          enabled: true\n        CLUSTER_WRITE:\n          enabled: true\n        HEALTH_CHECK:\n          enabled: true\n        DATA:\n          enabled: true\n    port:\n      auto-increment: true\n      port-count: 100\n      port: 5801\n    join:\n      tcp-ip:\n        enabled: true\n        member-list:\n          - 172.16.0.3\n          - 172.16.0.4\n          - 172.16.0.5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>第三步：启动集群\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>docker compose up -d\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>现在你的 SeaTunnel 集群已运行，包含：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>1 个 Master 节点（协调器 + API 服务器）\u003C\u002Fli>\n \u003Cli>2 个 Worker 节点（实际执行数据管道）\u003C\u002Fli>\n \u003Cli>Redis 数据库（你的 sink 和目标系统）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>第四步：通过 REST API 提交任务\u003C\u002Fh4>\n\u003Cp>接下来是见证奇迹的时刻！用一条简单的 HTTP POST 提交任务：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -X POST http:\u002F\u002Flocalhost:8080\u002Fsubmit-job?jobName=dynamodb-to-redis \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n \"env\": {\n \"parallelism\": 2,\n \"job.mode\": \"BATCH\"\n },\n \"source\": [\n {\n \"plugin_name\": \"Amazondynamodb\",\n \"plugin_output\": \"dynamodb_source\",\n \"url\": \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\",\n \"region\": \"us-east-1\",\n \"access_key_id\": \"YOUR_ACCESS_KEY\",\n \"secret_access_key\": \"YOUR_SECRET_KEY\",\n \"table\": \"mySourceTable\",\n \"schema\": {\n \"fields\": {\n \"customerId\": \"int\",\n \"customerName\": \"string\",\n \"address\": \"string\"\n }\n }\n }\n ],\n \"transform\": [],\n \"sink\": [\n {\n \"plugin_name\": \"Redis\",\n \"host\": \"redis-database\",\n \"port\": 6379,\n \"support_custom_key\": true,\n \"key\": \"customer:{customerId}\",\n \"data_type\": \"hash\"\n }\n ]\n}'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>任务一旦提交，就会立刻开始执行。你可以在 SeaTunnel 提供的 Web 控制台里跟进任务执行情况：访问 \u003Ccode>http:\u002F\u002Flocalhost:8080\u002F#\u002Foverview\u003C\u002Fcode>，然后切换到 \u003Ccode>Jobs\u003C\u002Fcode> 标签页。\u003C\u002Fp>\n\u003Cp>\u003Cimg alt=\"\" src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F3195851\u002F202609\u002F3195851-20260902145155660-1105356348.jpg?w=720&amp;quality=65&amp;strip=all\">\u003C\u002Fp>\n\u003Ch2>总结\u003C\u002Fh2>\n\u003Cp>有了 Apache SeaTunnel，把数据从 Amazon DynamoDB 同步到 Redis 就变成了一件\"配置\"层面的工作。无论你需要一次性迁移，还是一套常驻在线的数据集成管道，Apache SeaTunnel 都有满足你需求的工具。\u003C\u002Fp>\n\u003Cp>使用 SeaTunnel 的妙处在于：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>无需维护代码\u003C\u002Fstrong>——只需简单配置即可使用\u003C\u002Fli>\n \u003Cli>\u003Cstrong>久经实战检验的连接器\u003C\u002Fstrong>——专注于你的业务逻辑\u003C\u002Fli>\n \u003Cli>\u003Cstrong>部署灵活\u003C\u002Fstrong>——无论是笔记本还是生产集群都能跑\u003C\u002Fli>\n \u003Cli>\u003Cstrong>天生可扩展\u003C\u002Fstrong>——可随数据增长横向扩容\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>准备好试一试了吗？建议先用单机模式快速实验一下，等要上生产时再升级到集群模式。\u003C\u002Fp>\n\u003Cul>\n \u003Cli>本地模式部署：\u003Ca href=\"https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Flocally\u002Fdeployment\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Flocally\u002Fdeployment\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>Docker 部署：\u003Ca href=\"https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fdocker\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fdocker\u002F\u003C\u002Fa>\u003C\u002Fli>\n \u003Cli>kubernetes 部署：\u003Ca href=\"https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fkubernetes\u002F\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fkubernetes\u002F\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>","作者：Ricardo Ferreira 编译：Debra Chen 假设你把客户数据存储在 Amazon DynamoDB 中，作为应用的唯一数据源（single source of truth）。但如今你需要同样的数据放在 Redis 里，进行快速缓存、实时分析，或是为向量搜索推荐引擎赋能。举例来说，DynamoDB 中这张名为 mySourceTable 的表当前包含两条数据记录。 那么这个任务的挑战在哪呢？如何在不大写一堆代码的情况下，让两边保持同步？ 就我个人而言，我最理想的方案是使用 Redis Data Integration（RDI），但遗憾的是，在撰写本文时，RDI 还不支持把 Amazon DynamoDB 作为数据源。这就让开发者只剩下两个选择：自己编写复杂的数据集成管道，或者投入昂贵（而且往往溢价过高）的 ETL 解决方案。这两个选项都不怎么让人满意。 但还有另一条路。 那就是 Apache SeaTunnel——一个开源数据集成项目，它让数据同步变得像写一个配置文件一样简单。在这篇博客中，我会深入介绍这个项目，并一步步讲解如何把数据从 Amazon DynamoDB 同步到 Redis。 Apache SeaTunnel：你的开源数据管道好帮手 Apache SeaTunnel 是一个多模态、高性能、分布式的海量数据集成工具，同时支持批处理和流式两种模式。你可以把它想象成你数据系统的\"万能翻译官\"——它精通 DynamoDB、Redis 以及其他 100 多种数据系统。 在这个场景下，SeaTunnel 的突出优势在于： 零代码：用简单的配置文件即可定义你的数据管道 分布式：当数据增长时，同步可横向扩展 容错：内置 checkpoint 机制，确保数据不丢失 你可以用两种不同的配置方式使用 SeaTunnel：单机模式（standalone），用于一次性的数据搬运；或者集群模式（cluster），它能搭建一套常驻在线的数据管道基础设施，随时准备执行新任务。 方案一：快速上手（单机模式） 这个方案非常适合一次性迁移、本地开发或定时批处理任务。一条命令，搞定一切。 第一步，创建你的管道配置文件（jobs\u002Fmy.config）： env { parallelism = 1 job.mode = \"BATCH\" } source { Amazondynamodb { url = \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\" region = \"us-east-1\" access_key_id = \"YOUR_ACCESS_KEY\" secret_access_key = \"YOUR_SECRET_KEY\" table = \"mySourceTable\" schema = { fields { customerId = int customerName = string address = string } } } } sink { Redis { host = host.docker.internal # 或者你的 Redis 主机地址 port = 6379 support_custom_key = true key = \"customer:{customerId}\" data_type = hash } } 用一条 Docker 命令即可运行： docker run --rm -it \\ -v $(pwd)\u002Fjobs:\u002Fconfig \\ apache\u002Fseatunnel:2.3.12 \\ .\u002Fbin\u002Fseatunnel.sh -m local -c \u002Fconfig\u002Fmy.config 这条命令会启动一个新容器，里面运行一个单机模式 SeaTunnel 实例，执行 my.config 文件中描述的任务。你会看到类似下面的输出： 2026-01-09 16:57:50,786 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml' from System property 'seatunnel.config' 2026-01-09 16:57:50,788 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml 2026-01-09 16:57:50,789 INFO [o.a.s.e.c.c.SeaTunnelConfig ] [main] - seatunnel.home is \u002Fopt\u002Fseatunnel 2026-01-09 16:57:50,830 INFO [amlSeaTunnelDomConfigProcessor] [main] - Dynamic slot is enabled, the schedule strategy is set to REJECT 2026-01-09 16:57:50,830 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml' from System property 'hazelcast.config' 2026-01-09 16:57:50,830 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml 2026-01-09 16:57:50,962 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-client.yaml' from System property 'hazelcast.client.config' 2026-01-09 16:57:50,962 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-client.yaml 2026-01-09 16:57:50,985 WARN [c.h.i.AddressPicker ] [main] - [LOCAL] [seatunnel-420804] [5.1] You configured your member address as host name. Please be aware of that your dns can be spoofed. Make sure that your dns configurations are correct. 2026-01-09 16:57:50,985 INFO [c.h.i.AddressPicker ] [main] - [LOCAL] [seatunnel-420804] [5.1] Resolving domain name 'localhost' to address(es): [127.0.0.1, 0:0:0:0:0:0:0:1] 2026-01-09 16:57:50,986 INFO [c.h.i.AddressPicker ] [main] - [LOCAL] [seatunnel-420804] [5.1] Interfaces is disabled, trying to pick one address from TCP-IP config addresses: [localhost\u002F127.0.0.1, localhost\u002F0:0:0:0:0:0:0:1] SLF4J: Failed to load class \"org.slf4j.impl.StaticLoggerBinder\". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http:\u002F\u002Fwww.slf4j.org\u002Fcodes.html#StaticLoggerBinder for further details. 2026-01-09 16:57:51,189 INFO [o.a.s.e.s.SeaTunnelServer ] [main] - SeaTunnel server start... 2026-01-09 16:57:51,191 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Based on Hazelcast IMDG version: 5.1.0 (20220228 - 21f20e7) 2026-01-09 16:57:51,191 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Cluster name: seatunnel-420804 2026-01-09 16:57:51,191 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] _____ _____ _ \u002F ___| |_ _| | | \\ `--. ___ __ _ | | _ _ _ __ _ __ ___ | | `--. \\ \u002F _ \\ \u002F _` | | | | | | || '_ \\ | '_ \\ \u002F _ \\| | \u002F\\__\u002F \u002F| __\u002F| (_| | | | | |_| || | | || | | || __\u002F| | \\____\u002F \\___| \\__,_| \\_\u002F \\__,_||_| |_||_| |_| \\___||_| 2026-01-09 16:57:51,191 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Copyright © 2021-2024 The Apache Software Foundation. Apache SeaTunnel, SeaTunnel, and its feather logo are trademarks of The Apache Software Foundation. 2026-01-09 16:57:51,191 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Integrity Checker is disabled. Fail-fast on corrupted executables will not be performed. To enable integrity checker do one of the following: - Change member config using Java API: config.setIntegrityCheckerEnabled(true); - Change XML\u002FYAML configuration property: Set hazelcast.integrity-checker.enabled to true - Add system property: -Dhz.integritychecker.enabled=true (for Hazelcast embedded, works only when loading config via Config.load) - Add environment variable: HZ_INTEGRITYCHECKER_ENABLED=true (recommended when running container image. For Hazelcast embedded, works only when loading config via Config.load) 2026-01-09 16:57:51,193 INFO [c.h.system ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] The Jet engine is disabled. To enable the Jet engine on the members, do one of the following: - Change member config using Java API: config.getJetConfig().setEnabled(true) - Change XML\u002FYAML configuration property: Set hazelcast.jet.enabled to true - Add system property: -Dhz.jet.enabled=true (for Hazelcast embedded, works only when loading config via Config.load) - Add environment variable: HZ_JET_ENABLED=true (recommended when running container image. For Hazelcast embedded, works only when loading config via Config.load) 2026-01-09 16:57:51,331 INFO [c.h.s.security ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Enable DEBUG\u002FFINE log level for log category com.hazelcast.system.security or use -Dhazelcast.security.recommendations system property to see 🔒 security recommendations and the status of current config. 2026-01-09 16:57:51,392 INFO [o.a.s.e.s.SeaTunnelNodeContext] [main] - Using LiteNodeDropOutTcpIpJoiner TCP\u002FIP discovery 2026-01-09 16:57:51,393 WARN [c.h.c.CPSubsystem ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] CP Subsystem is not enabled. CP data structures will operate in UNSAFE mode! Please note that UNSAFE mode will not provide strong consistency guarantees. 2026-01-09 16:57:51,462 INFO [.c.c.DefaultClassLoaderService] [main] - start classloader service with cache mode 2026-01-09 16:57:51,464 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml' from System property 'seatunnel.config' 2026-01-09 16:57:51,464 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml 2026-01-09 16:57:51,466 INFO [amlSeaTunnelDomConfigProcessor] [main] - Dynamic slot is enabled, the schedule strategy is set to REJECT 2026-01-09 16:57:51,466 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Loading configuration '\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml' from System property 'hazelcast.config' 2026-01-09 16:57:51,466 INFO [c.h.i.c.AbstractConfigLocator ] [main] - Using configuration file at \u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast.yaml 2026-01-09 16:57:51,471 WARN [o.a.s.e.s.TaskExecutionService] [pool-3-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] The Node is not ready yet, Node state STARTING,looking forward to the next scheduling 2026-01-09 16:57:51,471 INFO [o.a.s.e.s.TaskExecutionService] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Created new BusWork : 1257526338 2026-01-09 16:57:51,474 WARN [a.s.e.s.s.s.DefaultSlotService] [hz.main.seaTunnel.slotService.thread] - failed send heartbeat to resource manager, will retry later. this address: [localhost]:5801 2026-01-09 16:57:51,475 INFO [o.a.s.e.s.CoordinatorService ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Start pending job schedule thread 2026-01-09 16:57:51,554 WARN [o.a.h.u.NativeCodeLoader ] [main] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 2026-01-09 16:57:51,607 INFO [o.a.s.e.s.CoordinatorService ] [pool-7-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] *********************************************** CoordinatorService Thread Pool Status *********************************************** activeCount : 1 corePoolSize : 10 maximumPoolSize : 2147483647 poolSize : 1 completedTaskCount : 0 taskCount : 1 *********************************************** 2026-01-09 16:57:51,612 INFO [o.a.s.e.s.JettyService ] [main] - SeaTunnel REST service will start on port 8080 2026-01-09 16:57:51,617 INFO [o.a.s.s.o.e.j.u.log ] [main] - Logging initialized @1069ms to org.apache.seatunnel.shade.org.eclipse.jetty.util.log.Slf4jLog 2026-01-09 16:57:51,643 WARN [a.s.s.o.e.j.s.h.ContextHandler] [main] - Empty contextPath 2026-01-09 16:57:51,652 INFO [o.a.s.s.o.e.j.s.Server ] [main] - jetty-9.4.56.v20240826; built: 2024-08-26T17:15:05.868Z; git: ec6782ff5ead824dabdcf47fa98f90a4aedff401; jvm 1.8.0_342-b07 2026-01-09 16:57:51,665 INFO [o.a.s.s.o.e.j.s.session ] [main] - DefaultSessionIdManager workerName=node0 2026-01-09 16:57:51,665 INFO [o.a.s.s.o.e.j.s.session ] [main] - No SessionScavenger set, using defaults 2026-01-09 16:57:51,666 INFO [o.a.s.s.o.e.j.s.session ] [main] - node0 Scavenging every 660000ms 2026-01-09 16:57:51,727 INFO [a.s.s.o.e.j.s.h.ContextHandler] [main] - Started o.a.s.s.o.e.j.s.ServletContextHandler@7069f076{\u002F,null,AVAILABLE} 2026-01-09 16:57:51,731 INFO [.s.s.o.e.j.s.AbstractConnector] [main] - Started ServerConnector@6e31d989{HTTP\u002F1.1, (http\u002F1.1)}{0.0.0.0:8080} 2026-01-09 16:57:51,732 INFO [o.a.s.s.o.e.j.s.Server ] [main] - Started @1184ms 2026-01-09 16:57:51,747 INFO [c.h.i.d.Diagnostics ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Diagnostics disabled. To enable add -Dhazelcast.diagnostics.enabled=true to the JVM arguments. 2026-01-09 16:57:51,749 INFO [c.h.c.LifecycleService ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is STARTING Members {size:1, ver:1} [ Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node] [active master] this ] 2026-01-09 16:57:52,775 INFO [o.a.s.e.s.CoordinatorService ] [pool-5-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] This node become a new active master node, begin init coordinator service 2026-01-09 16:57:52,779 INFO [c.h.c.LifecycleService ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is STARTED 2026-01-09 16:57:52,797 INFO [o.a.s.e.s.CoordinatorService ] [pool-5-thread-1] - [localhost]:5801 [seatunnel-420804] [5.1] Loaded event handlers: [org.apache.seatunnel.api.event.LoggingEventHandler@1ebbcf65] 2026-01-09 16:57:52,803 INFO [.c.i.s.ClientInvocationService] [main] - hz.client_1 [seatunnel-420804] [5.1] Running with 2 response threads, dynamic=true 2026-01-09 16:57:52,807 INFO [.h.i.p.i.PartitionStateManager] [seatunnel-coordinator-service-1] - [localhost]:5801 [seatunnel-420804] [5.1] Initializing cluster partition table arrangement... 2026-01-09 16:57:52,811 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is STARTING 2026-01-09 16:57:52,811 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is STARTED 2026-01-09 16:57:52,814 INFO [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Trying to connect to cluster: seatunnel-420804 2026-01-09 16:57:52,815 INFO [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Trying to connect to [localhost]:5801 2026-01-09 16:57:52,823 INFO [.p.t.AuthenticationMessageTask] [hz.main.priority-generic-operation.thread-0] - [localhost]:5801 [seatunnel-420804] [5.1] Received auth from Connection[id=1, \u002F127.0.0.1:5801->\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=true, connectionType=JVM, planeIndex=-1], successfully authenticated, clientUuid: 3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, client name: hz.client_1, client version: 5.1 2026-01-09 16:57:52,824 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is CLIENT_CONNECTED 2026-01-09 16:57:52,824 INFO [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Authenticated with server [localhost]:5801:579e9374-7d47-4d91-80d5-c7a9155d42d0, server version: 5.1, local address: \u002F127.0.0.1:45255 2026-01-09 16:57:52,825 INFO [c.h.i.d.Diagnostics ] [main] - hz.client_1 [seatunnel-420804] [5.1] Diagnostics disabled. To enable add -Dhazelcast.diagnostics.enabled=true to the JVM arguments. 2026-01-09 16:57:52,829 INFO [c.h.c.i.s.ClientClusterService] [hz.client_1.event-10] - hz.client_1 [seatunnel-420804] [5.1] Members [1] { Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node] } 2026-01-09 16:57:52,841 INFO [.c.i.s.ClientStatisticsService] [main] - Client statistics is enabled with period 5 seconds. 2026-01-09 16:57:52,858 INFO [o.a.s.c.s.u.ConfigBuilder ] [main] - Loading config file from path: \u002Fconfig\u002Fmy.config 2026-01-09 16:57:52,951 INFO [o.a.s.c.s.u.ConfigShadeUtils ] [main] - Load config shade spi: [base64] 2026-01-09 16:57:52,967 INFO [o.a.s.c.s.u.ConfigBuilder ] [main] - Parsed config file: { \"env\" : { \"parallelism\" : 1, \"job.mode\" : \"BATCH\" }, \"source\" : [ { \"url\" : \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\", \"region\" : \"us-east-1\", \"access_key_id\" : \"\u003CREDACTED>\", \"secret_access_key\" : \"\u003CREDACTED>\", \"table\" : \"mySourceTable\", \"schema\" : { \"fields\" : { \"customerId\" : \"int\", \"customerName\" : \"string\", \"address\" : \"string\" } }, \"plugin_name\" : \"Amazondynamodb\" } ], \"sink\" : [ { \"host\" : \"host.docker.internal\", \"port\" : 6379, \"support_custom_key\" : true, \"key\" : \"customer:{customerId}\", \"data_type\" : \"hash\", \"plugin_name\" : \"Redis\" } ] } 2026-01-09 16:57:52,971 INFO [p.MultipleTableJobConfigParser] [main] - add common jar in plugins :[] 2026-01-09 16:57:52,978 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors 2026-01-09 16:57:52,980 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar] 2026-01-09 16:57:52,980 INFO [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar] 2026-01-09 16:57:52,982 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors 2026-01-09 16:57:52,985 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors 2026-01-09 16:57:52,986 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar] 2026-01-09 16:57:52,986 INFO [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar] 2026-01-09 16:57:52,988 INFO [p.MultipleTableJobConfigParser] [main] - start generating all sources. 2026-01-09 16:57:53,003 INFO [o.a.s.a.t.f.FactoryUtil ] [main] - get the CatalogTable from source AmazonDynamodb: .default.default.default 2026-01-09 16:57:53,008 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSource Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors 2026-01-09 16:57:53,011 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar] 2026-01-09 16:57:53,011 INFO [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='source', pluginName='Amazondynamodb'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar] 2026-01-09 16:57:53,012 INFO [p.MultipleTableJobConfigParser] [main] - start generating all transforms. 2026-01-09 16:57:53,012 INFO [p.MultipleTableJobConfigParser] [main] - start generating all sinks. 2026-01-09 16:57:53,013 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Load SeaTunnelSink Plugin from \u002Fopt\u002Fseatunnel\u002Fconnectors 2026-01-09 16:57:53,014 INFO [.s.p.d.AbstractPluginDiscovery] [main] - Discovery plugin jar for: PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'} at: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar] 2026-01-09 16:57:53,014 INFO [.s.p.d.AbstractPluginDiscovery] [main] - find connector jar and dependency for PluginIdentifier{engineType='seatunnel', pluginType='sink', pluginName='Redis'}: [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar] 2026-01-09 16:57:53,024 INFO [o.a.s.a.t.f.FactoryUtil ] [main] - Create sink 'Redis' with upstream input catalog-table[database: default, schema: default, table: default] 2026-01-09 16:57:53,042 INFO [o.a.s.e.c.j.ClientJobProxy ] [main] - Start submit job, job id: 1062052604328017921, with plugin jar [file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-amazondynamodb-2.3.12.jar, file:\u002Fopt\u002Fseatunnel\u002Fconnectors\u002Fconnector-redis-2.3.12.jar] 2026-01-09 16:57:53,047 INFO [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - Init ResourceManager 2026-01-09 16:57:53,047 INFO [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - initWorker... 2026-01-09 16:57:53,047 INFO [.e.s.r.AbstractResourceManager] [hz.main.client.thread-4] - init live nodes: [[localhost]:5801] 2026-01-09 16:57:53,048 INFO [.e.s.r.AbstractResourceManager] [SeaTunnel-CompletableFuture-Thread-2] - received new worker register: [localhost]:5801 2026-01-09 16:57:53,152 INFO [o.a.s.c.s.r.c.RedisParameters ] [hz.main.seaTunnel.task.thread-4] - Try to get redis version information from the jedis.info() method 2026-01-09 16:57:53,152 INFO [o.a.s.c.s.r.c.RedisParameters ] [hz.main.seaTunnel.task.thread-4] - The version of Redis is :8.4.0 2026-01-09 16:57:53,154 INFO [a.s.a.s.m.MultiTableSinkWriter] [hz.main.seaTunnel.task.thread-4] - init multi table sink writer, queue size: 1 2026-01-09 16:57:53,233 INFO [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-12] - log event: ReaderOpenEvent(createdTime=1767977873233, jobId=1062052604328017921, eventType=LIFECYCLE_READER_OPEN) 2026-01-09 16:57:53,402 INFO [.s.t.SourceSplitEnumeratorTask] [hz.main.seaTunnel.task.thread-4] - received reader register, readerID: TaskLocation{taskGroupLocation=TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}, taskID=1000200000000, index=0} 2026-01-09 16:57:53,429 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-9] - checkpoint is disabled, because in batch mode and 'checkpoint.interval' of env is missing. 2026-01-09 16:57:53,506 INFO [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits 2026-01-09 16:57:53,506 INFO [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits 2026-01-09 16:57:53,529 INFO [.s.t.SourceSplitEnumeratorTask] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - received enough reader, starting enumerator... 2026-01-09 16:57:53,530 INFO [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assigning org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@36fe5b1d to 0 reader. 2026-01-09 16:57:53,530 INFO [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assigning org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@81bd425 to 0 reader. 2026-01-09 16:57:53,530 INFO [nDynamoDBSourceSplitEnumerator] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - Assign splits [org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@36fe5b1d, org.apache.seatunnel.connectors.seatunnel.amazondynamodb.source.AmazonDynamoDBSourceSplit@81bd425] to reader 0 2026-01-09 16:57:53,533 INFO [a.s.AmazonDynamoDBSourceReader] [hz.main.generic-operation.thread-21] - Reader [0] received noMoreSplit event. 2026-01-09 16:57:53,934 INFO [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - AmazonDynamoDB Source Reader [0] waiting for splits 2026-01-09 16:57:53,934 INFO [a.s.AmazonDynamoDBSourceReader] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - Closed the bounded amazonDynamodb source 2026-01-09 16:57:53,941 INFO [.s.e.s.c.CheckpointCoordinator] [hz.main.generic-operation.thread-23] - skip schedule trigger checkpoint because checkpoint type is COMPLETED_POINT_TYPE 2026-01-09 16:57:53,943 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - wait checkpoint completed: 9223372036854775807 2026-01-09 16:57:55,974 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - pending checkpoint(9223372036854775807\u002F1@1062052604328017921) notify finished! 2026-01-09 16:57:55,974 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - start notify checkpoint completed, job id: 1062052604328017921, pipeline id: 1, checkpoint id:9223372036854775807 2026-01-09 16:57:55,979 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - start clean pending checkpoint cause CheckpointCoordinator completed. 2026-01-09 16:57:55,979 INFO [.s.e.s.c.CheckpointCoordinator] [seatunnel-coordinator-service-8] - Turn checkpoint_state_1062052604328017921_1 state from null to FINISHED 2026-01-09 16:57:55,987 INFO [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000100000000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1} 2026-01-09 16:57:55,987 INFO [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-32] - log event: EnumeratorCloseEvent(createdTime=1767977875987, jobId=1062052604328017921, eventType=LIFECYCLE_ENUMERATOR_CLOSE) 2026-01-09 16:57:55,998 INFO [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] - [localhost]:5801 [seatunnel-420804] [5.1] taskGroup TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1} complete with FINISHED 2026-01-09 16:57:55,998 INFO [o.a.s.e.s.TaskExecutionService] [hz.main.seaTunnel.task.thread-5] - [localhost]:5801 [seatunnel-420804] [5.1] Task TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1} complete with state FINISHED 2026-01-09 16:57:55,998 INFO [o.a.s.e.s.CoordinatorService ] [hz.main.seaTunnel.task.thread-5] - [localhost]:5801 [seatunnel-420804] [5.1] Received task end from execution TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}, state FINISHED 2026-01-09 16:57:56,000 INFO [o.a.s.e.s.d.p.PhysicalVertex ] [hz.main.seaTunnel.task.thread-5] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] turned from state RUNNING to FINISHED. 2026-01-09 16:57:56,000 INFO [o.a.s.e.s.d.p.PhysicalVertex ] [hz.main.seaTunnel.task.thread-5] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] state process is stopped 2026-01-09 16:57:56,000 INFO [o.a.s.e.s.d.p.SubPlan ] [seatunnel-coordinator-service-8] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SplitEnumerator (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=1}] future complete with state FINISHED 2026-01-09 16:57:56,039 INFO [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-33] - log event: ReaderCloseEvent(createdTime=1767977876039, jobId=1062052604328017921, eventType=LIFECYCLE_READER_CLOSE) 2026-01-09 16:57:56,040 INFO [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000200000000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} 2026-01-09 16:57:56,076 INFO [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskDone, taskId = 1000200010000, taskGroup = TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} 2026-01-09 16:57:56,077 INFO [o.a.s.a.e.LoggingEventHandler ] [hz.main.generic-operation.thread-34] - log event: WriterCloseEvent(createdTime=1767977876076, jobId=1062052604328017921, eventType=LIFECYCLE_WRITER_CLOSE) 2026-01-09 16:57:56,079 INFO [o.a.s.e.s.TaskExecutionService] [BlockingWorker-TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] - [localhost]:5801 [seatunnel-420804] [5.1] taskGroup TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} complete with FINISHED 2026-01-09 16:57:56,079 INFO [o.a.s.e.s.TaskExecutionService] [hz.main.seaTunnel.task.thread-2] - [localhost]:5801 [seatunnel-420804] [5.1] Task TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} complete with state FINISHED 2026-01-09 16:57:56,079 INFO [o.a.s.e.s.CoordinatorService ] [hz.main.seaTunnel.task.thread-2] - [localhost]:5801 [seatunnel-420804] [5.1] Received task end from execution TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}, state FINISHED 2026-01-09 16:57:56,080 INFO [o.a.s.e.s.d.p.PhysicalVertex ] [hz.main.seaTunnel.task.thread-2] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] turned from state RUNNING to FINISHED. 2026-01-09 16:57:56,080 INFO [o.a.s.e.s.d.p.PhysicalVertex ] [hz.main.seaTunnel.task.thread-2] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] state process is stopped 2026-01-09 16:57:56,080 INFO [o.a.s.e.s.d.p.SubPlan ] [seatunnel-coordinator-service-8] - Job (1062052604328017921), Pipeline: [(1\u002F1)], task: [pipeline-1 [Source[0]-Amazondynamodb]-SourceTask (1\u002F1)], taskGroupLocation: [TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2}] future complete with state FINISHED 2026-01-09 16:57:56,080 INFO [o.a.s.e.s.d.p.SubPlan ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] will end with state FINISHED 2026-01-09 16:57:56,081 INFO [o.a.s.e.s.m.JobMaster ] [hz.main.seaTunnel.task.thread-2] - release the task group resource TaskGroupLocation{jobId=1062052604328017921, pipelineId=1, taskGroupId=2} 2026-01-09 16:57:56,081 INFO [o.a.s.e.s.d.p.SubPlan ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] turned from state RUNNING to FINISHED. 2026-01-09 16:57:56,081 INFO [a.s.e.s.s.s.DefaultSlotService] [hz.main.generic-operation.thread-35] - received slot release request, jobID: 1062052604328017921, slot: SlotProfile{worker=[localhost]:5801, slotID=2, ownerJobID=1062052604328017921, assigned=true, resourceProfile=ResourceProfile{cpu=CPU{core=0}, heapMemory=Memory{bytes=0}}, sequence='e992c180-0d29-42db-ac3f-249a1130c0b1'} 2026-01-09 16:57:56,105 INFO [o.a.s.e.s.m.JobMaster ] [seatunnel-coordinator-service-8] - release the pipeline Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] resource 2026-01-09 16:57:56,105 INFO [a.s.e.s.s.s.DefaultSlotService] [hz.main.generic-operation.thread-39] - received slot release request, jobID: 1062052604328017921, slot: SlotProfile{worker=[localhost]:5801, slotID=1, ownerJobID=1062052604328017921, assigned=true, resourceProfile=ResourceProfile{cpu=CPU{core=0}, heapMemory=Memory{bytes=0}}, sequence='e992c180-0d29-42db-ac3f-249a1130c0b1'} 2026-01-09 16:57:56,106 INFO [o.a.s.e.s.d.p.SubPlan ] [seatunnel-coordinator-service-8] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] state process is stop 2026-01-09 16:57:56,106 INFO [o.a.s.e.s.d.p.PhysicalPlan ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921), Pipeline: [(1\u002F1)] future complete with state FINISHED 2026-01-09 16:57:56,107 INFO [o.a.s.e.s.d.p.PhysicalPlan ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921) turned from state RUNNING to FINISHED. 2026-01-09 16:57:56,107 INFO [o.a.s.e.s.d.p.PhysicalPlan ] [seatunnel-coordinator-service-7] - Job SeaTunnel_Job (1062052604328017921) state process is stop 2026-01-09 16:57:56,116 INFO [o.a.s.a.e.LoggingEventHandler ] [seatunnel-coordinator-service-7] - log event: JobStateEvent(jobId=1062052604328017921, jobName=SeaTunnel_Job, jobStatus=FINISHED, createdTime=1767977876116) 2026-01-09 16:57:56,117 INFO [o.a.s.e.c.j.ClientJobProxy ] [main] - Job (1062052604328017921) end with state FINISHED 2026-01-09 16:57:56,132 INFO [s.c.s.s.c.ClientExecuteCommand] [main] - *********************************************** Job Statistic Information *********************************************** Start Time : 2026-01-09 16:57:52 End Time : 2026-01-09 16:57:56 Total Time(s) : 3 Total Read Count : 2 Total Write Count : 2 Total Failed Count : 0 *********************************************** 2026-01-09 16:57:56,133 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is SHUTTING_DOWN 2026-01-09 16:57:56,135 INFO [c.h.i.s.t.TcpServerConnection ] [hz.main.IO.thread-in-1] - [localhost]:5801 [seatunnel-420804] [5.1] Connection[id=1, \u002F127.0.0.1:5801->\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=false, connectionType=JVM, planeIndex=-1] closed. Reason: Connection closed by the other side 2026-01-09 16:57:56,135 INFO [.c.i.c.ClientConnectionManager] [main] - hz.client_1 [seatunnel-420804] [5.1] Removed connection to endpoint: [localhost]:5801:579e9374-7d47-4d91-80d5-c7a9155d42d0, connection: ClientConnection{alive=false, connectionId=1, channel=NioChannel{\u002F127.0.0.1:45255->localhost\u002F127.0.0.1:5801}, remoteAddress=[localhost]:5801, lastReadTime=2026-01-09 16:57:56.131, lastWriteTime=2026-01-09 16:57:56.117, closedTime=2026-01-09 16:57:56.134, connected server version=5.1} 2026-01-09 16:57:56,135 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is CLIENT_DISCONNECTED 2026-01-09 16:57:56,136 INFO [c.h.c.i.ClientEndpointManager ] [hz.main.event-1] - [localhost]:5801 [seatunnel-420804] [5.1] Destroying ClientEndpoint{connection=Connection[id=1, \u002F127.0.0.1:5801->\u002F127.0.0.1:45255, qualifier=null, endpoint=[127.0.0.1]:45255, remoteUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, alive=false, connectionType=JVM, planeIndex=-1], clientUuid=3be41dca-f0e7-4603-ad27-4e5b3aecbb4a, clientName=hz.client_1, authenticated=true, clientVersion=5.1, creationTime=1767977872821, latest clientAttributes=lastStatisticsCollectionTime=1767977872841,enterprise=false,clientType=JVM,clientVersion=5.1,clusterConnectionTimestamp=1767977872816,clientAddress=127.0.0.1,clientName=hz.client_1,credentials.principal=null,os.committedVirtualMemorySize=9714790400,os.freePhysicalMemorySize=2077376512,os.freeSwapSpaceSize=1073737728,os.maxFileDescriptorCount=1048576,os.openFileDescriptorCount=103,os.processCpuTime=4280000000,os.systemLoadAverage=3.26,os.totalPhysicalMemorySize=8321540096,os.totalSwapSpaceSize=1073737728,runtime.availableProcessors=14,runtime.freeMemory=286196824,runtime.maxMemory=477626368,runtime.totalMemory=376438784,runtime.uptime=2297,runtime.usedMemory=90241960, labels=[]} 2026-01-09 16:57:56,136 INFO [c.h.c.LifecycleService ] [main] - hz.client_1 [seatunnel-420804] [5.1] HazelcastClient 5.1 (20220228 - 21f20e7) is SHUTDOWN 2026-01-09 16:57:56,136 INFO [s.c.s.s.c.ClientExecuteCommand] [main] - Closed SeaTunnel client...... 2026-01-09 16:57:56,136 INFO [c.h.c.LifecycleService ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is SHUTTING_DOWN 2026-01-09 16:57:56,138 INFO [c.h.i.p.i.MigrationManager ] [hz.main.cached.thread-15] - [localhost]:5801 [seatunnel-420804] [5.1] Shutdown request of Member [localhost]:5801 - 579e9374-7d47-4d91-80d5-c7a9155d42d0 [master node] [active master] this is handled 2026-01-09 16:57:56,141 INFO [c.h.i.i.Node ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Shutting down connection manager... 2026-01-09 16:57:56,142 INFO [c.h.i.i.Node ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Shutting down node engine... 2026-01-09 16:57:56,149 INFO [.s.s.o.e.j.s.AbstractConnector] [main] - Stopped ServerConnector@6e31d989{HTTP\u002F1.1, (http\u002F1.1)}{0.0.0.0:8080} 2026-01-09 16:57:56,149 INFO [o.a.s.s.o.e.j.s.session ] [main] - node0 Stopped scavenging 2026-01-09 16:57:56,150 INFO [a.s.s.o.e.j.s.h.ContextHandler] [main] - Stopped o.a.s.s.o.e.j.s.ServletContextHandler@7069f076{\u002F,null,STOPPED} 2026-01-09 16:57:56,151 INFO [.c.c.DefaultClassLoaderService] [main] - close classloader service 2026-01-09 16:57:56,152 INFO [o.a.s.e.s.EventService ] [event-forwarder-0] - Event forward thread interrupted 2026-01-09 16:57:56,155 INFO [c.h.i.i.NodeExtension ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Destroying node NodeExtension. 2026-01-09 16:57:56,156 INFO [c.h.i.i.Node ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] Hazelcast Shutdown is completed in 18 ms. 2026-01-09 16:57:56,156 INFO [c.h.c.LifecycleService ] [main] - [localhost]:5801 [seatunnel-420804] [5.1] [localhost]:5801 is SHUTDOWN 2026-01-09 16:57:56,156 INFO [s.c.s.s.c.ClientExecuteCommand] [main] - Closed HazelcastInstance ...... 2026-01-09 16:57:56,156 INFO [s.c.s.s.c.ClientExecuteCommand] [main] - Closed metrics executor service ...... 2026-01-09 16:57:56,156 INFO [s.c.s.s.c.ClientExecuteCommand] [SeaTunnel-CompletableFuture-Thread-7] - run shutdown hook because get close signal 任务执行完成后，用于执行它的 Docker 容器会被终止，此时你就能在 Redis 中看到写入的数据记录了。 正如 SeaTunnel 官方所说，整个过程简单到只需写一个配置文件。当然，要真正吃透 source 和 sink 连接器提供的众多配置项，可能还需要花些时间。你可以点击此处查看 Amazon DynamoDB 的配置属性，点击此处查看 Redis 的配置属性。 方案二：生产级引擎（集群模式） 当你需要一套常驻在线的数据管道基础设施，能够处理多个任务、按需扩容，并提供 REST API 访问时，集群模式就是你的选择。 第一步：搭建基础设施 创建一个 docker-compose.yaml，拉起一个完整的 SeaTunnel 集群。它同时也会带上 Redis——在这个用例里，Redis 是数据管道的目标端（sink）。 version: '3.8' services: seatunnel-master: image: apache\u002Fseatunnel:2.3.12 container_name: seatunnel-master environment: - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5 volumes: - .\u002Fconfig\u002Fhazelcast-master.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-master.yaml - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml entrypoint: > \u002Fbin\u002Fsh -c \" \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r master \" ports: - \"5801:5801\" - \"8080:8080\" # REST API 端点 networks: seatunnel_network: ipv4_address: 172.16.0.3 healthcheck: test: [ \"CMD-SHELL\", \"curl -f http:\u002F\u002Flocalhost:8080\u002Fsystem-monitoring-information || exit 1\" ] interval: 30s timeout: 10s retries: 10 start_period: 60s seatunnel-worker1: image: apache\u002Fseatunnel:2.3.12 container_name: seatunnel-worker1 environment: - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5 volumes: - .\u002Fconfig\u002Fhazelcast-worker.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-worker.yaml - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml entrypoint: > \u002Fbin\u002Fsh -c \" \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r worker \" depends_on: - seatunnel-master networks: seatunnel_network: ipv4_address: 172.16.0.4 healthcheck: test: [\"CMD-SHELL\", \"pgrep -f seatunnel || exit 1\"] interval: 30s timeout: 10s retries: 5 start_period: 45s seatunnel-worker2: image: apache\u002Fseatunnel:2.3.12 container_name: seatunnel-worker2 environment: - ST_DOCKER_MEMBER_LIST=172.16.0.3,172.16.0.4,172.16.0.5 volumes: - .\u002Fconfig\u002Fhazelcast-worker.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fhazelcast-worker.yaml - .\u002Fconfig\u002Fseatunnel.yaml:\u002Fopt\u002Fseatunnel\u002Fconfig\u002Fseatunnel.yaml entrypoint: > \u002Fbin\u002Fsh -c \" \u002Fopt\u002Fseatunnel\u002Fbin\u002Fseatunnel-cluster.sh -r worker \" depends_on: - seatunnel-master networks: seatunnel_network: ipv4_address: 172.16.0.5 healthcheck: test: [\"CMD-SHELL\", \"pgrep -f seatunnel || exit 1\"] interval: 30s timeout: 10s retries: 5 start_period: 45s redis-database: container_name: redis-database hostname: redis-database image: redis:8.4.0 ports: - \"6379:6379\" networks: seatunnel_network: ipv4_address: 172.16.0.2 healthcheck: test: [ \"CMD-SHELL\", \"redis-cli ping | grep PONG\" ] interval: 10s retries: 5 start_period: 5s timeout: 5s networks: seatunnel_network: driver: bridge ipam: config: - subnet: 172.16.0.0\u002F24 第二步：配置集群 创建 config\u002Fseatunnel.yaml 以启用 REST API： seatunnel: engine: http: enable-http: true port: 8080 创建 config\u002Fhazelcast-master.yaml 和 config\u002Fhazelcast-worker.yaml： hazelcast: network: rest-api: enabled: true endpoint-groups: CLUSTER_READ: enabled: true CLUSTER_WRITE: enabled: true HEALTH_CHECK: enabled: true DATA: enabled: true port: auto-increment: true port-count: 100 port: 5801 join: tcp-ip: enabled: true member-list: - 172.16.0.3 - 172.16.0.4 - 172.16.0.5 第三步：启动集群 docker compose up -d 现在你的 SeaTunnel 集群已运行，包含： 1 个 Master 节点（协调器 + API 服务器） 2 个 Worker 节点（实际执行数据管道） Redis 数据库（你的 sink 和目标系统） 第四步：通过 REST API 提交任务 接下来是见证奇迹的时刻！用一条简单的 HTTP POST 提交任务： curl -X POST http:\u002F\u002Flocalhost:8080\u002Fsubmit-job?jobName=dynamodb-to-redis \\ -H \"Content-Type: application\u002Fjson\" \\ -d '{ \"env\": { \"parallelism\": 2, \"job.mode\": \"BATCH\" }, \"source\": [ { \"plugin_name\": \"Amazondynamodb\", \"plugin_output\": \"dynamodb_source\", \"url\": \"http:\u002F\u002Fdynamodb.us-east-1.amazonaws.com\", \"region\": \"us-east-1\", \"access_key_id\": \"YOUR_ACCESS_KEY\", \"secret_access_key\": \"YOUR_SECRET_KEY\", \"table\": \"mySourceTable\", \"schema\": { \"fields\": { \"customerId\": \"int\", \"customerName\": \"string\", \"address\": \"string\" } } } ], \"transform\": [], \"sink\": [ { \"plugin_name\": \"Redis\", \"host\": \"redis-database\", \"port\": 6379, \"support_custom_key\": true, \"key\": \"customer:{customerId}\", \"data_type\": \"hash\" } ] }' 任务一旦提交，就会立刻开始执行。你可以在 SeaTunnel 提供的 Web 控制台里跟进任务执行情况：访问 http:\u002F\u002Flocalhost:8080\u002F#\u002Foverview，然后切换到 Jobs 标签页。 总结 有了 Apache SeaTunnel，把数据从 Amazon DynamoDB 同步到 Redis 就变成了一件\"配置\"层面的工作。无论你需要一次性迁移，还是一套常驻在线的数据集成管道，Apache SeaTunnel 都有满足你需求的工具。 使用 SeaTunnel 的妙处在于： 无需维护代码——只需简单配置即可使用 久经实战检验的连接器——专注于你的业务逻辑 部署灵活——无论是笔记本还是生产集群都能跑 天生可扩展——可随数据增长横向扩容 准备好试一试了吗？建议先用单机模式快速实验一下，等要上生产时再升级到集群模式。 本地模式部署：https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Flocally\u002Fdeployment Docker 部署：https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fdocker\u002F kubernetes 部署：https:\u002F\u002Fseatunnel.apache.org\u002Fdocs\u002F2.3.13\u002Fgetting-started\u002Fkubernetes\u002F",36626,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":16,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":38},"#2563eb","16 \u002F 10",[7,8],{"targetType":8,"targetId":9,"likedByMe":40,"likeCount":41,"commentCount":41,"contentLikeCount":41,"contentCommentCount":41,"sourceLikeCount":41,"sourceCommentCount":41},false,0,[43,52,58,65,73,80,86,93],{"id":44,"kind":7,"title":45,"summary":46,"image":47,"href":48,"meta":49,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":50},"NEWS_ARTICLE:827","MHS 三部曲（下）：谁允许 AI 行动？——权力、合规与中国厂商的答卷","我们总在等待一个像 ChatGPT 那样的机器人时刻。但具身智能真正的拐点，也许先发生在更不起眼的地方：一台陌生设备，第一次能把自己的能力、状态和边界完整告诉 AI；一个 Agent，第一次能把试出来的经验固化成可验证、可复用的机器技能。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202608\u002F510-20260830153745229-1536981088.jpg","\u002Fnews\u002F827","2026 · 人工智能",[51],"人工智能",{"id":53,"kind":7,"title":54,"summary":55,"image":15,"href":56,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":57},"NEWS_ARTICLE:829","我不会美工，用 WorkBuddy 1 分钟做出 4 张海报","先说结果：下面这 4 张海报，从我发出指令到拿到图片，大约 1 分钟。 我不会美工，也没有打开 Photoshop。用的工具，是我之前用 WorkBuddy 做的一个海报生成器。这个生成器本身也没花几分钟，具体开发过程我在上一篇文章里写过。 这次我把海报生成器的网址、产品截图和要求一起发给 Work","\u002Fnews\u002F829",[7,8],{"id":59,"kind":7,"title":60,"summary":61,"image":62,"href":63,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":64},"NEWS_ARTICLE:828","一个人抵一个团队的时代，企业级 AI Agent 还需要做什么？","对于企业而言，真正需要的，不是一个“会聊天”的 Agent，而是一套能被多用户、多场景复用，且权限清晰、过程可审计、成本可控制的 Agent 能力体系。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F2232255\u002F202609\u002F2232255-20260902173524728-659996478.png","\u002Fnews\u002F828",[7,8],{"id":66,"kind":7,"title":67,"summary":68,"image":15,"href":69,"meta":70,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":71},"NEWS_ARTICLE:832","用 runtime-async 写一个支持 async\u002Fawait 的轻量脚本引擎","起因：一个好奇 事情的开头很简单。 给 .NET 做过动态脚本的人大概都碰到过同一堵墙：表达式树也好、Reflection.Emit 也好，都很难支持 async\u002Fawait。原因不在语法，而在 await 的实现方式——C# 编译器要为每个 async 方法生成一个状态机结构体，把方法体切成若干片","\u002Fnews\u002F832","2026 · 软件开发",[72],"软件开发",{"id":74,"kind":7,"title":75,"summary":76,"image":77,"href":78,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":79},"NEWS_ARTICLE:831","Agent Sandbox 规模化：JuiceFS 探索与实践","过去一段时间，我们在和云厂商以及 Agent 团队推进 Sandbox 落地时，除了要解决数据如何进入 Sandbox，还需要考虑任务所需的数据和执行过程中产生的数据，如何跨任务、跨阶段持续使用。Sandbox 可以随任务快速创建和销毁，但数据往往需要继续保留、共享和流转。 当 Sandbox 并发","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F2544292\u002F202609\u002F2544292-20260902171045357-1907499098.png","\u002Fnews\u002F831",[7,8],{"id":81,"kind":7,"title":82,"summary":83,"image":15,"href":84,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":85},"NEWS_ARTICLE:830","百智云长期记忆服务：长期记忆与上下文窗口的区别","很多人在接触 AI 长期记忆时，第一反应是：「这不就是把聊天记录存起来吗？」其实这是一个很常见的误解。今天我们把「长期记忆」和「上下文窗口」这两个概念彻底讲清楚。 一、什么是上下文窗口 上下文窗口（Context Window）是模型在单次推理时能「看到」的文本上限。它像一个临时的工作台：模型只能处","\u002Fnews\u002F830",[7,8],{"id":87,"kind":7,"title":88,"summary":89,"image":90,"href":91,"meta":49,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":92},"NEWS_ARTICLE:835","体验向量数据库 qdrant","作者:张富春(ahfuzhang)，转载时请注明作者和引用链接，谢谢！ cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 背景 为了早点搞懂公司的百万行 C# 的祖传代码，我想在缺乏文档、缺乏帮手的情况下，先建立一个 企业知识库 来快速帮我理清头绪。 一开始，我是打算以 weav","https:\u002F\u002Fimg2022.cnblogs.com\u002Fblog\u002F1457949\u002F202202\u002F1457949-20220216153819145-1193738712.png","\u002Fnews\u002F835",[51],{"id":94,"kind":7,"title":95,"summary":96,"image":15,"href":97,"meta":18,"badge":10,"author":12,"stats":-1,"accent":36,"coverRatio":37,"tags":98},"NEWS_ARTICLE:833","如何利用AI技术实现漫画翻译","漫画作为图文结合的特色文化载体，承载着各国潮流文化与人文故事，但跨语言的文字壁垒，长期制约着漫画的传播与交流。传统漫画翻译高度依赖人工操作，需要人工框选文字、擦除原图文字、翻译文案、排版适配画风，流程繁琐、耗时费力，且极易出现排版错乱、画风违和、语义偏差等问题。 随着深度学习、计算机视觉与大模型技术","\u002Fnews\u002F833",[7,8]]